@annalib/anna-core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/annalib-anna-core.d.ts +5 -0
- package/esm2020/annalib-anna-core.mjs +5 -0
- package/esm2020/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +59 -0
- package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -0
- package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -0
- package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
- package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +15 -0
- package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +21 -0
- package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -0
- package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +34 -0
- package/esm2020/lib/anna-core-shared-lib/index.mjs +2 -0
- package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +2 -0
- package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +2 -0
- package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +3 -0
- package/esm2020/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +26 -0
- package/esm2020/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +31 -0
- package/esm2020/lib/anna-core-shared-lib/public-api.mjs +25 -0
- package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +180 -0
- package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +537 -0
- package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +52 -0
- package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +133 -0
- package/esm2020/lib/anna-core-shared-lib/services/anna-sort.service.mjs +185 -0
- package/esm2020/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +43 -0
- package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +76 -0
- package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +360 -0
- package/esm2020/lib/anna-dropdown-lib/index.mjs +2 -0
- package/esm2020/lib/anna-dropdown-lib/public-api.mjs +6 -0
- package/esm2020/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +86 -0
- package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +991 -0
- package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +125 -0
- package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
- package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +189 -0
- package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +2 -0
- package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +178 -0
- package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +2 -0
- package/esm2020/lib/anna-generic-table-lib/index.mjs +2 -0
- package/esm2020/lib/anna-generic-table-lib/public-api.mjs +10 -0
- package/esm2020/public-api.mjs +7 -0
- package/esm2020/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +59 -0
- package/esm2020/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +5 -0
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -0
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -0
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +15 -0
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +21 -0
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -0
- package/esm2020/src/lib/anna-core-shared-lib/constants/shared.constant.mjs +34 -0
- package/esm2020/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +2 -0
- package/esm2020/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +2 -0
- package/esm2020/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +3 -0
- package/esm2020/src/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +26 -0
- package/esm2020/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +31 -0
- package/esm2020/src/lib/anna-core-shared-lib/public-api.mjs +25 -0
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +180 -0
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-filter.service.mjs +537 -0
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +52 -0
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +133 -0
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-sort.service.mjs +185 -0
- package/esm2020/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +43 -0
- package/esm2020/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +5 -0
- package/esm2020/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +76 -0
- package/esm2020/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +360 -0
- package/esm2020/src/lib/anna-dropdown-lib/public-api.mjs +6 -0
- package/esm2020/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +86 -0
- package/esm2020/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +5 -0
- package/esm2020/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +991 -0
- package/esm2020/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +125 -0
- package/esm2020/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
- package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +189 -0
- package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +2 -0
- package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +178 -0
- package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +2 -0
- package/esm2020/src/lib/anna-generic-table-lib/public-api.mjs +10 -0
- package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +1295 -0
- package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +1 -0
- package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +474 -0
- package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +1 -0
- package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +1887 -0
- package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +1 -0
- package/fesm2015/annalib-anna-core.mjs +3630 -0
- package/fesm2015/annalib-anna-core.mjs.map +1 -0
- package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +1295 -0
- package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +1 -0
- package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +472 -0
- package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +1 -0
- package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +1886 -0
- package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +1 -0
- package/fesm2020/annalib-anna-core.mjs +3627 -0
- package/fesm2020/annalib-anna-core.mjs.map +1 -0
- package/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +14 -0
- package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -0
- package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -0
- package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -0
- package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -0
- package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +11 -0
- package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -0
- package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +32 -0
- package/lib/anna-core-shared-lib/index.d.ts +1 -0
- package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +8 -0
- package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +95 -0
- package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +70 -0
- package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +21 -0
- package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -0
- package/lib/anna-core-shared-lib/public-api.d.ts +18 -0
- package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +25 -0
- package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +68 -0
- package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +14 -0
- package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -0
- package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +23 -0
- package/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +11 -0
- package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +29 -0
- package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +67 -0
- package/lib/anna-dropdown-lib/index.d.ts +1 -0
- package/lib/anna-dropdown-lib/public-api.d.ts +3 -0
- package/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +21 -0
- package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +171 -0
- package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +27 -0
- package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -0
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -0
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -0
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -0
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -0
- package/lib/anna-generic-table-lib/index.d.ts +1 -0
- package/lib/anna-generic-table-lib/public-api.d.ts +6 -0
- package/package.json +61 -0
- package/public-api.d.ts +3 -0
- package/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +14 -0
- package/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.d.ts +5 -0
- package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -0
- package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -0
- package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -0
- package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -0
- package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +11 -0
- package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -0
- package/src/lib/anna-core-shared-lib/constants/shared.constant.d.ts +32 -0
- package/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +8 -0
- package/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +95 -0
- package/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +70 -0
- package/src/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +21 -0
- package/src/lib/anna-core-shared-lib/package.json +10 -0
- package/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -0
- package/src/lib/anna-core-shared-lib/public-api.d.ts +18 -0
- package/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +25 -0
- package/src/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +68 -0
- package/src/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +14 -0
- package/src/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -0
- package/src/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +23 -0
- package/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +11 -0
- package/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.d.ts +5 -0
- package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +29 -0
- package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +67 -0
- package/src/lib/anna-dropdown-lib/package.json +10 -0
- package/src/lib/anna-dropdown-lib/public-api.d.ts +3 -0
- package/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +21 -0
- package/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.d.ts +5 -0
- package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +171 -0
- package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +27 -0
- package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -0
- package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -0
- package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -0
- package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -0
- package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -0
- package/src/lib/anna-generic-table-lib/package.json +10 -0
- package/src/lib/anna-generic-table-lib/public-api.d.ts +6 -0
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
// Third party import statements
|
|
3
|
+
import { min, max, map, sortBy, uniq, cloneDeep, isEqual } from "lodash-es";
|
|
4
|
+
import moment from "moment";
|
|
5
|
+
// User defined import statements
|
|
6
|
+
import { AllSelectedStatus, tooltipModelForColumnLevelFiltering } from "../models/anna-tooltip.model";
|
|
7
|
+
import { AnnaDateTimeFormatService } from './anna-date-time-format.service';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "./anna-date-time-format.service";
|
|
10
|
+
export class AnnaFilterService {
|
|
11
|
+
constructor(dateTimeFormatService) {
|
|
12
|
+
this.dateTimeFormatService = dateTimeFormatService;
|
|
13
|
+
this.tooltipMap = new Map();
|
|
14
|
+
this.tooltipSelectedMap = new Map();
|
|
15
|
+
this.appliedFiltersArray = [];
|
|
16
|
+
this.percentTranslateFunction = (data) => {
|
|
17
|
+
const val = data.toFixed(1) + "%";
|
|
18
|
+
return val;
|
|
19
|
+
};
|
|
20
|
+
this.currencyTranslateFunction = (data) => {
|
|
21
|
+
if (data >= 1000) {
|
|
22
|
+
const val = (data / 1000).toFixed(1) + "k";
|
|
23
|
+
return "$" + val;
|
|
24
|
+
}
|
|
25
|
+
else if (data != Math.floor(data)) {
|
|
26
|
+
return data.toFixed(1).toString();
|
|
27
|
+
}
|
|
28
|
+
return "$" + data;
|
|
29
|
+
};
|
|
30
|
+
this.normalTranslateFunction = (data) => {
|
|
31
|
+
if (data >= 1000) {
|
|
32
|
+
const val = (data / 1000).toFixed(1) + "k";
|
|
33
|
+
return val;
|
|
34
|
+
}
|
|
35
|
+
else if (data != Math.floor(data)) {
|
|
36
|
+
return data.toFixed(1).toString();
|
|
37
|
+
}
|
|
38
|
+
return data.toString();
|
|
39
|
+
};
|
|
40
|
+
console.log("AnnaFilterService service created.");
|
|
41
|
+
const sliderArr = [
|
|
42
|
+
"rcvPreempt",
|
|
43
|
+
"osPreempt",
|
|
44
|
+
"rcvUnderDly",
|
|
45
|
+
"postedAudPercent",
|
|
46
|
+
"booked",
|
|
47
|
+
"spots",
|
|
48
|
+
"grp",
|
|
49
|
+
"cpp",
|
|
50
|
+
"imps",
|
|
51
|
+
"cpm",
|
|
52
|
+
"osUnderDly",
|
|
53
|
+
"totalWeeks",
|
|
54
|
+
"WeekNumber",
|
|
55
|
+
"Rate",
|
|
56
|
+
"OrderedRatingsOrImpressions",
|
|
57
|
+
"PostedRatingsOrImpressions", ,
|
|
58
|
+
"postedAudPercent",
|
|
59
|
+
"postedAdu",
|
|
60
|
+
"scheduledAdu",
|
|
61
|
+
"audienceDeficit",
|
|
62
|
+
"offeredMGs",
|
|
63
|
+
"outstandingPE",
|
|
64
|
+
"offeredADUs",
|
|
65
|
+
"udDeficitValue",
|
|
66
|
+
"bookedValue",
|
|
67
|
+
"bookedSpots",
|
|
68
|
+
"userChanges"
|
|
69
|
+
];
|
|
70
|
+
const calendarArr = ["period", "AirDate", "flightStartDate", "flightEndDate", "date"];
|
|
71
|
+
const timeArr = ["StartTimeForFilter", "EndTimeForFilter",
|
|
72
|
+
"start_time_for_filter", "end_time_for_filter", "startEndTimeMulti"];
|
|
73
|
+
this.sliderSet = new Set(sliderArr);
|
|
74
|
+
this.calendarSet = new Set(calendarArr);
|
|
75
|
+
this.timeSet = new Set(timeArr);
|
|
76
|
+
}
|
|
77
|
+
returnMaxAndMinValue(data, key, isMin) {
|
|
78
|
+
data = data.filter((obj) => !["", "-", null].includes(obj[key]));
|
|
79
|
+
const values = data.map((x) => x[key]);
|
|
80
|
+
let valueToReturn = isMin ? min(values) : max(values);
|
|
81
|
+
return valueToReturn;
|
|
82
|
+
}
|
|
83
|
+
returnMinAndMaxDate(data, key) {
|
|
84
|
+
data = data.filter((obj) => !["", "-", null].includes(obj[key]));
|
|
85
|
+
let DateArr = data.map((obj) => moment(obj[key]));
|
|
86
|
+
let minDate = moment.min(DateArr);
|
|
87
|
+
let maxDate = moment.max(DateArr);
|
|
88
|
+
return [minDate, maxDate];
|
|
89
|
+
}
|
|
90
|
+
isTooltipActive(header) {
|
|
91
|
+
let set = new Set(this.appliedFiltersArray);
|
|
92
|
+
return (set.has(header[0])) || (set.has(header[1]));
|
|
93
|
+
}
|
|
94
|
+
clearColumnFilter() {
|
|
95
|
+
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
96
|
+
if (this.tooltipMap.has(this.selectedRadio)) {
|
|
97
|
+
this.tooltipMap.delete(this.selectedRadio);
|
|
98
|
+
}
|
|
99
|
+
if (this.selectedRadio === "postedAdu") {
|
|
100
|
+
this.subRadioButton = "required";
|
|
101
|
+
this.tooltipSelectedMap.delete("isAudRequired");
|
|
102
|
+
}
|
|
103
|
+
let appliedFilterSet = new Set(this.appliedFiltersArray);
|
|
104
|
+
appliedFilterSet.delete(this.selectedRadio);
|
|
105
|
+
this.appliedFiltersArray = [...appliedFilterSet];
|
|
106
|
+
}
|
|
107
|
+
populateSliderTooltip(completeData, filteredData) {
|
|
108
|
+
let obj;
|
|
109
|
+
let minValue;
|
|
110
|
+
let maxValue;
|
|
111
|
+
if (this.appliedFiltersArray.length > 0 &&
|
|
112
|
+
this.appliedFiltersArray[this.appliedFiltersArray.length - 1] === this.selectedRadio) {
|
|
113
|
+
let subsetData;
|
|
114
|
+
let subfilterApplied = false;
|
|
115
|
+
//applying all filterexcept the current filter
|
|
116
|
+
if (this.selectedRadio === "postedAdu" && this.tooltipSelectedMap.has("isAudRequired")) {
|
|
117
|
+
this.tooltipSelectedMap.delete("isAudRequired");
|
|
118
|
+
subfilterApplied = true;
|
|
119
|
+
}
|
|
120
|
+
subsetData = this.filterData(completeData, this.selectedRadio);
|
|
121
|
+
//need to find min and max value for
|
|
122
|
+
minValue = this.returnMaxAndMinValue(subsetData, this.selectedRadio, true);
|
|
123
|
+
maxValue = this.returnMaxAndMinValue(subsetData, this.selectedRadio, false);
|
|
124
|
+
if (this.selectedRadio === "postedAdu" && subfilterApplied) {
|
|
125
|
+
this.tooltipSelectedMap.set("isAudRequired", [false]);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
minValue = this.returnMaxAndMinValue(filteredData, this.selectedRadio, true);
|
|
130
|
+
maxValue = this.returnMaxAndMinValue(filteredData, this.selectedRadio, false);
|
|
131
|
+
}
|
|
132
|
+
this.ngxSliderObj = this.setOptionValues(minValue, maxValue);
|
|
133
|
+
if (this.translateFunc === "normal") {
|
|
134
|
+
this.ngxSliderObj.translate = this.normalTranslateFunction;
|
|
135
|
+
}
|
|
136
|
+
else if (this.translateFunc === "percent") {
|
|
137
|
+
this.ngxSliderObj.translate = this.percentTranslateFunction;
|
|
138
|
+
}
|
|
139
|
+
else if (this.translateFunc === "currency") {
|
|
140
|
+
this.ngxSliderObj.translate = this.currencyTranslateFunction;
|
|
141
|
+
}
|
|
142
|
+
return obj;
|
|
143
|
+
}
|
|
144
|
+
setOptionValues(minValue, maxValue) {
|
|
145
|
+
return {
|
|
146
|
+
floor: minValue,
|
|
147
|
+
ceil: maxValue
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
populateTooltip(selectedColumnName, completeData, filteredData) {
|
|
151
|
+
let tooltipData;
|
|
152
|
+
if (this.appliedFiltersArray.length === 0) {
|
|
153
|
+
tooltipData = this.populateTooltipDataBasedOnSelectedRadio([selectedColumnName], completeData);
|
|
154
|
+
tooltipData.forEach((item) => (item.isHidden = false));
|
|
155
|
+
}
|
|
156
|
+
else if (selectedColumnName === this.appliedFiltersArray[this.appliedFiltersArray.length - 1]) {
|
|
157
|
+
let subsetData = this.filterData(completeData, selectedColumnName); //filter the data without applying the latest filter
|
|
158
|
+
tooltipData = this.showHideFilterCheckbox(subsetData, selectedColumnName);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
//if it is not the latest filter
|
|
162
|
+
//then filtered Data will be used
|
|
163
|
+
//create the option data
|
|
164
|
+
if (!this.tooltipMap.has(selectedColumnName)) {
|
|
165
|
+
this.populateTooltipDataBasedOnSelectedRadio([selectedColumnName], completeData);
|
|
166
|
+
}
|
|
167
|
+
tooltipData = this.showHideFilterCheckbox(filteredData, selectedColumnName);
|
|
168
|
+
}
|
|
169
|
+
return tooltipData;
|
|
170
|
+
}
|
|
171
|
+
populateTooltipDataBasedOnSelectedRadio(value, originalData) {
|
|
172
|
+
//if the initial tooltip data is already present fetch from the map
|
|
173
|
+
if (this.tooltipMap.has(value[0])) {
|
|
174
|
+
return this.tooltipMap.get(value[0]);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
//get the unique values from the column and save it in the map
|
|
178
|
+
this.selectedRadio = value[0];
|
|
179
|
+
const data = sortBy(originalData.map((u) => u[this.selectedRadio])).filter(n => n !== null); //sorting the data in alphabetical order
|
|
180
|
+
const dataSet = new Set(data); //created a set from the data
|
|
181
|
+
const toolTipdata = [...dataSet].map((x) => new tooltipModelForColumnLevelFiltering(x));
|
|
182
|
+
this.tooltipMap.set(value[0], toolTipdata); //setting the key value pair in the tooltipMap
|
|
183
|
+
this.tooltipSelectedMap.set(value[0], map(toolTipdata, "data")); //setting the key value pair in tooltipSelectedMap
|
|
184
|
+
return toolTipdata;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
showHideFilterCheckbox(arr, selectedColumnName) {
|
|
188
|
+
let currentSubsetData = uniq(arr.map((u) => u[selectedColumnName]));
|
|
189
|
+
//get the initial tooltip Data
|
|
190
|
+
let tooltipData = this.tooltipMap.get(selectedColumnName);
|
|
191
|
+
//show or hide the value
|
|
192
|
+
tooltipData.forEach((value) => {
|
|
193
|
+
//if the element is not present then hide the element
|
|
194
|
+
let elementToFindIndex = currentSubsetData.findIndex((n) => n === value.data);
|
|
195
|
+
if (elementToFindIndex === -1) {
|
|
196
|
+
value.isHidden = true;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
//show the element
|
|
200
|
+
value.isHidden = false;
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
return tooltipData;
|
|
204
|
+
}
|
|
205
|
+
isAllOptionsSelected() {
|
|
206
|
+
let allSelected;
|
|
207
|
+
let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
|
|
208
|
+
let selectedOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden && x.isSelected).length;
|
|
209
|
+
if (selectedOptionsCount === 0) {
|
|
210
|
+
allSelected = AllSelectedStatus.none;
|
|
211
|
+
}
|
|
212
|
+
else if (selectedOptionsCount > 0 && selectedOptionsCount < totalOptionsCount) {
|
|
213
|
+
allSelected = AllSelectedStatus.fewSelected;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
allSelected = AllSelectedStatus.allSelected;
|
|
217
|
+
}
|
|
218
|
+
return allSelected;
|
|
219
|
+
}
|
|
220
|
+
populateDatePickerTooltipWithData(completeData, filteredData) {
|
|
221
|
+
let enabledDates;
|
|
222
|
+
//some filter is applied and the latest filter is the date filter
|
|
223
|
+
if (this.appliedFiltersArray.length > 0 &&
|
|
224
|
+
this.appliedFiltersArray[this.appliedFiltersArray.length - 1] === this.selectedRadio) {
|
|
225
|
+
let subsetData;
|
|
226
|
+
//applying all filterexcept thec current filter
|
|
227
|
+
if (this.selectedRadio === "period") {
|
|
228
|
+
subsetData = this.filterData(completeData, "period");
|
|
229
|
+
let minStartDate = this.returnMinAndMaxDate(subsetData, "startDate");
|
|
230
|
+
let maxEndDate = this.returnMinAndMaxDate(subsetData, "endDate");
|
|
231
|
+
enabledDates = { minStartDate: minStartDate[0], maxEndDate: maxEndDate[1] };
|
|
232
|
+
}
|
|
233
|
+
else if (this.selectedRadio === "AirDate" || this.selectedRadio === "flightStartDate" ||
|
|
234
|
+
this.selectedRadio === "flightEndDate" || this.selectedRadio == "date") {
|
|
235
|
+
subsetData = this.filterData(completeData, this.selectedRadio);
|
|
236
|
+
let minAndMaxDate = this.returnMinAndMaxDate(subsetData, this.selectedRadio);
|
|
237
|
+
enabledDates = { minStartDate: minAndMaxDate[0], maxEndDate: minAndMaxDate[1] };
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
subsetData = this.filterData(completeData, this.selectedRadio);
|
|
241
|
+
//need to find min and max date for start and end date
|
|
242
|
+
//enabledDates is an arr of minDate and maxDate
|
|
243
|
+
enabledDates = this.returnMinAndMaxDate(subsetData, this.selectedRadio);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
if (this.selectedRadio === "period") {
|
|
248
|
+
let minStartDate = this.returnMinAndMaxDate(filteredData, "startDate");
|
|
249
|
+
let maxEndDate = this.returnMinAndMaxDate(filteredData, "endDate");
|
|
250
|
+
enabledDates = { minStartDate: minStartDate[0], maxEndDate: maxEndDate[1] };
|
|
251
|
+
}
|
|
252
|
+
else if (this.selectedRadio === "AirDate" || this.selectedRadio === "flightStartDate" ||
|
|
253
|
+
this.selectedRadio === "flightEndDate" || this.selectedRadio == "date") {
|
|
254
|
+
let minAndMaxDate = this.returnMinAndMaxDate(filteredData, this.selectedRadio);
|
|
255
|
+
enabledDates = { minStartDate: minAndMaxDate[0], maxEndDate: minAndMaxDate[1] };
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
//need to find min and max date for start and end date.
|
|
259
|
+
// enabledDates is an arr of minDate and maxDate
|
|
260
|
+
enabledDates = this.returnMinAndMaxDate(filteredData, this.selectedRadio);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return enabledDates;
|
|
264
|
+
}
|
|
265
|
+
findUniqueDatesWithData(data) {
|
|
266
|
+
let uniqueDates = uniq(data.map((u) => u["date"]));
|
|
267
|
+
let uniqueDatesInNgbDateFormat = [];
|
|
268
|
+
uniqueDates.forEach((date) => {
|
|
269
|
+
uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(moment(date, "MM/DD/YY").format("MM/DD/YYYY")));
|
|
270
|
+
});
|
|
271
|
+
return uniqueDatesInNgbDateFormat;
|
|
272
|
+
}
|
|
273
|
+
isCheckboxSelected(selectedData) {
|
|
274
|
+
selectedData.isSelected = !selectedData.isSelected;
|
|
275
|
+
let allSelected = this.isAllOptionsSelected();
|
|
276
|
+
return allSelected;
|
|
277
|
+
}
|
|
278
|
+
allOptionsClicked(status) {
|
|
279
|
+
let header = this.selectedRadio;
|
|
280
|
+
if (status === 1) {
|
|
281
|
+
this.tooltipMap.get(header).forEach((item) => {
|
|
282
|
+
if (!item.isHidden) {
|
|
283
|
+
item.isSelected = true;
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
this.tooltipSelectedMap.set(header, this.tooltipMap
|
|
287
|
+
.get(header)
|
|
288
|
+
.filter((x) => x.isSelected)
|
|
289
|
+
.map((x) => x.data));
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
this.tooltipMap.get(header).forEach((item) => {
|
|
293
|
+
if (!item.isHidden) {
|
|
294
|
+
item.isSelected = false;
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
this.tooltipSelectedMap.delete(header);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
reOrderAppliedFiltersArray(isHierarchialUserFiltered, date) {
|
|
301
|
+
let isFiltered = true;
|
|
302
|
+
isFiltered = this.checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date);
|
|
303
|
+
this.removeOrChangeLatestFilterIndex(isFiltered);
|
|
304
|
+
}
|
|
305
|
+
checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date) {
|
|
306
|
+
if (this.selectedRadio == "user" && !this.tooltipMap.has("user")) {
|
|
307
|
+
isFiltered = cloneDeep(isHierarchialUserFiltered);
|
|
308
|
+
}
|
|
309
|
+
else if (this.selectedRadio == "StartTimeForFilter" || this.selectedRadio == "EndTimeForFilter"
|
|
310
|
+
|| this.selectedRadio == "start_time_for_filter" || this.selectedRadio == "end_time_for_filter" || this.selectedRadio == "startEndTimeMulti") {
|
|
311
|
+
isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) || !this.includeZeroTime || !this.includeMultiTime;
|
|
312
|
+
}
|
|
313
|
+
else if (this.selectedRadio == "startEndTime" || this.selectedRadio == "TimeBand") {
|
|
314
|
+
isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) || !this.includeZeroTime || !this.includeMultiTime;
|
|
315
|
+
}
|
|
316
|
+
else if (this.sliderSet.has(this.selectedRadio)) {
|
|
317
|
+
isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.sliderData);
|
|
318
|
+
if (this.selectedRadio == "postedAdu" && this.subRadioButton == "notRequired") {
|
|
319
|
+
isFiltered = true;
|
|
320
|
+
}
|
|
321
|
+
if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
322
|
+
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else if (this.selectedRadio == "startDate" ||
|
|
326
|
+
this.selectedRadio == "endDate" ||
|
|
327
|
+
this.selectedRadio == "period" ||
|
|
328
|
+
this.selectedRadio == "AirDate" ||
|
|
329
|
+
this.selectedRadio === "flightStartDate" ||
|
|
330
|
+
this.selectedRadio === "flightEndDate" ||
|
|
331
|
+
this.selectedRadio == "date") {
|
|
332
|
+
isFiltered =
|
|
333
|
+
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) &&
|
|
334
|
+
!isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
|
|
335
|
+
if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
336
|
+
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
|
|
341
|
+
let selectedOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden && x.isSelected).length;
|
|
342
|
+
isFiltered = selectedOptionsCount > 0 && selectedOptionsCount != totalOptionsCount ? true : false;
|
|
343
|
+
}
|
|
344
|
+
return isFiltered;
|
|
345
|
+
}
|
|
346
|
+
removeOrChangeLatestFilterIndex(isFiltered) {
|
|
347
|
+
let set = new Set(this.appliedFiltersArray);
|
|
348
|
+
if (isFiltered && !set.has(this.selectedRadio)) {
|
|
349
|
+
set.add(this.selectedRadio);
|
|
350
|
+
}
|
|
351
|
+
else if (isFiltered && set.has(this.selectedRadio)) {
|
|
352
|
+
set.delete(this.selectedRadio);
|
|
353
|
+
set.add(this.selectedRadio);
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
set.delete(this.selectedRadio);
|
|
357
|
+
}
|
|
358
|
+
this.appliedFiltersArray = [...set];
|
|
359
|
+
}
|
|
360
|
+
filterData(originalData, keyToSkip) {
|
|
361
|
+
let filteredData = originalData;
|
|
362
|
+
this.tooltipSelectedMap.forEach((value, key) => {
|
|
363
|
+
if (key != keyToSkip) {
|
|
364
|
+
if (this.sliderSet.has(key)) {
|
|
365
|
+
filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
|
|
366
|
+
}
|
|
367
|
+
else if (key === "startDate" || key === "endDate") {
|
|
368
|
+
filteredData = filteredData.filter((obj) => this.returnOrdersInTheRange(obj, value, key));
|
|
369
|
+
}
|
|
370
|
+
else if (key === "period" || key === "AirDate" || key === "flightStartDate" || key === "flightEndDate" || key == "date") {
|
|
371
|
+
filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
|
|
372
|
+
}
|
|
373
|
+
else if (key === "StartTimeForFilter" || key === "EndTimeForFilter"
|
|
374
|
+
|| key === "start_time_for_filter" || key === "end_time_for_filter") {
|
|
375
|
+
filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
|
|
376
|
+
}
|
|
377
|
+
else if (key === "startEndTimeMulti") {
|
|
378
|
+
filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
|
|
379
|
+
}
|
|
380
|
+
else if (key === "startEndTime" || key === "TimeBand") {
|
|
381
|
+
let filteredMulti = [];
|
|
382
|
+
let filteredZero = [];
|
|
383
|
+
let filteredTimeRange = [];
|
|
384
|
+
if (this.includeTimeRange) {
|
|
385
|
+
filteredTimeRange = filteredData.filter((obj) => this.returnDataForTimeRange(obj, value));
|
|
386
|
+
}
|
|
387
|
+
if (this.includeMultiTime) {
|
|
388
|
+
filteredMulti = filteredData.filter((obj) => obj[key][0] == "<multi>");
|
|
389
|
+
}
|
|
390
|
+
if (this.includeZeroTime) {
|
|
391
|
+
filteredZero = filteredData.filter((obj) => obj[key][0] == "0");
|
|
392
|
+
}
|
|
393
|
+
filteredData = [...filteredMulti, ...filteredZero, ...filteredTimeRange];
|
|
394
|
+
}
|
|
395
|
+
else if (value.length > 0) {
|
|
396
|
+
filteredData = filteredData.filter((u) => value.includes(u[key]));
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
return filteredData;
|
|
401
|
+
}
|
|
402
|
+
returnOrdersInTheRange(order, range, key) {
|
|
403
|
+
let isDateBetweenTheSelectedRange = moment(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
|
|
404
|
+
let isDateSameAsTheMinSelectedDate = moment(order[key]).isSame(range.minSelectedDate);
|
|
405
|
+
let isDateSameAsTheMaxSelectedDate = moment(order[key]).isSame(range.maxSelectedDate);
|
|
406
|
+
return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
|
|
407
|
+
}
|
|
408
|
+
returnDataForTimeRange(obj, selectedData) {
|
|
409
|
+
let format = "HH:mm:ss";
|
|
410
|
+
let selectedStartDate = moment(selectedData.startTime, format);
|
|
411
|
+
let selectedEndDate = moment(selectedData.endTime, format);
|
|
412
|
+
let startTime = moment(obj.startTime, format);
|
|
413
|
+
let endTime = moment(obj.endTime, format);
|
|
414
|
+
let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedStartDate);
|
|
415
|
+
let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedStartDate, selectedEndDate);
|
|
416
|
+
let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedEndDate);
|
|
417
|
+
let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedStartDate, selectedEndDate);
|
|
418
|
+
return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
419
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
420
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
421
|
+
(isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
|
|
422
|
+
}
|
|
423
|
+
returnDataForFromAndToTimeRange(obj, selectedData, key) {
|
|
424
|
+
let format = "HH:mm:ss";
|
|
425
|
+
let selectedFromTime = moment(selectedData.fromTime, format);
|
|
426
|
+
let selectedToTime = moment(selectedData.toTime, format);
|
|
427
|
+
let objTime = obj[key];
|
|
428
|
+
if (["", "-", null].includes(objTime)) {
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
if (this.includeMultiTime && obj[key] == "<multi>") {
|
|
432
|
+
return true;
|
|
433
|
+
}
|
|
434
|
+
if (!this.includeMultiTime && obj[key] == "<multi>") {
|
|
435
|
+
return false;
|
|
436
|
+
}
|
|
437
|
+
if (this.includeZeroTime && obj[key] == "0") {
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
if (!this.includeZeroTime && obj[key] == "0") {
|
|
441
|
+
return false;
|
|
442
|
+
}
|
|
443
|
+
if (!this.includeTimeRange) {
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
objTime = this.dateTimeFormatService.formatToTwelveHrs(objTime, true);
|
|
447
|
+
objTime = this.dateTimeFormatService.convertTotwentyFourHrsFormat(objTime[0] + ":" + objTime[1] + " " + objTime[2], true);
|
|
448
|
+
objTime = objTime[0] + ":" + objTime[1] + ":00";
|
|
449
|
+
objTime = moment(objTime, format);
|
|
450
|
+
let isObjTimeSameAsSelectedFromTime = objTime.isSame(selectedFromTime);
|
|
451
|
+
let isObjTimeSameAsSelectedToTime = objTime.isSame(selectedToTime);
|
|
452
|
+
let isObjTimeBetweenSelectedFromTimeAndToTime = objTime.isBetween(selectedFromTime, selectedToTime);
|
|
453
|
+
return (isObjTimeSameAsSelectedFromTime ||
|
|
454
|
+
isObjTimeSameAsSelectedToTime ||
|
|
455
|
+
isObjTimeBetweenSelectedFromTimeAndToTime);
|
|
456
|
+
}
|
|
457
|
+
returnDataForStartAndEndTimeRange(obj, selectedData, key) {
|
|
458
|
+
let format = "HH:mm:ss";
|
|
459
|
+
let selectedFromTime = moment(selectedData.fromTime, format);
|
|
460
|
+
let selectedToTime = moment(selectedData.toTime, format);
|
|
461
|
+
let objTime = obj[key];
|
|
462
|
+
if (this.includeMultiTime && obj[key][0] == "<multi>") {
|
|
463
|
+
return true;
|
|
464
|
+
}
|
|
465
|
+
if (!this.includeMultiTime && obj[key][0] == "<multi>") {
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
if (this.includeZeroTime && obj[key][0] == "0") {
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
471
|
+
if (!this.includeZeroTime && obj[key][0] == "0") {
|
|
472
|
+
return false;
|
|
473
|
+
}
|
|
474
|
+
if (!this.includeTimeRange) {
|
|
475
|
+
return false;
|
|
476
|
+
}
|
|
477
|
+
let startTime = moment(obj[key][1], format);
|
|
478
|
+
let endTime = moment(obj[key][2], format);
|
|
479
|
+
let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
|
|
480
|
+
let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
|
|
481
|
+
let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
|
|
482
|
+
let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedFromTime, selectedToTime);
|
|
483
|
+
return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
484
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
485
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
486
|
+
(isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
|
|
487
|
+
}
|
|
488
|
+
getDataInTheDateRange(obj, value, key) {
|
|
489
|
+
let parsingFormat;
|
|
490
|
+
if (key === "period") {
|
|
491
|
+
parsingFormat = "YYYY-MM-DD";
|
|
492
|
+
let startDateIsBetweenSelDate = moment(obj.startDate, parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
|
|
493
|
+
let endDateIsBetweenSelDate = moment(obj.endDate, parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
|
|
494
|
+
let startDateIsSameAsSelStartDate = moment(obj.startDate, parsingFormat).isSame(value.minSelectedDate);
|
|
495
|
+
let endDateIsSameAsSelEndDate = moment(obj.endDate, parsingFormat).isSame(value.maxSelectedDate);
|
|
496
|
+
return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
|
|
497
|
+
(endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
|
|
498
|
+
}
|
|
499
|
+
else if (key === "AirDate" || key === "flightStartDate" || key === "flightEndDate") {
|
|
500
|
+
parsingFormat = "MM/DD/YYYY";
|
|
501
|
+
let dateIsBetweenSelDate = moment(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
|
|
502
|
+
let dateIsSameAsSelStartDate = moment(obj[key], parsingFormat).isSame(value.minSelectedDate);
|
|
503
|
+
let dateIsSameAsSelEndDate = moment(obj[key], parsingFormat).isSame(value.maxSelectedDate);
|
|
504
|
+
return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
initializeTimeFilterData(clonedData, key = "startEndTime") {
|
|
510
|
+
let startTimeArr = map(clonedData, "startTime");
|
|
511
|
+
let endTimeArr = map(clonedData, "endTime");
|
|
512
|
+
startTimeArr.sort((a, b) => {
|
|
513
|
+
return this.dateTimeFormatService.sortByTimeAscending(a, b);
|
|
514
|
+
});
|
|
515
|
+
endTimeArr.sort((a, b) => {
|
|
516
|
+
return this.dateTimeFormatService.sortByTimeDescending(a, b);
|
|
517
|
+
});
|
|
518
|
+
let initialStartEndTime = {
|
|
519
|
+
startTime: startTimeArr[0],
|
|
520
|
+
endTime: endTimeArr[0],
|
|
521
|
+
};
|
|
522
|
+
this.initialValueMap.set(key, initialStartEndTime);
|
|
523
|
+
}
|
|
524
|
+
returnColumnFilterStatus(data, headername) {
|
|
525
|
+
return uniq(data.map((u) => u[headername])).length > 1 ? false : true;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
AnnaFilterService.bufferSize = 20;
|
|
529
|
+
AnnaFilterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
530
|
+
AnnaFilterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, providedIn: 'root' });
|
|
531
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, decorators: [{
|
|
532
|
+
type: Injectable,
|
|
533
|
+
args: [{
|
|
534
|
+
providedIn: 'root'
|
|
535
|
+
}]
|
|
536
|
+
}], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }]; } });
|
|
537
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDOzs7QUFLekYsTUFBTSxPQUFPLGlCQUFpQjtJQXdCNUIsWUFBb0IscUJBQWdEO1FBQWhELDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBMkI7UUF0QnBFLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JBQW1CLEdBQWEsRUFBRSxDQUFDO1FBNEhuQyw2QkFBd0IsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO1lBQ2xELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBRUYsOEJBQXlCLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRTtZQUNuRCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7Z0JBQ2hCLE1BQU0s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QyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLG1CQUFtQixHQUFHO1lBQ3RCLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ3pCLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsSUFBVyxFQUFFLFVBQTJCO1FBQy9ELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEUsQ0FBQzs7QUFqa0JhLDRCQUFVLEdBQUcsRUFBRyxDQUFBOzhHQXRCbkIsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FGaEIsTUFBTTsyRkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXItc2xpZGVyL25neC1zbGlkZXInO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIFRoaXJkIHBhcnR5IGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IG1pbiwgbWF4LCBtYXAsIHNvcnRCeSwgdW5pcSwgY2xvbmVEZWVwLCBpc0VxdWFsIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuXHJcbi8vIFVzZXIgZGVmaW5lZCBpbXBvcnQgc3RhdGVtZW50cyBcclxuaW1wb3J0IHsgQWxsU2VsZWN0ZWRTdGF0dXMsIHRvb2x0aXBNb2RlbEZvckNvbHVtbkxldmVsRmlsdGVyaW5nIH0gZnJvbSBcIi4uL21vZGVscy9hbm5hLXRvb2x0aXAubW9kZWxcIjtcclxuaW1wb3J0IHsgQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSwgTmdiRGF0ZVR5cGUgfSBmcm9tICcuL2FubmEtZGF0ZS10aW1lLWZvcm1hdC5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFubmFGaWx0ZXJTZXJ2aWNlIHtcclxuXHJcbiAgdG9vbHRpcE1hcCA9IG5ldyBNYXAoKTtcclxuICB0b29sdGlwU2VsZWN0ZWRNYXAgPSBuZXcgTWFwKCk7XHJcbiAgaW5pdGlhbFZhbHVlTWFwOiBNYXA8c3RyaW5nLCBhbnk+O1xyXG4gIHRyYW5zbGF0ZUZ1bmM6IHN0cmluZztcclxuICBzZWxlY3RlZFJhZGlvOiBzdHJpbmc7XHJcbiAgc3ViUmFkaW9CdXR0b246IHN0cmluZztcclxuXHJcbiAgY2FsZW5kYXJTZXQ6IFNldDxzdHJpbmc+O1xyXG4gIHNsaWRlclNldDogU2V0PHN0cmluZz47XHJcbiAgdGltZVNldDogU2V0PHN0cmluZz47XHJcblxyXG4gIGluY2x1ZGVNdWx0aVRpbWU6IGJvb2xlYW47XHJcbiAgaW5jbHVkZVplcm9UaW1lOiBib29sZWFuO1xyXG4gIGluY2x1ZGVUaW1lUmFuZ2U6IGJvb2xlYW47XHJcblxyXG4gIGFwcGxpZWRGaWx0ZXJzQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgZmxpZ2h0RGF0ZVJhbmdlOiB7IG1pblNlbGVjdGVkRGF0ZTogYW55LCBtYXhTZWxlY3RlZERhdGU6IGFueSB9O1xyXG4gIHNsaWRlckRhdGE6IHsgbWluOiBhbnksIG1heDogYW55IH07XHJcbiAgbmd4U2xpZGVyT2JqOiBPcHRpb25zO1xyXG5cclxuICBwdWJsaWMgc3RhdGljIGJ1ZmZlclNpemUgPSAyMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRlVGltZUZvcm1hdFNlcnZpY2U6IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiQW5uYUZpbHRlclNlcnZpY2Ugc2VydmljZSBjcmVhdGVkLlwiKVxyXG4gICAgY29uc3Qgc2xpZGVyQXJyID0gW1xyXG4gICAgICBcInJjdlByZWVtcHRcIixcclxuICAgICAgXCJvc1ByZWVtcHRcIixcclxuICAgICAgXCJyY3ZVbmRlckRseVwiLFxyXG4gICAgICBcInBvc3RlZEF1ZFBlcmNlbnRcIixcclxuICAgICAgXCJib29rZWRcIixcclxuICAgICAgXCJzcG90c1wiLFxyXG4gICAgICBcImdycFwiLFxyXG4gICAgICBcImNwcFwiLFxyXG4gICAgICBcImltcHNcIixcclxuICAgICAgXCJjcG1cIixcclxuICAgICAgXCJvc1VuZGVyRGx5XCIsXHJcbiAgICAgIFwidG90YWxXZWVrc1wiLFxyXG4gICAgICBcIldlZWtOdW1iZXJcIixcclxuICAgICAgXCJSYXRlXCIsXHJcbiAgICAgIFwiT3JkZXJlZFJhdGluZ3NPckltcHJlc3Npb25zXCIsXHJcbiAgICAgIFwiUG9zdGVkUmF0aW5nc09ySW1wcmVzc2lvbnNcIiwgLFxyXG4gICAgICBcInBvc3RlZEF1ZFBlcmNlbnRcIixcclxuICAgICAgXCJwb3N0ZWRBZHVcIixcclxuICAgICAgXCJzY2hlZHVsZWRBZHVcIixcclxuICAgICAgXCJhdWRpZW5jZURlZmljaXRcIixcclxuICAgICAgXCJvZmZlcmVkTUdzXCIsXHJcbiAgICAgIFwib3V0c3RhbmRpbmdQRVwiLFxyXG4gICAgICBcIm9mZmVyZWRBRFVzXCIsXHJcbiAgICAgIFwidWREZWZpY2l0VmFsdWVcIixcclxuICAgICAgXCJib29rZWRWYWx1ZVwiLFxyXG4gICAgICBcImJvb2tlZFNwb3RzXCIsXHJcbiAgICAgIFwidXNlckNoYW5nZXNcIlxyXG4gICAgXTtcclxuICAgIGNvbnN0IGNhbGVuZGFyQXJyID0gW1wicGVyaW9kXCIsIFwiQWlyRGF0ZVwiLCBcImZsaWdodFN0YXJ0RGF0ZVwiLCBcImZsaWdodEVuZERhdGVcIixcImRhdGVcIl07XHJcbiAgICBjb25zdCB0aW1lQXJyID0gW1wiU3RhcnRUaW1lRm9yRmlsdGVyXCIsIFwiRW5kVGltZUZvckZpbHRlclwiLFxyXG4gICAgICBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiLCBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiwgXCJzdGFydEVuZFRpbWVNdWx0aVwiXTtcclxuICAgIHRoaXMuc2xpZGVyU2V0ID0gbmV3IFNldChzbGlkZXJBcnIpO1xyXG4gICAgdGhpcy5jYWxlbmRhclNldCA9IG5ldyBTZXQoY2FsZW5kYXJBcnIpO1xyXG4gICAgdGhpcy50aW1lU2V0ID0gbmV3IFNldCh0aW1lQXJyKTtcclxuICB9XHJcblxyXG4gIHJldHVybk1heEFuZE1pblZhbHVlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZywgaXNNaW46IGJvb2xlYW4pIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgY29uc3QgdmFsdWVzID0gZGF0YS5tYXAoKHgpID0+IHhba2V5XSk7XHJcbiAgICBsZXQgdmFsdWVUb1JldHVybiA9IGlzTWluID8gbWluKHZhbHVlcykgOiBtYXgodmFsdWVzKTtcclxuICAgIHJldHVybiB2YWx1ZVRvUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuTWluQW5kTWF4RGF0ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgbGV0IERhdGVBcnIgPSBkYXRhLm1hcCgob2JqKSA9PiBtb21lbnQob2JqW2tleV0pKTtcclxuICAgIGxldCBtaW5EYXRlID0gbW9tZW50Lm1pbihEYXRlQXJyKTtcclxuICAgIGxldCBtYXhEYXRlID0gbW9tZW50Lm1heChEYXRlQXJyKTtcclxuICAgIHJldHVybiBbbWluRGF0ZSwgbWF4RGF0ZV07XHJcbiAgfVxyXG5cclxuICBpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICByZXR1cm4gKHNldC5oYXMoaGVhZGVyWzBdKSkgfHwgKHNldC5oYXMoaGVhZGVyWzFdKSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckNvbHVtbkZpbHRlcigpIHtcclxuICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgaWYgKHRoaXMudG9vbHRpcE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICB0aGlzLnRvb2x0aXBNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInBvc3RlZEFkdVwiKSB7XHJcbiAgICAgIHRoaXMuc3ViUmFkaW9CdXR0b24gPSBcInJlcXVpcmVkXCI7XHJcbiAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZShcImlzQXVkUmVxdWlyZWRcIik7XHJcbiAgICB9XHJcbiAgICBsZXQgYXBwbGllZEZpbHRlclNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICBhcHBsaWVkRmlsdGVyU2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLmFwcGxpZWRGaWx0ZXJTZXRdO1xyXG4gIH1cclxuXHJcbiAgcG9wdWxhdGVTbGlkZXJUb29sdGlwKGNvbXBsZXRlRGF0YTogYW55W10sIGZpbHRlcmVkRGF0YTogYW55W10pIHtcclxuICAgIGxldCBvYmo7XHJcbiAgICBsZXQgbWluVmFsdWU7XHJcbiAgICBsZXQgbWF4VmFsdWU7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPiAwICYmXHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheVt0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkubGVuZ3RoIC0gMV0gPT09IHRoaXMuc2VsZWN0ZWRSYWRpb1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBzdWJzZXREYXRhO1xyXG4gICAgICBsZXQgc3ViZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xyXG4gICAgICAvL2FwcGx5aW5nIGFsbCBmaWx0ZXJleGNlcHQgdGhlIGN1cnJlbnQgZmlsdGVyXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwicG9zdGVkQWR1XCIgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKFwiaXNBdWRSZXF1aXJlZFwiKSkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZShcImlzQXVkUmVxdWlyZWRcIik7XHJcbiAgICAgICAgc3ViZmlsdGVyQXBwbGllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgc3Vic2V0RGF0YSA9IHRoaXMuZmlsdGVyRGF0YShjb21wbGV0ZURhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIC8vbmVlZCB0byBmaW5kIG1pbiBhbmQgbWF4IHZhbHVlIGZvclxyXG4gICAgICBtaW5WYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoc3Vic2V0RGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvLCB0cnVlKTtcclxuICAgICAgbWF4VmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKHN1YnNldERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgZmFsc2UpO1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInBvc3RlZEFkdVwiICYmIHN1YmZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5zZXQoXCJpc0F1ZFJlcXVpcmVkXCIsIFtmYWxzZV0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtaW5WYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIHRydWUpO1xyXG4gICAgICBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMubmd4U2xpZGVyT2JqID0gdGhpcy5zZXRPcHRpb25WYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKTtcclxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZUZ1bmMgPT09IFwibm9ybWFsXCIpIHtcclxuICAgICAgdGhpcy5uZ3hTbGlkZXJPYmoudHJhbnNsYXRlID0gdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2xhdGVGdW5jID09PSBcInBlcmNlbnRcIikge1xyXG4gICAgICB0aGlzLm5neFNsaWRlck9iai50cmFuc2xhdGUgPSB0aGlzLnBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2xhdGVGdW5jID09PSBcImN1cnJlbmN5XCIpIHtcclxuICAgICAgdGhpcy5uZ3hTbGlkZXJPYmoudHJhbnNsYXRlID0gdGhpcy5jdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmbG9vcjogbWluVmFsdWUsXHJcbiAgICAgIGNlaWw6IG1heFZhbHVlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcGVyY2VudFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICBjb25zdCB2YWwgPSBkYXRhLnRvRml4ZWQoMSkgKyBcIiVcIjtcclxuICAgIHJldHVybiB2YWw7XHJcbiAgfTtcclxuXHJcbiAgY3VycmVuY3lUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgaWYgKGRhdGEgPj0gMTAwMCkge1xyXG4gICAgICBjb25zdCB2YWwgPSAoZGF0YSAvIDEwMDApLnRvRml4ZWQoMSkgKyBcImtcIjtcclxuICAgICAgcmV0dXJuIFwiJFwiICsgdmFsO1xyXG4gICAgfSBlbHNlIGlmIChkYXRhICE9IE1hdGguZmxvb3IoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuIGRhdGEudG9GaXhlZCgxKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFwiJFwiICsgZGF0YTtcclxuICB9O1xyXG5cclxuICBub3JtYWxUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgaWYgKGRhdGEgPj0gMTAwMCkge1xyXG4gICAgICBjb25zdCB2YWwgPSAoZGF0YSAvIDEwMDApLnRvRml4ZWQoMSkgKyBcImtcIjtcclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH0gZWxzZSBpZiAoZGF0YSAhPSBNYXRoLmZsb29yKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybiBkYXRhLnRvRml4ZWQoMSkudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgfTtcclxuXHJcbiAgcG9wdWxhdGVUb29sdGlwKHNlbGVjdGVkQ29sdW1uTmFtZTogc3RyaW5nLCBjb21wbGV0ZURhdGE6IGFueVtdLCBmaWx0ZXJlZERhdGE6IGFueVtdKSB7XHJcbiAgICBsZXQgdG9vbHRpcERhdGE7XHJcblxyXG4gICAgaWYgKHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdG9vbHRpcERhdGEgPSB0aGlzLnBvcHVsYXRlVG9vbHRpcERhdGFCYXNlZE9uU2VsZWN0ZWRSYWRpbyhbc2VsZWN0ZWRDb2x1bW5OYW1lXSwgY29tcGxldGVEYXRhKTtcclxuICAgICAgdG9vbHRpcERhdGEuZm9yRWFjaCgoaXRlbTogeyBpc0hpZGRlbjogYm9vbGVhbiB9KSA9PiAoaXRlbS5pc0hpZGRlbiA9IGZhbHNlKSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ29sdW1uTmFtZSA9PT0gdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5W3RoaXMuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggLSAxXSkge1xyXG4gICAgICBsZXQgc3Vic2V0RGF0YSA9IHRoaXMuZmlsdGVyRGF0YShjb21wbGV0ZURhdGEsIHNlbGVjdGVkQ29sdW1uTmFtZSk7IC8vZmlsdGVyIHRoZSBkYXRhIHdpdGhvdXQgYXBwbHlpbmcgdGhlIGxhdGVzdCBmaWx0ZXJcclxuICAgICAgdG9vbHRpcERhdGEgPSB0aGlzLnNob3dIaWRlRmlsdGVyQ2hlY2tib3goc3Vic2V0RGF0YSwgc2VsZWN0ZWRDb2x1bW5OYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vaWYgaXQgaXMgbm90IHRoZSBsYXRlc3QgZmlsdGVyXHJcbiAgICAgIC8vdGhlbiBmaWx0ZXJlZCBEYXRhIHdpbGwgYmUgdXNlZFxyXG4gICAgICAvL2NyZWF0ZSB0aGUgb3B0aW9uIGRhdGFcclxuICAgICAgaWYgKCF0aGlzLnRvb2x0aXBNYXAuaGFzKHNlbGVjdGVkQ29sdW1uTmFtZSkpIHtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlVG9vbHRpcERhdGFCYXNlZE9uU2VsZWN0ZWRSYWRpbyhbc2VsZWN0ZWRDb2x1bW5OYW1lXSwgY29tcGxldGVEYXRhKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdG9vbHRpcERhdGEgPSB0aGlzLnNob3dIaWRlRmlsdGVyQ2hlY2tib3goZmlsdGVyZWREYXRhLCBzZWxlY3RlZENvbHVtbk5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvb2x0aXBEYXRhO1xyXG4gIH1cclxuXHJcbiAgcG9wdWxhdGVUb29sdGlwRGF0YUJhc2VkT25TZWxlY3RlZFJhZGlvKHZhbHVlOiBzdHJpbmdbXSwgb3JpZ2luYWxEYXRhOiBhbnkpIHtcclxuICAgIC8vaWYgdGhlIGluaXRpYWwgdG9vbHRpcCBkYXRhIGlzIGFscmVhZHkgcHJlc2VudCBmZXRjaCBmcm9tIHRoZSBtYXBcclxuICAgIGlmICh0aGlzLnRvb2x0aXBNYXAuaGFzKHZhbHVlWzBdKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy50b29sdGlwTWFwLmdldCh2YWx1ZVswXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL2dldCB0aGUgdW5pcXVlIHZhbHVlcyBmcm9tIHRoZSBjb2x1bW4gYW5kIHNhdmUgaXQgaW4gdGhlIG1hcFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPSB2YWx1ZVswXTtcclxuICAgICAgY29uc3QgZGF0YSA9IHNvcnRCeShvcmlnaW5hbERhdGEubWFwKCh1OiBhbnkpID0+IHVbdGhpcy5zZWxlY3RlZFJhZGlvXSkpLmZpbHRlcihuID0+IG4gIT09IG51bGwpOyAvL3NvcnRpbmcgdGhlIGRhdGEgaW4gYWxwaGFiZXRpY2FsIG9yZGVyXHJcbiAgICAgIGNvbnN0IGRhdGFTZXQgPSBuZXcgU2V0KGRhdGEpOyAvL2NyZWF0ZWQgYSBzZXQgZnJvbSB0aGUgZGF0YVxyXG4gICAgICBjb25zdCB0b29sVGlwZGF0YSA9IFsuLi5kYXRhU2V0XS5tYXAoKHgpID0+IG5ldyB0b29sdGlwTW9kZWxGb3JDb2x1bW5MZXZlbEZpbHRlcmluZyh4KSk7XHJcbiAgICAgIHRoaXMudG9vbHRpcE1hcC5zZXQodmFsdWVbMF0sIHRvb2xUaXBkYXRhKTsgLy9zZXR0aW5nIHRoZSBrZXkgdmFsdWUgcGFpciBpbiB0aGUgdG9vbHRpcE1hcFxyXG4gICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5zZXQodmFsdWVbMF0sIG1hcCh0b29sVGlwZGF0YSwgXCJkYXRhXCIpKTsgLy9zZXR0aW5nIHRoZSBrZXkgdmFsdWUgcGFpciBpbiB0b29sdGlwU2VsZWN0ZWRNYXBcclxuICAgICAgcmV0dXJuIHRvb2xUaXBkYXRhO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd0hpZGVGaWx0ZXJDaGVja2JveChhcnI6IGFueVtdLCBzZWxlY3RlZENvbHVtbk5hbWU6IHN0cmluZykge1xyXG4gICAgbGV0IGN1cnJlbnRTdWJzZXREYXRhID0gdW5pcShhcnIubWFwKCh1KSA9PiB1W3NlbGVjdGVkQ29sdW1uTmFtZV0pKTtcclxuXHJcbiAgICAvL2dldCB0aGUgaW5pdGlhbCB0b29sdGlwIERhdGFcclxuICAgIGxldCB0b29sdGlwRGF0YSA9IHRoaXMudG9vbHRpcE1hcC5nZXQoc2VsZWN0ZWRDb2x1bW5OYW1lKTtcclxuXHJcbiAgICAvL3Nob3cgb3IgaGlkZSB0aGUgdmFsdWVcclxuICAgIHRvb2x0aXBEYXRhLmZvckVhY2goKHZhbHVlOiB7IGRhdGE6IHN0cmluZyB8IG51bWJlcjsgaXNIaWRkZW46IGJvb2xlYW47IH0pID0+IHtcclxuICAgICAgLy9pZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCB0aGVuIGhpZGUgdGhlIGVsZW1lbnRcclxuICAgICAgbGV0IGVsZW1lbnRUb0ZpbmRJbmRleCA9IGN1cnJlbnRTdWJzZXREYXRhLmZpbmRJbmRleCgobjogc3RyaW5nIHwgbnVtYmVyKSA9PiBuID09PSB2YWx1ZS5kYXRhKTtcclxuICAgICAgaWYgKGVsZW1lbnRUb0ZpbmRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB2YWx1ZS5pc0hpZGRlbiA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy9zaG93IHRoZSBlbGVtZW50XHJcbiAgICAgICAgdmFsdWUuaXNIaWRkZW4gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRvb2x0aXBEYXRhO1xyXG4gIH1cclxuXHJcbiAgaXNBbGxPcHRpb25zU2VsZWN0ZWQoKSB7XHJcbiAgICBsZXQgYWxsU2VsZWN0ZWQ7XHJcbiAgICBsZXQgdG90YWxPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuKS5sZW5ndGg7XHJcbiAgICBsZXQgc2VsZWN0ZWRPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuICYmIHguaXNTZWxlY3RlZCkubGVuZ3RoO1xyXG4gICAgaWYgKHNlbGVjdGVkT3B0aW9uc0NvdW50ID09PSAwKSB7XHJcbiAgICAgIGFsbFNlbGVjdGVkID0gQWxsU2VsZWN0ZWRTdGF0dXMubm9uZTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRPcHRpb25zQ291bnQgPiAwICYmIHNlbGVjdGVkT3B0aW9uc0NvdW50IDwgdG90YWxPcHRpb25zQ291bnQpIHtcclxuICAgICAgYWxsU2VsZWN0ZWQgPSBBbGxTZWxlY3RlZFN0YXR1cy5mZXdTZWxlY3RlZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFsbFNlbGVjdGVkID0gQWxsU2VsZWN0ZWRTdGF0dXMuYWxsU2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWxsU2VsZWN0ZWQ7XHJcbiAgfVxyXG5cclxuICBwb3B1bGF0ZURhdGVQaWNrZXJUb29sdGlwV2l0aERhdGEoY29tcGxldGVEYXRhOiBhbnlbXSwgZmlsdGVyZWREYXRhOiBhbnlbXSkge1xyXG4gICAgbGV0IGVuYWJsZWREYXRlcztcclxuICAgIC8vc29tZSBmaWx0ZXIgaXMgYXBwbGllZCBhbmQgdGhlIGxhdGVzdCBmaWx0ZXIgaXMgdGhlIGRhdGUgZmlsdGVyXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPiAwICYmXHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheVt0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkubGVuZ3RoIC0gMV0gPT09IHRoaXMuc2VsZWN0ZWRSYWRpb1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBzdWJzZXREYXRhO1xyXG4gICAgICAvL2FwcGx5aW5nIGFsbCBmaWx0ZXJleGNlcHQgdGhlYyBjdXJyZW50ICBmaWx0ZXJcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJwZXJpb2RcIikge1xyXG4gICAgICAgIHN1YnNldERhdGEgPSB0aGlzLmZpbHRlckRhdGEoY29tcGxldGVEYXRhLCBcInBlcmlvZFwiKTtcclxuICAgICAgICBsZXQgbWluU3RhcnREYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKHN1YnNldERhdGEsIFwic3RhcnREYXRlXCIpO1xyXG4gICAgICAgIGxldCBtYXhFbmREYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKHN1YnNldERhdGEsIFwiZW5kRGF0ZVwiKTtcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB7IG1pblN0YXJ0RGF0ZTogbWluU3RhcnREYXRlWzBdLCBtYXhFbmREYXRlOiBtYXhFbmREYXRlWzFdIH07XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIkFpckRhdGVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImRhdGVcIikge1xyXG4gICAgICAgIHN1YnNldERhdGEgPSB0aGlzLmZpbHRlckRhdGEoY29tcGxldGVEYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIGxldCBtaW5BbmRNYXhEYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKHN1YnNldERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgZW5hYmxlZERhdGVzID0geyBtaW5TdGFydERhdGU6IG1pbkFuZE1heERhdGVbMF0sIG1heEVuZERhdGU6IG1pbkFuZE1heERhdGVbMV0gfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAvL25lZWQgdG8gZmluZCBtaW4gYW5kIG1heCBkYXRlIGZvciBzdGFydCBhbmQgZW5kIGRhdGVcclxuICAgICAgICAvL2VuYWJsZWREYXRlcyBpcyBhbiBhcnIgb2YgbWluRGF0ZSBhbmQgbWF4RGF0ZVxyXG4gICAgICAgIGVuYWJsZWREYXRlcyA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInBlcmlvZFwiKSB7XHJcbiAgICAgICAgbGV0IG1pblN0YXJ0RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShmaWx0ZXJlZERhdGEsIFwic3RhcnREYXRlXCIpO1xyXG4gICAgICAgIGxldCBtYXhFbmREYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKGZpbHRlcmVkRGF0YSwgXCJlbmREYXRlXCIpO1xyXG4gICAgICAgIGVuYWJsZWREYXRlcyA9IHsgbWluU3RhcnREYXRlOiBtaW5TdGFydERhdGVbMF0sIG1heEVuZERhdGU6IG1heEVuZERhdGVbMV0gfTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiQWlyRGF0ZVwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJmbGlnaHRFbmREYXRlXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiZGF0ZVwiKSB7XHJcbiAgICAgICAgbGV0IG1pbkFuZE1heERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIGVuYWJsZWREYXRlcyA9IHsgbWluU3RhcnREYXRlOiBtaW5BbmRNYXhEYXRlWzBdLCBtYXhFbmREYXRlOiBtaW5BbmRNYXhEYXRlWzFdIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy9uZWVkIHRvIGZpbmQgbWluIGFuZCBtYXggZGF0ZSBmb3Igc3RhcnQgYW5kIGVuZCBkYXRlLlxyXG4gICAgICAgIC8vIGVuYWJsZWREYXRlcyBpcyBhbiBhcnIgb2YgbWluRGF0ZSBhbmQgbWF4RGF0ZVxyXG4gICAgICAgIGVuYWJsZWREYXRlcyA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShmaWx0ZXJlZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBlbmFibGVkRGF0ZXM7XHJcbiAgfVxyXG5cclxuICBmaW5kVW5pcXVlRGF0ZXNXaXRoRGF0YShkYXRhOiBhbnlbXSkge1xyXG4gICAgbGV0IHVuaXF1ZURhdGVzID0gdW5pcShkYXRhLm1hcCgodSkgPT4gdVtcImRhdGVcIl0pKTtcclxuICAgIGxldCB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdDogTmdiRGF0ZVR5cGVbXSA9IFtdO1xyXG4gICAgdW5pcXVlRGF0ZXMuZm9yRWFjaCgoZGF0ZSkgPT4ge1xyXG4gICAgICB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdC5wdXNoKFxyXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGVTdGFuZGFyZEZvcm1hdChtb21lbnQoZGF0ZSwgXCJNTS9ERC9ZWVwiKS5mb3JtYXQoXCJNTS9ERC9ZWVlZXCIpKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ7XHJcbiAgfVxyXG5cclxuICBpc0NoZWNrYm94U2VsZWN0ZWQoc2VsZWN0ZWREYXRhOiBhbnkpIHtcclxuICAgIHNlbGVjdGVkRGF0YS5pc1NlbGVjdGVkID0gIXNlbGVjdGVkRGF0YS5pc1NlbGVjdGVkO1xyXG4gICAgbGV0IGFsbFNlbGVjdGVkID0gdGhpcy5pc0FsbE9wdGlvbnNTZWxlY3RlZCgpO1xyXG4gICAgcmV0dXJuIGFsbFNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgYWxsT3B0aW9uc0NsaWNrZWQoc3RhdHVzOiBudW1iZXIpIHtcclxuICAgIGxldCBoZWFkZXIgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICBpZiAoc3RhdHVzID09PSAxKSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcE1hcC5nZXQoaGVhZGVyKS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWl0ZW0uaXNIaWRkZW4pIHtcclxuICAgICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuc2V0KFxyXG4gICAgICAgIGhlYWRlcixcclxuICAgICAgICB0aGlzLnRvb2x0aXBNYXBcclxuICAgICAgICAgIC5nZXQoaGVhZGVyKVxyXG4gICAgICAgICAgLmZpbHRlcigoeDogYW55KSA9PiB4LmlzU2VsZWN0ZWQpXHJcbiAgICAgICAgICAubWFwKCh4OiBhbnkpID0+IHguZGF0YSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcE1hcC5nZXQoaGVhZGVyKS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWl0ZW0uaXNIaWRkZW4pIHtcclxuICAgICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZShoZWFkZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVPcmRlckFwcGxpZWRGaWx0ZXJzQXJyYXkoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZDogYm9vbGVhbiwgZGF0ZT86IGFueSkge1xyXG4gICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgaXNGaWx0ZXJlZCA9IHRoaXMuY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQsIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQsIGRhdGUpO1xyXG4gICAgdGhpcy5yZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQ6IGJvb2xlYW4sIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJ1c2VyXCIgJiYgIXRoaXMudG9vbHRpcE1hcC5oYXMoXCJ1c2VyXCIpKSB7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSBjbG9uZURlZXAoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkVuZFRpbWVGb3JGaWx0ZXJcIlxyXG4gICAgICB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydF90aW1lX2Zvcl9maWx0ZXJcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwic3RhcnRFbmRUaW1lTXVsdGlcIikge1xyXG4gICAgICBpc0ZpbHRlcmVkID0gIWlzRXF1YWwoXHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbylcclxuICAgICAgKSB8fCAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHwgIXRoaXMuaW5jbHVkZU11bHRpVGltZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0RW5kVGltZVwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9ICFpc0VxdWFsKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSkgfHwgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8ICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNsaWRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICBpc0ZpbHRlcmVkID0gIWlzRXF1YWwodGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5zbGlkZXJEYXRhKTtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInBvc3RlZEFkdVwiICYmIHRoaXMuc3ViUmFkaW9CdXR0b24gPT0gXCJub3RSZXF1aXJlZFwiKSB7XHJcbiAgICAgICAgaXNGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc0ZpbHRlcmVkICYmIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImVuZERhdGVcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJwZXJpb2RcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJBaXJEYXRlXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJmbGlnaHRFbmREYXRlXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiZGF0ZVwiXHJcbiAgICApIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9XHJcbiAgICAgICAgIWlzRXF1YWwodGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pKSAmJlxyXG4gICAgICAgICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLmZsaWdodERhdGVSYW5nZSk7XHJcbiAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdG90YWxPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuKS5sZW5ndGg7XHJcbiAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnNDb3VudCA9IHRoaXMudG9vbHRpcE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKS5maWx0ZXIoKHg6IGFueSkgPT4gIXguaXNIaWRkZW4gJiYgeC5pc1NlbGVjdGVkKS5sZW5ndGg7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSBzZWxlY3RlZE9wdGlvbnNDb3VudCA+IDAgJiYgc2VsZWN0ZWRPcHRpb25zQ291bnQgIT0gdG90YWxPcHRpb25zQ291bnQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICB9XHJcblxyXG4gIHJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZDogYm9vbGVhbikge1xyXG4gICAgbGV0IHNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICBpZiAoaXNGaWx0ZXJlZCAmJiAhc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgIH0gZWxzZSBpZiAoaXNGaWx0ZXJlZCAmJiBzZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgc2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICBzZXQuYWRkKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkgPSBbLi4uc2V0XTtcclxuICB9XHJcblxyXG4gIGZpbHRlckRhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSwga2V5VG9Ta2lwOiBzdHJpbmcpIHtcclxuICAgIGxldCBmaWx0ZXJlZERhdGEgPSBvcmlnaW5hbERhdGE7XHJcblxyXG4gICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICBpZiAoa2V5ICE9IGtleVRvU2tpcCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNsaWRlclNldC5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcInN0YXJ0RGF0ZVwiIHx8IGtleSA9PT0gXCJlbmREYXRlXCIpIHtcclxuICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5PcmRlcnNJblRoZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInBlcmlvZFwiIHx8IGtleSA9PT0gXCJBaXJEYXRlXCIgfHwga2V5ID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRFbmREYXRlXCIgfHwga2V5ID09IFwiZGF0ZVwiKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwiU3RhcnRUaW1lRm9yRmlsdGVyXCIgfHwga2V5ID09PSBcIkVuZFRpbWVGb3JGaWx0ZXJcIlxyXG4gICAgICAgICAgfHwga2V5ID09PSBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiIHx8IGtleSA9PT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIpIHtcclxuICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwic3RhcnRFbmRUaW1lTXVsdGlcIikge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgICBsZXQgZmlsdGVyZWRNdWx0aSA9IFtdO1xyXG4gICAgICAgICAgbGV0IGZpbHRlcmVkWmVybyA9IFtdO1xyXG4gICAgICAgICAgbGV0IGZpbHRlcmVkVGltZVJhbmdlID0gW107XHJcbiAgICAgICAgICBpZiAodGhpcy5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkVGltZVJhbmdlID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JUaW1lUmFuZ2Uob2JqLCB2YWx1ZSkpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmluY2x1ZGVNdWx0aVRpbWUpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWRNdWx0aSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV1bMF0gPT0gXCI8bXVsdGk+XCIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmluY2x1ZGVaZXJvVGltZSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZFplcm8gPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IG9ialtrZXldWzBdID09IFwiMFwiKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBbLi4uZmlsdGVyZWRNdWx0aSwgLi4uZmlsdGVyZWRaZXJvLCAuLi5maWx0ZXJlZFRpbWVSYW5nZV07XHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PiB2YWx1ZS5pbmNsdWRlcyh1W2tleV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcclxuICB9XHJcblxyXG4gIHJldHVybk9yZGVyc0luVGhlUmFuZ2Uob3JkZXI6IGFueSwgcmFuZ2U6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGxldCBpc0RhdGVCZXR3ZWVuVGhlU2VsZWN0ZWRSYW5nZSA9IG1vbWVudChvcmRlcltrZXldKS5pc0JldHdlZW4ocmFuZ2UubWluU2VsZWN0ZWREYXRlLCByYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgbGV0IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSA9IG1vbWVudChvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWluU2VsZWN0ZWREYXRlKTtcclxuICAgIGxldCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGUgPSBtb21lbnQob3JkZXJba2V5XSkuaXNTYW1lKHJhbmdlLm1heFNlbGVjdGVkRGF0ZSk7XHJcbiAgICByZXR1cm4gaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgfHwgaXNEYXRlU2FtZUFzVGhlTWluU2VsZWN0ZWREYXRlIHx8IGlzRGF0ZVNhbWVBc1RoZU1heFNlbGVjdGVkRGF0ZTtcclxuICB9XHJcblxyXG4gIHJldHVybkRhdGFGb3JUaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55KSB7XHJcbiAgICBsZXQgZm9ybWF0ID0gXCJISDptbTpzc1wiO1xyXG4gICAgbGV0IHNlbGVjdGVkU3RhcnREYXRlID0gbW9tZW50KHNlbGVjdGVkRGF0YS5zdGFydFRpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRFbmREYXRlID0gbW9tZW50KHNlbGVjdGVkRGF0YS5lbmRUaW1lLCBmb3JtYXQpO1xyXG4gICAgbGV0IHN0YXJ0VGltZSA9IG1vbWVudChvYmouc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgbGV0IGVuZFRpbWUgPSBtb21lbnQob2JqLmVuZFRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkU3RhcnREYXRlKTtcclxuICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgIGxldCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGxldCBmb3JtYXQgPSBcIkhIOm1tOnNzXCI7XHJcbiAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZSA9IG1vbWVudChzZWxlY3RlZERhdGEuZnJvbVRpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRUb1RpbWUgPSBtb21lbnQoc2VsZWN0ZWREYXRhLnRvVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBvYmpUaW1lID0gb2JqW2tleV07XHJcbiAgICBpZiAoW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpUaW1lKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pbmNsdWRlTXVsdGlUaW1lICYmIG9ialtrZXldID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmluY2x1ZGVNdWx0aVRpbWUgJiYgb2JqW2tleV0gPT0gXCI8bXVsdGk+XCIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaW5jbHVkZVplcm9UaW1lICYmIG9ialtrZXldID09IFwiMFwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmluY2x1ZGVaZXJvVGltZSAmJiBvYmpba2V5XSA9PSBcIjBcIikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgb2JqVGltZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmZvcm1hdFRvVHdlbHZlSHJzKG9ialRpbWUsIHRydWUpO1xyXG5cclxuICAgIG9ialRpbWUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICBvYmpUaW1lWzBdICsgXCI6XCIgKyBvYmpUaW1lWzFdICsgXCIgXCIgKyBvYmpUaW1lWzJdLFxyXG4gICAgICB0cnVlXHJcbiAgICApO1xyXG4gICAgb2JqVGltZSA9IG9ialRpbWVbMF0gKyBcIjpcIiArIG9ialRpbWVbMV0gKyBcIjowMFwiO1xyXG5cclxuICAgIG9ialRpbWUgPSBtb21lbnQob2JqVGltZSwgZm9ybWF0KTtcclxuXHJcbiAgICBsZXQgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRGcm9tVGltZSA9IG9ialRpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgbGV0IGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkVG9UaW1lID0gb2JqVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgbGV0IGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lID0gb2JqVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgfHxcclxuICAgICAgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRUb1RpbWUgfHxcclxuICAgICAgaXNPYmpUaW1lQmV0d2VlblNlbGVjdGVkRnJvbVRpbWVBbmRUb1RpbWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgbGV0IGZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuICAgIGxldCBzZWxlY3RlZEZyb21UaW1lID0gbW9tZW50KHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IG1vbWVudChzZWxlY3RlZERhdGEudG9UaW1lLCBmb3JtYXQpO1xyXG4gICAgbGV0IG9ialRpbWUgPSBvYmpba2V5XTtcclxuXHJcbiAgICBpZiAodGhpcy5pbmNsdWRlTXVsdGlUaW1lICYmIG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmluY2x1ZGVNdWx0aVRpbWUgJiYgb2JqW2tleV1bMF0gPT0gXCI8bXVsdGk+XCIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaW5jbHVkZVplcm9UaW1lICYmIG9ialtrZXldWzBdID09IFwiMFwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmluY2x1ZGVaZXJvVGltZSAmJiBvYmpba2V5XVswXSA9PSBcIjBcIikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHN0YXJ0VGltZSA9IG1vbWVudChvYmpba2V5XVsxXSwgZm9ybWF0KTtcclxuICAgIGxldCBlbmRUaW1lID0gbW9tZW50KG9ialtrZXldWzJdLCBmb3JtYXQpO1xyXG5cclxuICAgIGxldCBpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lID0gc3RhcnRUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgbGV0IGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSA9IGVuZFRpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcclxuICAgIGxldCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKSB8fFxyXG4gICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iajogYW55LCB2YWx1ZTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgbGV0IHBhcnNpbmdGb3JtYXQ6IHN0cmluZztcclxuICAgIGlmIChrZXkgPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgcGFyc2luZ0Zvcm1hdCA9IFwiWVlZWS1NTS1ERFwiO1xyXG4gICAgICBsZXQgc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IG1vbWVudChvYmouc3RhcnREYXRlLCBwYXJzaW5nRm9ybWF0KS5pc0JldHdlZW4oXHJcbiAgICAgICAgdmFsdWUubWluU2VsZWN0ZWREYXRlLFxyXG4gICAgICAgIHZhbHVlLm1heFNlbGVjdGVkRGF0ZVxyXG4gICAgICApO1xyXG4gICAgICBsZXQgZW5kRGF0ZUlzQmV0d2VlblNlbERhdGUgPSBtb21lbnQob2JqLmVuZERhdGUsIHBhcnNpbmdGb3JtYXQpLmlzQmV0d2VlbihcclxuICAgICAgICB2YWx1ZS5taW5TZWxlY3RlZERhdGUsXHJcbiAgICAgICAgdmFsdWUubWF4U2VsZWN0ZWREYXRlXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBsZXQgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSBtb21lbnQob2JqLnN0YXJ0RGF0ZSwgcGFyc2luZ0Zvcm1hdCkuaXNTYW1lKHZhbHVlLm1pblNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIGxldCBlbmREYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gbW9tZW50KG9iai5lbmREYXRlLCBwYXJzaW5nRm9ybWF0KS5pc1NhbWUodmFsdWUubWF4U2VsZWN0ZWREYXRlKTtcclxuXHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgKHN0YXJ0RGF0ZUlzQmV0d2VlblNlbERhdGUgfHwgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUpICYmXHJcbiAgICAgICAgKGVuZERhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGVuZERhdGVJc1NhbWVBc1NlbEVuZERhdGUpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJBaXJEYXRlXCIgfHwga2V5ID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRFbmREYXRlXCIpIHtcclxuICAgICAgcGFyc2luZ0Zvcm1hdCA9IFwiTU0vREQvWVlZWVwiO1xyXG4gICAgICBsZXQgZGF0ZUlzQmV0d2VlblNlbERhdGUgPSBtb21lbnQob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzQmV0d2Vlbih2YWx1ZS5taW5TZWxlY3RlZERhdGUsIHZhbHVlLm1heFNlbGVjdGVkRGF0ZSk7XHJcblxyXG4gICAgICBsZXQgZGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlID0gbW9tZW50KG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc1NhbWUodmFsdWUubWluU2VsZWN0ZWREYXRlKTtcclxuICAgICAgbGV0IGRhdGVJc1NhbWVBc1NlbEVuZERhdGUgPSBtb21lbnQob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5tYXhTZWxlY3RlZERhdGUpO1xyXG5cclxuICAgICAgcmV0dXJuIGRhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGRhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBpbml0aWFsaXplVGltZUZpbHRlckRhdGEoY2xvbmVkRGF0YTogYW55W10sIGtleSA9IFwic3RhcnRFbmRUaW1lXCIpIHtcclxuICAgIGxldCBzdGFydFRpbWVBcnIgPSBtYXAoY2xvbmVkRGF0YSwgXCJzdGFydFRpbWVcIik7XHJcbiAgICBsZXQgZW5kVGltZUFyciA9IG1hcChjbG9uZWREYXRhLCBcImVuZFRpbWVcIik7XHJcbiAgXHJcbiAgICBzdGFydFRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBlbmRUaW1lQXJyLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZURlc2NlbmRpbmcoYSwgYik7XHJcbiAgICB9KTtcclxuICBcclxuICAgIGxldCBpbml0aWFsU3RhcnRFbmRUaW1lID0ge1xyXG4gICAgICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lQXJyWzBdLFxyXG4gICAgICAgIGVuZFRpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgaW5pdGlhbFN0YXJ0RW5kVGltZSk7XHJcbiAgfSBcclxuXHJcbiAgcmV0dXJuQ29sdW1uRmlsdGVyU3RhdHVzKGRhdGE6IGFueVtdLCBoZWFkZXJuYW1lOiBzdHJpbmcgfCBudW1iZXIpIHtcclxuICAgIHJldHVybiB1bmlxKGRhdGEubWFwKCh1KSA9PiB1W2hlYWRlcm5hbWVdKSkubGVuZ3RoID4gMSA/IGZhbHNlIDogdHJ1ZTtcclxuICB9IFxyXG5cclxufVxyXG4iXX0=
|