@annalib/anna-core 20.4.2 → 20.5.0

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 (175) hide show
  1. package/README.md +7 -3
  2. package/{esm2020 → esm2022}/annalib-anna-core.mjs +4 -4
  3. package/esm2022/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +14 -0
  4. package/esm2022/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +13 -0
  5. package/esm2022/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +11 -0
  6. package/esm2022/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +43 -0
  7. package/esm2022/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +14 -0
  8. package/esm2022/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
  9. package/esm2022/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +13 -0
  10. package/esm2022/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +22 -0
  11. package/esm2022/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +14 -0
  12. package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +47 -0
  13. package/esm2022/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +273 -0
  14. package/esm2022/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +46 -0
  15. package/esm2022/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +39 -0
  16. package/esm2022/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +2 -0
  17. package/esm2022/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +2 -0
  18. package/esm2022/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +22 -0
  19. package/esm2022/lib/anna-core-shared-lib/models/anna-sort.model.mjs +7 -0
  20. package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +30 -30
  21. package/esm2022/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +39 -0
  22. package/esm2022/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +27 -0
  23. package/esm2022/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +22 -0
  24. package/esm2022/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +55 -0
  25. package/esm2022/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +26 -0
  26. package/esm2022/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +17 -0
  27. package/esm2022/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +219 -0
  28. package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +1272 -0
  29. package/esm2022/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +151 -0
  30. package/esm2022/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +135 -0
  31. package/esm2022/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +53 -0
  32. package/esm2022/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +65 -0
  33. package/esm2022/lib/anna-core-shared-lib/services/anna-sort.service.mjs +178 -0
  34. package/esm2022/lib/anna-core.module.mjs +226 -0
  35. package/esm2022/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +160 -0
  36. package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +371 -0
  37. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +252 -0
  38. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +185 -0
  39. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +316 -0
  40. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +298 -0
  41. package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +864 -0
  42. package/esm2022/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +64 -0
  43. package/esm2022/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +352 -0
  44. package/esm2022/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +204 -0
  45. package/{esm2020 → esm2022}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +2 -2
  46. package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +180 -0
  47. package/{esm2020 → esm2022}/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +2 -2
  48. package/esm2022/public-api.mjs +58 -0
  49. package/fesm2022/annalib-anna-core.mjs +6124 -0
  50. package/fesm2022/annalib-anna-core.mjs.map +1 -0
  51. package/index.d.ts +5 -5
  52. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -8
  53. package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +8 -8
  54. package/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.d.ts +5 -0
  55. package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +17 -17
  56. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -8
  57. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -11
  58. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -8
  59. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +12 -12
  60. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -8
  61. package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +45 -41
  62. package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -34
  63. package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +16 -16
  64. package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +10 -10
  65. package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +16 -16
  66. package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +98 -97
  67. package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +128 -118
  68. package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -11
  69. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +25 -25
  70. package/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.d.ts +9 -0
  71. package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -9
  72. package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +8 -8
  73. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -9
  74. package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -9
  75. package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -7
  76. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +33 -28
  77. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +154 -154
  78. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +27 -27
  79. package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -21
  80. package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +8 -8
  81. package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +9 -9
  82. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +18 -18
  83. package/lib/anna-core.module.d.ts +45 -43
  84. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +45 -45
  85. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +70 -70
  86. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +60 -60
  87. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +53 -53
  88. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +65 -65
  89. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +83 -83
  90. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +175 -174
  91. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +17 -17
  92. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -141
  93. 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 -89
  94. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -1
  95. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -45
  96. package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -1
  97. package/package.json +13 -18
  98. package/public-api.d.ts +42 -41
  99. package/src/lib/anna-common-scss/_animate.scss +11 -11
  100. package/src/lib/anna-common-scss/_application-spacing.scss +5 -4
  101. package/src/lib/anna-common-scss/_bootstrap-tooltip.scss +25 -23
  102. package/src/lib/anna-common-scss/_button.scss +1 -1
  103. package/src/lib/anna-common-scss/_colors.scss +1 -1
  104. package/src/lib/anna-common-scss/_common-order-listing-table.scss +146 -135
  105. package/src/lib/anna-common-scss/_custom-anna-datepicker.scss +1 -1
  106. package/src/lib/anna-common-scss/_customDropdown.scss +68 -67
  107. package/src/lib/anna-common-scss/_dashboard-partials.scss +66 -64
  108. package/src/lib/anna-common-scss/_date-picker-form.scss +40 -40
  109. package/src/lib/anna-common-scss/_easy-filter.scss +107 -127
  110. package/src/lib/anna-common-scss/_edit-filter-popup.scss +17 -18
  111. package/src/lib/anna-common-scss/_filters.scss +470 -471
  112. package/src/lib/anna-common-scss/_font.scss +7 -8
  113. package/src/lib/anna-common-scss/_fonts.scss +7 -7
  114. package/src/lib/anna-common-scss/_generic-modal.scss +62 -58
  115. package/src/lib/anna-common-scss/_generic-table-common.scss +140 -145
  116. package/src/lib/anna-common-scss/_gt-table.scss +173 -182
  117. package/src/lib/anna-common-scss/_icons.scss +3 -0
  118. package/src/lib/anna-common-scss/_legend.scss +5 -5
  119. package/src/lib/anna-common-scss/_mat-button-toggle.scss +11 -11
  120. package/src/lib/anna-common-scss/_mat-menu.scss +14 -14
  121. package/src/lib/anna-common-scss/_mixins.scss +134 -135
  122. package/src/lib/anna-common-scss/_modal.scss +22 -22
  123. package/src/lib/anna-common-scss/_popup-filter-toggle-button.scss +36 -0
  124. package/src/lib/anna-common-scss/_scrollbar.scss +7 -7
  125. package/src/lib/anna-common-scss/_sort.scss +20 -20
  126. package/src/lib/anna-common-scss/_toggle.scss +54 -52
  127. package/src/lib/anna-common-scss/style.scss +1 -1
  128. package/src/lib/anna-common-scss/third-party-lib/_angular-material-mat-radio.scss +21 -17
  129. package/src/lib/anna-common-scss/third-party-lib/_anna-mat-button-toggle-group-size-lg.scss +34 -0
  130. package/src/lib/anna-common-scss/third-party-lib/_mat-autocomplete.scss +26 -23
  131. package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +0 -15
  132. package/esm2020/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +0 -14
  133. package/esm2020/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +0 -36
  134. package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +0 -15
  135. package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +0 -22
  136. package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +0 -14
  137. package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +0 -23
  138. package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +0 -15
  139. package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -43
  140. package/esm2020/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +0 -284
  141. package/esm2020/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +0 -43
  142. package/esm2020/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +0 -36
  143. package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +0 -2
  144. package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +0 -2
  145. package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +0 -11
  146. package/esm2020/lib/anna-core-shared-lib/models/anna-sort.model.mjs +0 -7
  147. package/esm2020/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +0 -26
  148. package/esm2020/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +0 -22
  149. package/esm2020/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +0 -53
  150. package/esm2020/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +0 -25
  151. package/esm2020/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +0 -16
  152. package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +0 -208
  153. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1145
  154. package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +0 -151
  155. package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +0 -132
  156. package/esm2020/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +0 -53
  157. package/esm2020/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +0 -66
  158. package/esm2020/lib/anna-core-shared-lib/services/anna-sort.service.mjs +0 -175
  159. package/esm2020/lib/anna-core.module.mjs +0 -213
  160. package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +0 -151
  161. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -364
  162. package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +0 -237
  163. package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +0 -180
  164. package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +0 -306
  165. package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +0 -291
  166. package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -781
  167. package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +0 -64
  168. package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
  169. 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 +0 -189
  170. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
  171. package/esm2020/public-api.mjs +0 -57
  172. package/fesm2015/annalib-anna-core.mjs +0 -5782
  173. package/fesm2015/annalib-anna-core.mjs.map +0 -1
  174. package/fesm2020/annalib-anna-core.mjs +0 -5774
  175. package/fesm2020/annalib-anna-core.mjs.map +0 -1
@@ -0,0 +1,1272 @@
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 dayjs from 'dayjs';
5
+ import CustomParseFormat from 'dayjs/plugin/customParseFormat';
6
+ import minMax from 'dayjs/plugin/minMax';
7
+ import isBetween from 'dayjs/plugin/isBetween';
8
+ import { SortTypeEnum } from '../models/anna-sort.model';
9
+ // User defined import statements
10
+ import { AnnaDateTimeFormatService } from './anna-date-time-format.service';
11
+ import { AnnaSortService } from './anna-sort.service';
12
+ import { TooltipModel } from '../models/anna-tooltip.model';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "./anna-date-time-format.service";
15
+ import * as i2 from "./anna-sort.service";
16
+ export class AnnaFilterService {
17
+ static { this.bufferSize = 20; }
18
+ constructor(dateTimeFormatService, annaSortService) {
19
+ this.dateTimeFormatService = dateTimeFormatService;
20
+ this.annaSortService = annaSortService;
21
+ this.tooltipMap = new Map();
22
+ this.tooltipSelectedMap = new Map();
23
+ this.appliedFiltersArray = [];
24
+ this.sliderCurrencySet = new Set([
25
+ 'booked',
26
+ 'cpp',
27
+ 'cpm',
28
+ 'rcvPreempt',
29
+ 'osPreempt',
30
+ 'postedAdu',
31
+ 'scheduledAdu',
32
+ 'audienceDeficit',
33
+ 'Rate',
34
+ 'userADUs',
35
+ 'buyerChanges',
36
+ 'userChanges',
37
+ 'userMG',
38
+ 'udValue',
39
+ 'odValue',
40
+ ]);
41
+ this.isFilterSortActive = {};
42
+ this.resetFilterSortActiveStatus = true;
43
+ this.percentTranslateFunction = (data) => {
44
+ if (Math.abs(data) >= 1000) {
45
+ let isNegVal = data < 0;
46
+ const val = (Math.abs(data) / 1000).toFixed(1) + 'k%';
47
+ return isNegVal ? '-' + val : val;
48
+ }
49
+ else {
50
+ let isNegVal = data < 0;
51
+ let isWholeNum = parseInt(data.toString()) == data;
52
+ let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
53
+ return isNegVal ? '-' + val + '%' : val + '%';
54
+ }
55
+ };
56
+ this.currencyTranslateFunction = (data) => {
57
+ if (Math.abs(data) >= 1000) {
58
+ let isNegVal = data < 0;
59
+ const val = '$' + (Math.abs(data) / 1000).toFixed(1) + 'k';
60
+ return isNegVal ? '-' + val : val;
61
+ }
62
+ else {
63
+ let isNegVal = data < 0;
64
+ let isWholeNum = parseInt(data.toString()) == data;
65
+ let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
66
+ return isNegVal ? '-$' + val : '$' + val;
67
+ }
68
+ };
69
+ this.normalTranslateFunction = (data) => {
70
+ if (data >= 1000) {
71
+ const val = (data / 1000).toFixed(1) + 'k';
72
+ return val;
73
+ }
74
+ else if (data != Math.floor(data)) {
75
+ return data.toFixed(1).toString();
76
+ }
77
+ return data.toString();
78
+ };
79
+ dayjs.extend(minMax);
80
+ dayjs.extend(isBetween);
81
+ dayjs.extend(CustomParseFormat);
82
+ const sliderArr = [
83
+ 'rcvPreempt',
84
+ 'osPreempt',
85
+ 'rcvUnderDly',
86
+ 'postedAudPercent',
87
+ 'booked',
88
+ 'spots',
89
+ 'grp',
90
+ 'cpp',
91
+ 'imps',
92
+ 'cpm',
93
+ 'osUnderDly',
94
+ 'totalWeeks',
95
+ 'WeekNumber',
96
+ 'Rate',
97
+ 'OrderedRatingsOrImpressions',
98
+ 'PostedRatingsOrImpressions',
99
+ ,
100
+ 'postedAudPercent',
101
+ 'postedAdu',
102
+ 'scheduledAdu',
103
+ 'audienceDeficit',
104
+ 'offeredMGs',
105
+ 'outstandingPE',
106
+ 'offeredADUs',
107
+ 'udDeficitValue',
108
+ 'bookedValue',
109
+ 'bookedSpots',
110
+ 'userChanges',
111
+ 'UDGrp',
112
+ 'UDImps',
113
+ 'ODGrp',
114
+ 'ODImps',
115
+ 'udImpsPercent',
116
+ 'udGrpPercent',
117
+ 'odImpsPercent',
118
+ 'odGrpPercent',
119
+ 'userADUs',
120
+ 'buyerChanges',
121
+ 'userChanges',
122
+ 'userMG',
123
+ 'WeeklyAUR',
124
+ 'WeeklyAURatingOrImpressions',
125
+ 'MGsValue',
126
+ 'ADUsValue',
127
+ 'UserCreditedValue',
128
+ 'UserUnresolvedValue',
129
+ 'BuyerAddedValue',
130
+ 'BuyerDeletedValue',
131
+ 'BuyerChangesValue',
132
+ 'UserChangesValue',
133
+ 'BookedGRPOrIMPS',
134
+ 'BookedCPPOrCPM',
135
+ 'BookedValue',
136
+ 'BookedSpots',
137
+ 'BookedRate',
138
+ 'averageRate',
139
+ 'projectedIMPS',
140
+ 'projectedRTG',
141
+ 'desiredCPM',
142
+ 'desiredCPP',
143
+ 'inventoryFillPercentageSameWeek',
144
+ 'inventoryFillPercentageFinal',
145
+ 'inventoryFillPercentageTillDate',
146
+ 'dollarRateImpact',
147
+ 'dollarIMPSImpact',
148
+ 'IMPSImpact',
149
+ 'dollarRTGImpact',
150
+ 'RTGImpact',
151
+ 'BookedRTG',
152
+ 'BookedIMPS',
153
+ 'AURTG',
154
+ 'AURTG',
155
+ 'PostedRating',
156
+ 'PostedImpressions',
157
+ 'NormalizedOrderedRating',
158
+ 'NormalizedOrderedImpressions',
159
+ 'NormalizedPostedRating',
160
+ 'NormalizedPostedImpressions',
161
+ 'BookedGRP',
162
+ 'BookedIMPSRevTab',
163
+ 'BookedCPP',
164
+ 'BookedCPM',
165
+ 'AUIMPS',
166
+ 'bookedAmountValue',
167
+ 'equivalizedBookedAmountValue',
168
+ 'IMPS',
169
+ 'udValue',
170
+ 'odValue',
171
+ 'ViolatedBookedValue',
172
+ 'ViolatedBookedEURValue',
173
+ 'ViolatingBookedEURValue',
174
+ 'ViolatingBookedValue',
175
+ 'Rebate',
176
+ 'WeeklyAUR',
177
+ 'parentRowAnnaEstimatesRtg',
178
+ 'parentRowPostedRtg',
179
+ 'parentRowRollingAverageRtg',
180
+ 'parentRowStationEstimatesRtg',
181
+ 'parentRowAnnaEstimatesImps',
182
+ 'parentRowPostedImps',
183
+ 'parentRowRollingAverageImps',
184
+ 'parentRowStationEstimatesImps',
185
+ 'parentRowAnnaEstimatesShare',
186
+ 'parentRowPostedShare',
187
+ 'parentRowRollingAverageShare',
188
+ 'parentRowAnnaEstimatesPutPer',
189
+ 'parentRowPostedPutPer',
190
+ 'parentRowRollingAveragePutPer',
191
+ 'parentRowAnnaEstimatesPut',
192
+ 'parentRowPostedPut',
193
+ 'parentRowRollingAveragePut',
194
+ 'ProjectedImpressions',
195
+ 'ProjectedRtg',
196
+ ];
197
+ const calendarArr = [
198
+ 'period',
199
+ 'AirDate',
200
+ 'flightStartDate',
201
+ 'flightEndDate',
202
+ 'date',
203
+ 'startDate',
204
+ 'endDate',
205
+ 'revisionStartDate',
206
+ 'GeneratedOn',
207
+ 'Week',
208
+ 'timeoutDate',
209
+ 'ViolatingSpotDate',
210
+ 'ViolatedSpotDate',
211
+ ];
212
+ const timeArr = [
213
+ 'StartTimeForFilter',
214
+ 'EndTimeForFilter',
215
+ 'time',
216
+ 'startTimeForFilter',
217
+ 'endTimeForFilter',
218
+ 'start_time_for_filter',
219
+ 'end_time_for_filter',
220
+ 'startEndTimeMulti',
221
+ 'startEndTime',
222
+ 'timeoutTime',
223
+ 'StartTime',
224
+ 'EndTime',
225
+ ];
226
+ this.sliderSet = new Set(sliderArr);
227
+ this.calendarSet = new Set(calendarArr);
228
+ this.timeSet = new Set(timeArr);
229
+ }
230
+ returnMaxAndMinValue(data, key, isMin) {
231
+ data = data.filter((obj) => !['', '-', null].includes(obj[key]));
232
+ const values = data.map((x) => x[key]);
233
+ let valueToReturn = isMin ? min(values) : max(values);
234
+ return valueToReturn;
235
+ }
236
+ returnMinAndMaxDate(data, key) {
237
+ data = data.filter((obj) => !['', '-', null].includes(obj[key]));
238
+ let DateArr = data.map((obj) => dayjs(obj[key]));
239
+ let minDate = dayjs.min(DateArr);
240
+ let maxDate = dayjs.max(DateArr);
241
+ return [minDate, maxDate];
242
+ }
243
+ isTooltipActive(header, sortMap) {
244
+ let set = new Set(this.appliedFiltersArray);
245
+ let isSortMapForHeader0Active = sortMap.has(header[0]) && sortMap.get(header[0]) != SortTypeEnum.DEFAULT;
246
+ let isSortMapForHeader1Active = sortMap.has(header[1]) && sortMap.get(header[1]) != SortTypeEnum.DEFAULT;
247
+ if (header.length == 1) {
248
+ return (sortMap.size > 0 && isSortMapForHeader0Active) || set.has(header[0]);
249
+ }
250
+ return ((sortMap.size > 0 && sortMap.has(header[0]) && isSortMapForHeader0Active) ||
251
+ (sortMap.size > 0 && sortMap.has(header[1]) && isSortMapForHeader1Active) ||
252
+ set.has(header[0]) ||
253
+ set.has(header[1]));
254
+ }
255
+ clearColumnFilter() {
256
+ if (this.tooltipSelectedMap.has(this.selectedRadio)) {
257
+ this.tooltipSelectedMap.delete(this.selectedRadio);
258
+ let appliedFilterSet = new Set(this.appliedFiltersArray);
259
+ appliedFilterSet.delete(this.selectedRadio);
260
+ this.appliedFiltersArray = [...appliedFilterSet];
261
+ }
262
+ if (this.annaSortService.columnSortState.has(this.selectedRadio)) {
263
+ this.annaSortService.columnSortState.delete(this.selectedRadio);
264
+ }
265
+ }
266
+ setOptionValues(minValue, maxValue) {
267
+ return {
268
+ floor: minValue,
269
+ ceil: maxValue,
270
+ disabled: true,
271
+ translate: this.normalTranslateFunction,
272
+ };
273
+ }
274
+ findUniqueDatesWithData(data) {
275
+ let uniqueDates = uniq(data.map((u) => u['date']));
276
+ let uniqueDatesInNgbDateFormat = [];
277
+ uniqueDates.forEach((date) => {
278
+ uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(dayjs(date, 'MM/DD/YY').format('MM/DD/YYYY')));
279
+ });
280
+ return uniqueDatesInNgbDateFormat;
281
+ }
282
+ reOrderAppliedFiltersArray(isHierarchialUserFiltered, date) {
283
+ let isFiltered = true;
284
+ isFiltered = this.checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date);
285
+ this.removeOrChangeLatestFilterIndex(isFiltered);
286
+ }
287
+ checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date) {
288
+ if (this.selectedRadio == 'user' && !this.tooltipMap.has('user')) {
289
+ isFiltered = cloneDeep(isHierarchialUserFiltered);
290
+ }
291
+ else if (this.selectedRadio == 'StartTimeForFilter' ||
292
+ this.selectedRadio == 'EndTimeForFilter' ||
293
+ this.selectedRadio == 'startTimeForFilter' ||
294
+ this.selectedRadio == 'endTimeForFilter' ||
295
+ this.selectedRadio == 'time' ||
296
+ this.selectedRadio == 'timeoutTime' ||
297
+ this.selectedRadio == 'StartTime' ||
298
+ this.selectedRadio == 'EndTime' ||
299
+ this.selectedRadio == 'start_time_for_filter' ||
300
+ this.selectedRadio == 'end_time_for_filter' ||
301
+ this.selectedRadio == 'startEndTimeMulti') {
302
+ isFiltered =
303
+ !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
304
+ !this.includeZeroTime ||
305
+ !this.includeMultiTime;
306
+ }
307
+ else if (this.selectedRadio == 'startEndTime' || this.selectedRadio == 'TimeBand') {
308
+ isFiltered =
309
+ !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
310
+ !this.includeZeroTime ||
311
+ !this.includeMultiTime;
312
+ }
313
+ else if (this.sliderSet.has(this.selectedRadio)) {
314
+ isFiltered =
315
+ !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.sliderData);
316
+ if (this.selectedRadio == 'postedAdu' && this.subRadioButton == 'notRequired') {
317
+ isFiltered = true;
318
+ }
319
+ if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
320
+ this.tooltipSelectedMap.delete(this.selectedRadio);
321
+ }
322
+ }
323
+ else if (this.selectedRadio == 'startDate' ||
324
+ this.selectedRadio == 'endDate' ||
325
+ this.selectedRadio == 'period' ||
326
+ this.selectedRadio == 'AirDate' ||
327
+ this.selectedRadio == 'timeoutDate' ||
328
+ this.selectedRadio === 'flightStartDate' ||
329
+ this.selectedRadio === 'flightEndDate' ||
330
+ this.selectedRadio == 'date' ||
331
+ this.selectedRadio == 'revisionStartDate' ||
332
+ this.selectedRadio == 'GeneratedOn' ||
333
+ this.selectedRadio == 'Week') {
334
+ isFiltered =
335
+ !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
336
+ if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
337
+ this.tooltipSelectedMap.delete(this.selectedRadio);
338
+ }
339
+ }
340
+ else {
341
+ let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
342
+ let selectedOptionsCount = this.tooltipMap
343
+ .get(this.selectedRadio)
344
+ .filter((x) => !x.isHidden && x.isSelected).length;
345
+ isFiltered = selectedOptionsCount > 0 && selectedOptionsCount != totalOptionsCount ? true : false;
346
+ }
347
+ return isFiltered;
348
+ }
349
+ removeOrChangeLatestFilterIndex(isFiltered) {
350
+ let set = new Set(this.appliedFiltersArray);
351
+ if (isFiltered && !set.has(this.selectedRadio)) {
352
+ set.add(this.selectedRadio);
353
+ }
354
+ else if (isFiltered && set.has(this.selectedRadio)) {
355
+ set.delete(this.selectedRadio);
356
+ set.add(this.selectedRadio);
357
+ }
358
+ else {
359
+ set.delete(this.selectedRadio);
360
+ }
361
+ this.appliedFiltersArray = [...set];
362
+ }
363
+ checkIfSortingIsAppliedThenSortTheData(originalData) {
364
+ if (!this.annaSortService?.columnSortState)
365
+ return originalData;
366
+ for (let [key, value] of this.annaSortService.columnSortState.entries()) {
367
+ if (value == 'ASC') {
368
+ originalData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, originalData, key));
369
+ }
370
+ else if (value == 'DESC') {
371
+ originalData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, originalData, key));
372
+ }
373
+ }
374
+ return originalData;
375
+ }
376
+ filterData(originalData, keyToSkip, isLurCsrPage = false) {
377
+ let filteredData = [...originalData];
378
+ if (!isLurCsrPage) {
379
+ filteredData = this.checkIfSortingIsAppliedThenSortTheData(originalData);
380
+ }
381
+ this.tooltipSelectedMap.forEach((value, key) => {
382
+ if (key != keyToSkip && originalData.length > 0 && Object.keys(originalData[0]).includes(key)) {
383
+ if (this.sliderSet.has(key)) {
384
+ filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
385
+ }
386
+ else if (key === 'startDate' ||
387
+ key === 'endDate' ||
388
+ key === 'AirDate' ||
389
+ key === 'timeoutDate' ||
390
+ key === 'flightStartDate' ||
391
+ key === 'flightEndDate' ||
392
+ key == 'date' ||
393
+ key == 'Date' ||
394
+ key == 'revisionStartDate' ||
395
+ key == 'GeneratedOn' ||
396
+ key === 'Week' ||
397
+ key === 'ViolatedSpotDate' ||
398
+ key === 'ViolatingSpotDate') {
399
+ filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
400
+ }
401
+ else if (key === 'period') {
402
+ filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
403
+ }
404
+ else if (key === 'StartTimeForFilter' ||
405
+ key === 'EndTimeForFilter' ||
406
+ key == 'timeoutTime' ||
407
+ key === 'startTimeForFilter' ||
408
+ key === 'endTimeForFilter' ||
409
+ key === 'StartTime' ||
410
+ key == 'EndTime' ||
411
+ key === 'start_time_for_filter' ||
412
+ key === 'end_time_for_filter' ||
413
+ key == 'time') {
414
+ filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
415
+ }
416
+ else if (key === 'startEndTimeMulti' || key == 'startEndTime' || key === 'TimeBand') {
417
+ filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
418
+ }
419
+ else if (value.length > 0) {
420
+ filteredData = filteredData.filter((u) => value.includes(u[key]));
421
+ }
422
+ }
423
+ });
424
+ return filteredData;
425
+ }
426
+ returnOrdersInTheRange(order, range, key) {
427
+ let isDateBetweenTheSelectedRange = dayjs(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
428
+ let isDateSameAsTheMinSelectedDate = dayjs(order[key]).isSame(range.minSelectedDate);
429
+ let isDateSameAsTheMaxSelectedDate = dayjs(order[key]).isSame(range.maxSelectedDate);
430
+ return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
431
+ }
432
+ returnDataForTimeRange(obj, selectedData) {
433
+ let format = 'HH:mm:ss';
434
+ let selectedStartDate = dayjs(selectedData.startTime, format);
435
+ let selectedEndDate = dayjs(selectedData.endTime, format);
436
+ let startTime = dayjs(obj.startTime, format);
437
+ let endTime = dayjs(obj.endTime, format);
438
+ let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedStartDate);
439
+ let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedStartDate, selectedEndDate);
440
+ let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedEndDate);
441
+ let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedStartDate, selectedEndDate);
442
+ return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
443
+ (isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
444
+ (isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
445
+ (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
446
+ }
447
+ returnDataForFromAndToTimeRange(obj, selectedData, key) {
448
+ let format = 'MM/DD/YYYY HH:mm:ss';
449
+ let selectedFromTime = dayjs('01/01/2001 ' + selectedData.fromTime, format);
450
+ let selectedToTime = dayjs('01/01/2001 ' + selectedData.toTime, format);
451
+ let objTime = obj[key];
452
+ if (['', '-', null].includes(objTime)) {
453
+ return false;
454
+ }
455
+ if (selectedData.includeMulti && obj[key] == '<multi>') {
456
+ return true;
457
+ }
458
+ if (!selectedData.includeMulti && obj[key] == '<multi>') {
459
+ return false;
460
+ }
461
+ if (selectedData.includeZero && obj[key] == '0') {
462
+ return true;
463
+ }
464
+ if (!selectedData.includeZero && obj[key] == '0') {
465
+ return false;
466
+ }
467
+ if (!selectedData.includeTimeRange) {
468
+ return false;
469
+ }
470
+ let dayjsTime = dayjs('01/01/2001 ' + objTime, format);
471
+ let isObjTimeSameAsSelectedFromTime = dayjsTime.isSame(selectedFromTime);
472
+ let isObjTimeSameAsSelectedToTime = dayjsTime.isSame(selectedToTime);
473
+ let isObjTimeBetweenSelectedFromTimeAndToTime = dayjsTime.isBetween(selectedFromTime, selectedToTime);
474
+ return (isObjTimeSameAsSelectedFromTime ||
475
+ isObjTimeSameAsSelectedToTime ||
476
+ isObjTimeBetweenSelectedFromTimeAndToTime);
477
+ }
478
+ returnDataForStartAndEndTimeRange(obj, selectedData, key) {
479
+ let format = 'MM/DD/YYYY HH:mm:ss';
480
+ let selectedFromTime = dayjs('01/01/2001 ' + selectedData.fromTime, format);
481
+ let selectedToTime = dayjs('01/01/2001 ' + selectedData.toTime, format);
482
+ if (selectedData.includeMulti && obj[key][0] == '<multi>') {
483
+ return true;
484
+ }
485
+ if (!selectedData.includeMulti && obj[key][0] == '<multi>') {
486
+ return false;
487
+ }
488
+ if (selectedData.includeZero && obj[key][0] == '0') {
489
+ return true;
490
+ }
491
+ if (!selectedData.includeZero && obj[key][0] == '0') {
492
+ return false;
493
+ }
494
+ if (!selectedData.includeTimeRange) {
495
+ return false;
496
+ }
497
+ let startTime = dayjs('01/01/2001 ' + obj[key][1], format);
498
+ let endTime = dayjs('01/01/2001 ' + obj[key][2], format);
499
+ let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
500
+ let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
501
+ let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
502
+ let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedFromTime, selectedToTime);
503
+ return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
504
+ (isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
505
+ (isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
506
+ (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
507
+ }
508
+ getDataInTheDateRange(obj, value, key) {
509
+ let parsingFormat;
510
+ if (key === 'period') {
511
+ parsingFormat = 'YYYY-MM-DD';
512
+ let dayjsStartDate = dayjs(obj.startDate);
513
+ let dayjsEndDate = dayjs(obj.endDate);
514
+ let startDateIsBetweenSelDate = dayjsStartDate.isBetween(value.fromDate, value.toDate);
515
+ let endDateIsBetweenSelDate = dayjsEndDate.isBetween(value.fromDate, value.toDate);
516
+ let startDateIsSameAsSelStartDate = value.fromDate.isSame(dayjsStartDate);
517
+ let endDateIsSameAsSelEndDate = value.toDate.isSame(dayjsEndDate);
518
+ return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
519
+ (endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
520
+ }
521
+ else if (key === 'AirDate' ||
522
+ key === 'flightStartDate' ||
523
+ key === 'flightEndDate' ||
524
+ key === 'Week' ||
525
+ key === 'timeoutDate') {
526
+ parsingFormat = 'MM/DD/YYYY';
527
+ let dateIsBetweenSelDate = dayjs(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
528
+ let dateIsSameAsSelStartDate = dayjs(obj[key], parsingFormat).isSame(value.minSelectedDate);
529
+ let dateIsSameAsSelEndDate = dayjs(obj[key], parsingFormat).isSame(value.maxSelectedDate);
530
+ return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
531
+ }
532
+ }
533
+ initializeTimeFilterData(clonedData, key = 'startEndTime') {
534
+ let startTimeArr = map(clonedData, 'startTime');
535
+ let endTimeArr = map(clonedData, 'endTime');
536
+ startTimeArr.sort((a, b) => {
537
+ return this.dateTimeFormatService.sortByTimeAscending(a, b);
538
+ });
539
+ endTimeArr.sort((a, b) => {
540
+ return this.dateTimeFormatService.sortByTimeDescending(a, b);
541
+ });
542
+ let initialStartEndTime = {
543
+ startTime: startTimeArr[0],
544
+ endTime: endTimeArr[0],
545
+ };
546
+ this.initialValueMap.set(key, initialStartEndTime);
547
+ }
548
+ returnColumnFilterStatus(data, headerName) {
549
+ if (headerName == 'startEndTime') {
550
+ let time = data.map((u) => u[headerName][0]);
551
+ let uniqTime = uniq(time);
552
+ return uniqTime.length == 0;
553
+ }
554
+ return uniq(data.map((u) => u[headerName])).length > 1 ? false : true;
555
+ }
556
+ getFilterOptionsData(data, clonedData, key) {
557
+ let appliedFilterSet = new Set(this.appliedFiltersArray);
558
+ key = key ? key : this.selectedRadio;
559
+ if (appliedFilterSet.has(key)) {
560
+ return this.filterData(clonedData, key);
561
+ }
562
+ else {
563
+ return data;
564
+ }
565
+ }
566
+ reOrderAppliedFiltersState(clonedData, value) {
567
+ let isFiltered = true;
568
+ isFiltered = this.checkIfFilterIsApplied(clonedData, value);
569
+ this.removeOrChangeLatestFilterIndex(isFiltered);
570
+ return isFiltered;
571
+ }
572
+ checkIfFilterIsApplied(clonedData, value) {
573
+ let initialValueOfColumn = sortBy(clonedData.map((item) => item[this.selectedRadio]));
574
+ let currentValueOfColumn = sortBy(this.applyFilter(clonedData, value).map((item) => item[this.selectedRadio]));
575
+ return !isEqual(initialValueOfColumn, currentValueOfColumn);
576
+ }
577
+ applyFilter(data, value) {
578
+ let filteredData = data;
579
+ let key = this.selectedRadio;
580
+ if (this.sliderSet.has(key)) {
581
+ filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
582
+ }
583
+ else if (key === 'startDate' ||
584
+ key === 'endDate' ||
585
+ key === 'AirDate' ||
586
+ key === 'timeoutDate' ||
587
+ key === 'flightStartDate' ||
588
+ key === 'flightEndDate' ||
589
+ key == 'date' ||
590
+ key == 'Date' ||
591
+ key == 'revisionStartDate' ||
592
+ key == 'GeneratedOn' ||
593
+ key === 'Week' ||
594
+ key === 'ViolatedSpotDate' ||
595
+ key === 'ViolatingSpotDate') {
596
+ filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
597
+ }
598
+ else if (key === 'period') {
599
+ filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
600
+ }
601
+ else if (key === 'StartTimeForFilter' ||
602
+ key === 'EndTimeForFilter' ||
603
+ key == 'timeoutTime' ||
604
+ key === 'startTimeForFilter' ||
605
+ key === 'endTimeForFilter' ||
606
+ key === 'start_time_for_filter' ||
607
+ key === 'end_time_for_filter' ||
608
+ key == 'time' ||
609
+ key == 'StartTime' ||
610
+ key == 'EndTime') {
611
+ filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
612
+ }
613
+ else if (key === 'startEndTimeMulti' || key == 'startEndTime' || key === 'TimeBand') {
614
+ filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
615
+ }
616
+ else if (value.length > 0) {
617
+ filteredData = filteredData.filter((u) => value.includes(u[key]));
618
+ }
619
+ return filteredData;
620
+ }
621
+ isObjectInTheRange(obj, value, key) {
622
+ let objVal = obj[key];
623
+ let dayjsDate = dayjs(objVal);
624
+ if (typeof value.fromDate === 'string' && typeof value.toDate === 'string') {
625
+ value.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.fromDate, 'DD/MM/YYYY')));
626
+ value.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.toDate, 'DD/MM/YYYY')));
627
+ }
628
+ let isDateSameAsStartOfTheRange = value.fromDate.isSame(objVal);
629
+ let isDateSameAsEndOfTheRange = value.toDate.isSame(objVal);
630
+ let isDateBetweenTheStartAndEndOfRange = dayjsDate.isBetween(value.fromDate, value.toDate);
631
+ return isDateSameAsStartOfTheRange || isDateSameAsEndOfTheRange || isDateBetweenTheStartAndEndOfRange;
632
+ }
633
+ updateStateOfTheCurrentFilterTab(sortMap) {
634
+ let activeKey = this.selectedRadio;
635
+ let keyArr = [];
636
+ Object.keys(this.isFilterSortActive).forEach((key) => {
637
+ if (key.includes(activeKey)) {
638
+ keyArr = key.split(',');
639
+ this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
640
+ }
641
+ });
642
+ }
643
+ updateStateOfAllTheKeys(sortMap) {
644
+ Object.keys(this.isFilterSortActive).forEach((key) => {
645
+ let keyArr = key.split(',');
646
+ this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
647
+ });
648
+ }
649
+ incrementHour(value) {
650
+ if (value == '') {
651
+ value = 1;
652
+ }
653
+ else if (parseInt(value) < 12) {
654
+ value = parseInt(value) + 1;
655
+ }
656
+ else {
657
+ value = 1;
658
+ }
659
+ return value;
660
+ }
661
+ decrementHour(value) {
662
+ if (value == '') {
663
+ value = 12;
664
+ }
665
+ else if (parseInt(value) > 1) {
666
+ value = parseInt(value) - 1;
667
+ }
668
+ else {
669
+ value = 12;
670
+ }
671
+ return value;
672
+ }
673
+ incrementMinute(value) {
674
+ // increment to nearest proper interval(15,30,45)
675
+ let min = parseInt(value);
676
+ if (min <= 14) {
677
+ value = '15';
678
+ }
679
+ else if (min >= 15 && min <= 29) {
680
+ value = '30';
681
+ }
682
+ else if (min >= 30 && min <= 44) {
683
+ value = '45';
684
+ }
685
+ else if (min >= 45) {
686
+ value = '00';
687
+ }
688
+ return value;
689
+ }
690
+ decrementMinute(value) {
691
+ let min = parseInt(value);
692
+ if (min > 0 && min <= 15) {
693
+ value = '00';
694
+ }
695
+ else if (min >= 16 && min <= 30) {
696
+ value = '15';
697
+ }
698
+ else if (min >= 31 && min <= 45) {
699
+ value = '30';
700
+ }
701
+ else if (min > 45 || min == 0) {
702
+ value = '45';
703
+ }
704
+ return value;
705
+ }
706
+ //========================================Checkbox method=============================================================//
707
+ disableActiveFilterClearButton() {
708
+ let selectedFilterSet = new Set(this.appliedFiltersArray);
709
+ let currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
710
+ let isSortPresent = this.annaSortService.columnSortState &&
711
+ this.annaSortService.columnSortState.size > 0 &&
712
+ currentColumnSortFilter != SortTypeEnum.DEFAULT;
713
+ return !(selectedFilterSet.has(this.selectedRadio) || isSortPresent);
714
+ }
715
+ getColumnSortStateForSelectedRadio() {
716
+ let currentColumnSortFilter = this.annaSortService.columnSortState &&
717
+ this.annaSortService.columnSortState.has(this.selectedRadio) &&
718
+ this.annaSortService.columnSortState.get(this.selectedRadio);
719
+ currentColumnSortFilter = currentColumnSortFilter ? currentColumnSortFilter : SortTypeEnum.DEFAULT;
720
+ return currentColumnSortFilter;
721
+ }
722
+ createListForCheckboxFilter(header, optionData) {
723
+ let tooltipOptions = this.getTooltipModelFromOptionData(optionData, header);
724
+ this.selectUnselectListCheckbox(tooltipOptions, header);
725
+ this.formatNullOptionToSpecifiedString(tooltipOptions, '-');
726
+ return tooltipOptions;
727
+ }
728
+ getTooltipModelFromOptionData(optionData, header) {
729
+ let uniqOptionData = uniq(optionData.map((item) => item[header]));
730
+ return uniqOptionData.map((item, index) => new TooltipModel(item, index + 1));
731
+ }
732
+ selectUnselectListCheckbox(tooltipOptions, header) {
733
+ if (this.tooltipSelectedMap.has(header)) {
734
+ let selectedValueSet = new Set(this.tooltipSelectedMap.get(header));
735
+ tooltipOptions.forEach((item) => (item.isSelected = selectedValueSet.has(item.value) ? true : false));
736
+ }
737
+ else {
738
+ tooltipOptions.forEach((item) => (item.isSelected = true));
739
+ }
740
+ }
741
+ formatNullOptionToSpecifiedString(tooltipOptions, formattedString) {
742
+ let index = tooltipOptions.findIndex((item) => item.value == null);
743
+ if (index != -1) {
744
+ tooltipOptions[index].label = formattedString;
745
+ }
746
+ }
747
+ getClonedTooltipAndTooltipOption(tooltipOptions, sortByString) {
748
+ let [selectedItems, unselectedItems] = this.getSelectedAndUnselectedItems(tooltipOptions);
749
+ let sortedSelectedItems = sortBy(selectedItems, sortByString);
750
+ let sortedUnselectedItems = sortBy(unselectedItems, sortByString);
751
+ let clonedTooltipOptions = [...sortedSelectedItems, ...sortedUnselectedItems];
752
+ let updatedTooltipOptions = cloneDeep(clonedTooltipOptions);
753
+ return [clonedTooltipOptions, updatedTooltipOptions, selectedItems, unselectedItems];
754
+ }
755
+ getHeightOfCheckboxTooltipFilter(dataLength, margin) {
756
+ return dataLength > 6 ? 200 : 26.03 * dataLength + margin * dataLength + margin;
757
+ }
758
+ unCheckAllCheckbox(tooltipOptions, clonedTooltipOptions) {
759
+ tooltipOptions.forEach((item) => {
760
+ item.isSelected = false;
761
+ let index = clonedTooltipOptions.findIndex((opt) => opt.id == item.id);
762
+ clonedTooltipOptions[index].isSelected = false;
763
+ });
764
+ }
765
+ selectAllCheckbox(tooltipOptions, clonedTooltipOptions) {
766
+ tooltipOptions.forEach((item) => {
767
+ item.isSelected = true;
768
+ let index = clonedTooltipOptions.findIndex((opt) => opt.id == item.id);
769
+ clonedTooltipOptions[index].isSelected = true;
770
+ });
771
+ }
772
+ selectUnselectCheckbox(data, clonedTooltipOptions) {
773
+ data.isSelected = !data.isSelected;
774
+ let index = clonedTooltipOptions.findIndex((item) => item.id == data.id);
775
+ clonedTooltipOptions[index].isSelected = data.isSelected;
776
+ }
777
+ getSelectedAndUnselectedItems(tooltipOptions) {
778
+ let selectedItems = tooltipOptions.filter((item) => item.isSelected);
779
+ let unselectedItems = tooltipOptions.filter((item) => !item.isSelected);
780
+ return [selectedItems, unselectedItems];
781
+ }
782
+ getCheckboxPreviousSelectedValue(clonedTableData) {
783
+ let previousSelectedValue = [];
784
+ if (this.tooltipSelectedMap.has(this.selectedRadio)) {
785
+ previousSelectedValue = this.tooltipSelectedMap.get(this.selectedRadio);
786
+ if (!this.initialValueMap.has(this.selectedRadio)) {
787
+ let initialValue = sortBy(uniq(clonedTableData.map((item) => item[this.selectedRadio])));
788
+ this.initialValueMap.set(this.selectedRadio, initialValue);
789
+ }
790
+ }
791
+ else if (this.initialValueMap.has(this.selectedRadio)) {
792
+ previousSelectedValue = this.initialValueMap.get(this.selectedRadio);
793
+ }
794
+ else {
795
+ previousSelectedValue = sortBy(uniq(clonedTableData.map((item) => item[this.selectedRadio])));
796
+ this.initialValueMap.set(this.selectedRadio, previousSelectedValue);
797
+ }
798
+ return previousSelectedValue;
799
+ }
800
+ getCheckboxCurrentSelectedValue(searchedString, tooltipOptions) {
801
+ let currentSelectedValue = [];
802
+ if (tooltipOptions) {
803
+ currentSelectedValue = sortBy(tooltipOptions.filter((item) => item.isSelected).map((item) => item.value));
804
+ if (!searchedString &&
805
+ currentSelectedValue.length == tooltipOptions.length &&
806
+ this.initialValueMap.has(this.selectedRadio)) {
807
+ currentSelectedValue = this.initialValueMap.get(this.selectedRadio);
808
+ }
809
+ }
810
+ let blankIndex = currentSelectedValue.findIndex((item) => item == null);
811
+ if (blankIndex != -1) {
812
+ currentSelectedValue = sortBy(currentSelectedValue);
813
+ }
814
+ return currentSelectedValue;
815
+ }
816
+ checkIfSortingChanged(tempSortOrder) {
817
+ let currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
818
+ let isSortChanged = tempSortOrder != null && tempSortOrder != currentColumnSortFilter;
819
+ return isSortChanged;
820
+ }
821
+ getFilteredOptionAsBoldString(str, clonedTooltipOptions) {
822
+ let tooltipOptions = cloneDeep(clonedTooltipOptions.filter((item) => item.label.toString().toLowerCase().includes(str.toLowerCase())));
823
+ tooltipOptions.forEach((element) => {
824
+ element.label = this.boldString(element.label, str);
825
+ });
826
+ return tooltipOptions;
827
+ }
828
+ boldString(str, find) {
829
+ let indexes = this.getIndicesOf(find, str, false);
830
+ indexes.forEach((item, index) => {
831
+ let startIndex = item + index * 7; //Multiplying by 7 as there are 7char: <b></b>
832
+ let endIndex = startIndex + find.length;
833
+ let strToBeReplaced = str.substring(startIndex, endIndex);
834
+ str = str.replace(strToBeReplaced, '<b>' + strToBeReplaced + '</b>');
835
+ });
836
+ return str;
837
+ }
838
+ getIndicesOf(searchStr, str, caseSensitive) {
839
+ var searchStrLen = searchStr.length;
840
+ if (searchStrLen == 0) {
841
+ return [];
842
+ }
843
+ var startIndex = 0, index, indices = [];
844
+ if (!caseSensitive) {
845
+ str = str.toLowerCase();
846
+ searchStr = searchStr.toLowerCase();
847
+ }
848
+ while ((index = str.indexOf(searchStr, startIndex)) > -1) {
849
+ indices.push(index);
850
+ startIndex = index + searchStrLen;
851
+ }
852
+ return indices;
853
+ }
854
+ disableAllBtnsWhenThereAreNoFilteredResults() {
855
+ // [selectedCheckboxOptionsCount, disableCheckboxApply, disableClearAll, disableSelectAll];
856
+ return [0, true, true, true];
857
+ }
858
+ //============================================================Calendar filter===========================================================//
859
+ createRangeForTheDateFilter(optionData) {
860
+ let minMaxDate;
861
+ //When you want to use startDate and endDate combined as single column then use Period.
862
+ if (this.selectedRadio == 'period' ||
863
+ this.selectedRadio == 'buyerFlightDates' ||
864
+ this.selectedRadio == 'trafficFlightDates') {
865
+ minMaxDate = this.createStartEndDateRange(optionData);
866
+ }
867
+ else {
868
+ minMaxDate = this.returnMinAndMaxDate(optionData, this.selectedRadio);
869
+ }
870
+ return minMaxDate;
871
+ }
872
+ createStartEndDateRange(optionData) {
873
+ let minStartDate = this.returnMinAndMaxDate(optionData, 'startDate');
874
+ let maxEndDate = this.returnMinAndMaxDate(optionData, 'endDate');
875
+ return [minStartDate[0], maxEndDate[1]];
876
+ }
877
+ getMinAndMaxDateRangeForCalendar(minMaxDate, parsingFormat) {
878
+ let calendarMinEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
879
+ let calendarMaxEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
880
+ return [calendarMinEnabledDate, calendarMaxEnabledDate];
881
+ }
882
+ getSelectedDateForCalendar(minMaxDate, parsingFormat, minDate, maxDate) {
883
+ let selectedMinDate;
884
+ let selectedMaxDate;
885
+ if (this.tooltipSelectedMap.has(this.selectedRadio)) {
886
+ let selectedDateObj = this.tooltipSelectedMap.get(this.selectedRadio);
887
+ if (selectedDateObj.fromDate.isAfter(minMaxDate[0])) {
888
+ selectedMinDate = this.dateTimeFormatService.convertToNgbDate(selectedDateObj.fromDate, parsingFormat);
889
+ }
890
+ else {
891
+ selectedMinDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
892
+ }
893
+ if (selectedDateObj.toDate.isAfter(minMaxDate[1])) {
894
+ selectedMaxDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
895
+ }
896
+ else {
897
+ selectedMaxDate = this.dateTimeFormatService.convertToNgbDate(selectedDateObj.toDate, parsingFormat);
898
+ }
899
+ }
900
+ else {
901
+ selectedMinDate = cloneDeep(minDate);
902
+ selectedMaxDate = cloneDeep(maxDate);
903
+ }
904
+ return [selectedMinDate, selectedMaxDate];
905
+ }
906
+ getPreviousSelectedDatesForCalendar(optionData) {
907
+ let previousSelectedDate = { fromDate: null, toDate: null };
908
+ if (this.tooltipSelectedMap.has(this.selectedRadio)) {
909
+ previousSelectedDate = this.tooltipSelectedMap.get(this.selectedRadio);
910
+ if (!this.initialValueMap.has(this.selectedRadio)) {
911
+ this.setInitialValueMapForDateFilter(optionData);
912
+ }
913
+ }
914
+ else if (this.initialValueMap.has(this.selectedRadio)) {
915
+ previousSelectedDate = this.initialValueMap.get(this.selectedRadio);
916
+ }
917
+ else {
918
+ this.setInitialValueMapForDateFilter(optionData);
919
+ previousSelectedDate = this.initialValueMap.get(this.selectedRadio);
920
+ }
921
+ return previousSelectedDate;
922
+ }
923
+ setInitialValueMapForDateFilter(optionData) {
924
+ let minMaxDate = this.createRangeForTheDateFilter(optionData);
925
+ let selectedDate = { fromDate: minMaxDate[0], toDate: minMaxDate[1] };
926
+ this.initialValueMap.set(this.selectedRadio, selectedDate);
927
+ }
928
+ getCurrentSelectedDatesForCalendar(currentSelectedDate, minDate, maxDate) {
929
+ let fromDate = {
930
+ year: currentSelectedDate.fromDate.year,
931
+ month: currentSelectedDate.fromDate.month,
932
+ day: currentSelectedDate.fromDate.day,
933
+ };
934
+ let toDate = {
935
+ year: currentSelectedDate.toDate.year,
936
+ month: currentSelectedDate.toDate.month,
937
+ day: currentSelectedDate.toDate.day,
938
+ };
939
+ if (isEqual(minDate, fromDate) && isEqual(maxDate, toDate) && this.initialValueMap.has(this.selectedRadio)) {
940
+ currentSelectedDate = this.initialValueMap.get(this.selectedRadio);
941
+ }
942
+ else {
943
+ currentSelectedDate.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDate.fromDate));
944
+ currentSelectedDate.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDate.toDate));
945
+ }
946
+ return currentSelectedDate;
947
+ }
948
+ //==================================================================SLIDER===========================================================//
949
+ getSliderTranslateFuncVal(header, currencySet) {
950
+ let translateFunc;
951
+ if (currencySet.has(header)) {
952
+ translateFunc = 'currency';
953
+ }
954
+ else if (header == 'postedAudPercent' || header == 'parentRowShares' || header == 'parentRowPutPercent') {
955
+ translateFunc = 'percent';
956
+ }
957
+ else {
958
+ translateFunc = 'normal';
959
+ }
960
+ return translateFunc;
961
+ }
962
+ getSliderOptions(optionsData, translateFunc, header) {
963
+ let minValue = this.returnMaxAndMinValue(optionsData, header, true);
964
+ let maxValue = this.returnMaxAndMinValue(optionsData, header, false);
965
+ let obj = this.setOptionValues(minValue, maxValue);
966
+ if (translateFunc === 'normal') {
967
+ obj.translate = this.normalTranslateFunction;
968
+ }
969
+ else if (translateFunc === 'percent') {
970
+ obj.translate = this.percentTranslateFunction;
971
+ }
972
+ else if (translateFunc === 'currency') {
973
+ obj.translate = this.currencyTranslateFunction;
974
+ }
975
+ return obj;
976
+ }
977
+ setSelectedRangeForSlider(header, options) {
978
+ let sliderMinValue;
979
+ let sliderMaxValue;
980
+ if (this.tooltipSelectedMap.has(header)) {
981
+ let selectedObj = this.tooltipSelectedMap.get(header);
982
+ sliderMinValue = selectedObj.min < options.floor ? options.floor : selectedObj.min;
983
+ sliderMaxValue = selectedObj.max < options.ceil ? selectedObj.max : options.ceil;
984
+ }
985
+ else {
986
+ sliderMinValue = options.floor;
987
+ sliderMaxValue = options.ceil;
988
+ }
989
+ return [sliderMinValue, sliderMaxValue];
990
+ }
991
+ isValueInRange(options, val) {
992
+ return options.floor <= val && val <= options.ceil;
993
+ }
994
+ getPreviousSelectedValueForSlider(clonedData) {
995
+ let previousSliderData = { min: '', max: '' };
996
+ if (this.tooltipSelectedMap.has(this.selectedRadio)) {
997
+ previousSliderData = this.tooltipSelectedMap.get(this.selectedRadio);
998
+ if (!this.initialValueMap.has(this.selectedRadio)) {
999
+ this.setInitialValueMapForSliderFilter(clonedData);
1000
+ }
1001
+ }
1002
+ else if (this.initialValueMap.has(this.selectedRadio)) {
1003
+ previousSliderData = this.initialValueMap.get(this.selectedRadio);
1004
+ }
1005
+ else {
1006
+ this.setInitialValueMapForSliderFilter(clonedData);
1007
+ previousSliderData = this.initialValueMap.get(this.selectedRadio);
1008
+ }
1009
+ return previousSliderData;
1010
+ }
1011
+ setInitialValueMapForSliderFilter(clonedData) {
1012
+ let minValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, true);
1013
+ let maxValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, false);
1014
+ let sliderData = { min: minValue, max: maxValue };
1015
+ this.initialValueMap.set(this.selectedRadio, sliderData);
1016
+ }
1017
+ getCurrentSelectedValueForSlider(minEnteredVal, maxEnteredVal, options) {
1018
+ let currentSliderData = { min: null, max: null };
1019
+ currentSliderData.max = maxEnteredVal;
1020
+ currentSliderData.min = minEnteredVal;
1021
+ if (currentSliderData.min == options.floor &&
1022
+ currentSliderData.max == options.ceil &&
1023
+ this.initialValueMap.has(this.selectedRadio)) {
1024
+ currentSliderData = this.initialValueMap.get(this.selectedRadio);
1025
+ }
1026
+ return currentSliderData;
1027
+ }
1028
+ //==============================================================TIME====================================================================//
1029
+ getSelectedTimeRange(header, clonedData) {
1030
+ let selectedFromTime;
1031
+ let selectedToTime;
1032
+ if (this.tooltipSelectedMap.has(header)) {
1033
+ selectedFromTime = this.tooltipSelectedMap.get(header).fromTime;
1034
+ selectedToTime = this.tooltipSelectedMap.get(header).toTime;
1035
+ }
1036
+ else {
1037
+ this.setInitialValueMapForTimeFilter(clonedData, header);
1038
+ selectedFromTime = this.initialValueMap.get(header).fromTime;
1039
+ selectedToTime = this.initialValueMap.get(header).toTime;
1040
+ }
1041
+ if (selectedFromTime != undefined || selectedToTime != undefined) {
1042
+ selectedFromTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedFromTime, true);
1043
+ selectedToTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedToTime, true);
1044
+ }
1045
+ else {
1046
+ selectedFromTime = ['-', '-', '-'];
1047
+ selectedToTime = ['-', '-', '-'];
1048
+ }
1049
+ return [selectedFromTime, selectedToTime];
1050
+ }
1051
+ setInitialValueMapForTimeFilter(clonedData, key) {
1052
+ if (key == 'startEndTime' || key == 'TimeBand') {
1053
+ this.setInitialValueForStartAndEndTimeRange(clonedData, key);
1054
+ }
1055
+ else {
1056
+ this.setInitialValueForStartOrEndTimeRange(clonedData, key);
1057
+ }
1058
+ }
1059
+ //use for filter where we have start and end time range in one filter
1060
+ //startEndTime: ["6 - 7A", "06: 00 : 00" , "07:00:00"]
1061
+ setInitialValueForStartAndEndTimeRange(clonedData, key) {
1062
+ let includeMulti = clonedData.findIndex((obj) => obj[key][0] == '<multi>') != -1;
1063
+ let includeZero = clonedData.findIndex((obj) => obj[key][0] == '0') != -1;
1064
+ let includeTimeRange = clonedData.findIndex((obj) => obj[key][0] != '0' && obj[key][0] != '<multi>') != -1;
1065
+ let filteredStartTime = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj['startTime']));
1066
+ let filteredEndTime = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj['endTime']));
1067
+ let startTimeArr = map(filteredStartTime, 'startTime');
1068
+ let endTimeArr = map(filteredEndTime, 'endTime');
1069
+ startTimeArr.sort((a, b) => {
1070
+ return this.dateTimeFormatService.sortByTimeAscending(a, b);
1071
+ });
1072
+ endTimeArr.sort((a, b) => {
1073
+ return this.dateTimeFormatService.sortByTimeDescending(a, b);
1074
+ });
1075
+ let obj = {
1076
+ fromTime: startTimeArr[0],
1077
+ toTime: endTimeArr[0],
1078
+ includeMulti: includeMulti,
1079
+ includeZero: includeZero,
1080
+ includeTimeRange: includeTimeRange,
1081
+ };
1082
+ this.initialValueMap.set(key, obj);
1083
+ }
1084
+ //use for the filters where we have different filter for start and end time
1085
+ //startTime: "06:00:00"
1086
+ setInitialValueForStartOrEndTimeRange(clonedData, key) {
1087
+ let includeMulti = clonedData.findIndex((obj) => obj[key] == '<multi>') != -1;
1088
+ let includeZero = clonedData.findIndex((obj) => obj[key] == '0') != -1;
1089
+ let includeTimeRange = clonedData.findIndex((obj) => obj[key] != '0' && obj[key] != '<multi>') != -1;
1090
+ let data = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj[key]));
1091
+ let timeArr = map(data, key);
1092
+ timeArr.sort((a, b) => {
1093
+ return this.dateTimeFormatService.sortByTimeAscending(a, b);
1094
+ });
1095
+ let obj = {
1096
+ fromTime: timeArr[0],
1097
+ toTime: timeArr[timeArr.length - 1],
1098
+ includeMulti: includeMulti,
1099
+ includeZero: includeZero,
1100
+ includeTimeRange: includeTimeRange,
1101
+ };
1102
+ this.initialValueMap.set(key, obj);
1103
+ }
1104
+ selectUnselectTimeFilterCheckbox(key, optionsData) {
1105
+ let showMultiTimeCheckbox = false;
1106
+ let showZeroTimeCheckbox = false;
1107
+ let showEnterTimeCheckbox = false;
1108
+ let multiTimeCheckboxChecked = false;
1109
+ let zeroTimeCheckboxChecked = false;
1110
+ let enterTimeCheckboxChecked = false;
1111
+ let selectedTimeObj;
1112
+ if (this.tooltipSelectedMap.has(key)) {
1113
+ selectedTimeObj = this.tooltipSelectedMap.get(key);
1114
+ }
1115
+ else {
1116
+ selectedTimeObj = this.initialValueMap.get(key);
1117
+ }
1118
+ let timeArr;
1119
+ if (key == 'startEndTime' || key == 'TimeBand') {
1120
+ timeArr = optionsData.map((item) => item[key][0]);
1121
+ }
1122
+ else {
1123
+ timeArr = optionsData.map((item) => item[key]);
1124
+ }
1125
+ if (timeArr.findIndex((val) => val == '0') != -1) {
1126
+ showZeroTimeCheckbox = true;
1127
+ zeroTimeCheckboxChecked = selectedTimeObj.includeZero;
1128
+ }
1129
+ if (timeArr.findIndex((val) => val == '<multi>') != -1) {
1130
+ showMultiTimeCheckbox = true;
1131
+ multiTimeCheckboxChecked = selectedTimeObj.includeMulti;
1132
+ }
1133
+ if (showZeroTimeCheckbox || showMultiTimeCheckbox) {
1134
+ showEnterTimeCheckbox = true;
1135
+ }
1136
+ if (timeArr.findIndex((val) => val != '<multi>' && val != '0') != -1) {
1137
+ enterTimeCheckboxChecked = selectedTimeObj?.includeTimeRange;
1138
+ }
1139
+ return {
1140
+ showMultiTimeCheckbox: showMultiTimeCheckbox,
1141
+ showZeroTimeCheckbox: showZeroTimeCheckbox,
1142
+ showEnterTimeCheckbox: showEnterTimeCheckbox,
1143
+ multiTimeCheckboxChecked: multiTimeCheckboxChecked,
1144
+ zeroTimeCheckboxChecked: zeroTimeCheckboxChecked,
1145
+ enterTimeCheckboxChecked: enterTimeCheckboxChecked,
1146
+ };
1147
+ }
1148
+ checkIfStartTimeIsAfterEndTime(startTime, endTime) {
1149
+ let timeFormat = 'HH:mm:ss';
1150
+ let startTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ':' + startTime[1] + ' ' + startTime[2], true);
1151
+ let startTime24HrFormat = startTime24HrFormatArr[0] + ':' + startTime24HrFormatArr[1] + ':00';
1152
+ let endTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ':' + endTime[1] + ' ' + endTime[2], true);
1153
+ let endTime24HrFormat = endTime24HrFormatArr[0] + ':' + endTime24HrFormatArr[1] + ':00';
1154
+ return dayjs(startTime24HrFormat, timeFormat).isAfter(dayjs(endTime24HrFormat, timeFormat));
1155
+ }
1156
+ getPreviousSelectedTimeFilter() {
1157
+ let previousSelectedTimeFilter;
1158
+ if (this.tooltipSelectedMap.has(this.selectedRadio)) {
1159
+ previousSelectedTimeFilter = this.tooltipSelectedMap.get(this.selectedRadio);
1160
+ }
1161
+ else if (this.initialValueMap.has(this.selectedRadio)) {
1162
+ previousSelectedTimeFilter = this.initialValueMap.get(this.selectedRadio);
1163
+ }
1164
+ return previousSelectedTimeFilter;
1165
+ }
1166
+ getCurrentSelectedTimeFilter(startTime, endTime, includeMulti, includeZero, includeTimeRange) {
1167
+ let currentSelectedTimeFilter;
1168
+ let fromTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ':' + startTime[1] + ' ' + startTime[2], true);
1169
+ let fromTime24HrFormat = fromTime24HrFormatArr[0] + ':' + fromTime24HrFormatArr[1] + ':00';
1170
+ let toTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ':' + endTime[1] + ' ' + endTime[2], true);
1171
+ let toTime24HrFormat = toTime24HrFormatArr[0] + ':' + toTime24HrFormatArr[1] + ':00';
1172
+ currentSelectedTimeFilter = {
1173
+ fromTime: fromTime24HrFormat,
1174
+ toTime: toTime24HrFormat,
1175
+ includeMulti: includeMulti,
1176
+ includeZero: includeZero,
1177
+ includeTimeRange: includeTimeRange,
1178
+ };
1179
+ return currentSelectedTimeFilter;
1180
+ }
1181
+ incrementHourInput(arr) {
1182
+ if (arr[0] == '') {
1183
+ arr[0] = 1;
1184
+ }
1185
+ else if (parseInt(arr[0]) < 12) {
1186
+ arr[0] = parseInt(arr[0]) + 1;
1187
+ }
1188
+ else {
1189
+ arr[0] = 1;
1190
+ }
1191
+ }
1192
+ decrementHourInput(arr) {
1193
+ if (arr[0] == '') {
1194
+ arr[0] = 12;
1195
+ }
1196
+ else if (parseInt(arr[0]) > 1) {
1197
+ arr[0] = parseInt(arr[0]) - 1;
1198
+ }
1199
+ else {
1200
+ arr[0] = 12;
1201
+ }
1202
+ }
1203
+ incrementMinuteInput(arr) {
1204
+ // increment to nearest proper interval(15,30,45)
1205
+ let min = parseInt(arr[1]);
1206
+ if (min <= 14) {
1207
+ arr[1] = '15';
1208
+ }
1209
+ else if (min >= 15 && min <= 29) {
1210
+ arr[1] = '30';
1211
+ }
1212
+ else if (min >= 30 && min <= 44) {
1213
+ arr[1] = '45';
1214
+ }
1215
+ else if (min >= 45) {
1216
+ arr[1] = '00';
1217
+ }
1218
+ }
1219
+ decrementMinuteInput(arr) {
1220
+ let min = parseInt(arr[1]);
1221
+ if (min > 0 && min <= 15) {
1222
+ arr[1] = '00';
1223
+ }
1224
+ else if (min >= 16 && min <= 30) {
1225
+ arr[1] = '15';
1226
+ }
1227
+ else if (min >= 31 && min <= 45) {
1228
+ arr[1] = '30';
1229
+ }
1230
+ else if (min > 45 || min == 0) {
1231
+ arr[1] = '45';
1232
+ }
1233
+ }
1234
+ incrementOrDecrementHour(increment, time) {
1235
+ if (increment) {
1236
+ this.incrementHourInput(time);
1237
+ }
1238
+ else {
1239
+ this.decrementHourInput(time);
1240
+ }
1241
+ }
1242
+ incrementOrDecrementMin(increment, time) {
1243
+ if (increment) {
1244
+ this.incrementMinuteInput(time);
1245
+ }
1246
+ else {
1247
+ this.decrementMinuteInput(time);
1248
+ }
1249
+ }
1250
+ isHourValueInvalid(hr) {
1251
+ return hr.length == 0 || !+hr || 1 > parseInt(hr) || parseInt(hr) > 12 || hr.includes('.');
1252
+ }
1253
+ isMinuteValueInvalid(min) {
1254
+ return (min.length != 2 || (!+min && min != '00') || 0 > parseInt(min) || parseInt(min) > 59 || min.includes('.'));
1255
+ }
1256
+ //=============================================================SORT======================================================================//
1257
+ updateSortMap(tempSortOrder, tableData, isLurAndCsrComponent) {
1258
+ this.annaSortService.columnSortState = new Map();
1259
+ this.annaSortService.columnSortState.set(this.selectedRadio, tempSortOrder);
1260
+ let sortedTableData = this.annaSortService.applySorting(this.selectedRadio, tempSortOrder, tableData, isLurAndCsrComponent);
1261
+ return sortedTableData;
1262
+ }
1263
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }, { token: i2.AnnaSortService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1264
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, providedIn: 'root' }); }
1265
+ }
1266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, decorators: [{
1267
+ type: Injectable,
1268
+ args: [{
1269
+ providedIn: 'root',
1270
+ }]
1271
+ }], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }, { type: i2.AnnaSortService }]; } });
1272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLE1BQU0sTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQVksWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFLNUQsTUFBTSxPQUFPLGlCQUFpQjthQXNDWixlQUFVLEdBQUcsRUFBRSxBQUFMLENBQU07SUFJOUIsWUFDWSxxQkFBZ0QsRUFDaEQsZUFBZ0M7UUFEaEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUEyQjtRQUNoRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUEzQzVDLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JB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UUFDNUIsT0FBTyxDQUNILEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQzVHLENBQUM7SUFDTixDQUFDO0lBRUQsMklBQTJJO0lBQzNJLGFBQWEsQ0FBQyxhQUF1QixFQUFFLFNBQWdCLEVBQUUsb0JBQTZCO1FBQ2xGLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUUsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQ25ELElBQUksQ0FBQyxhQUFhLEVBQ2xCLGFBQWEsRUFDYixTQUFTLEVBQ1Qsb0JBQW9CLENBQ3ZCLENBQUM7UUFDRixPQUFPLGVBQWUsQ0FBQztJQUMzQixDQUFDOytHQWo4Q1EsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGZCxNQUFNOzs0RkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXItc2xpZGVyL25neC1zbGlkZXInO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBUaGlyZCBwYXJ0eSBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBtaW4sIG1heCwgbWFwLCBzb3J0QnksIHVuaXEsIGNsb25lRGVlcCwgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCBDdXN0b21QYXJzZUZvcm1hdCBmcm9tICdkYXlqcy9wbHVnaW4vY3VzdG9tUGFyc2VGb3JtYXQnO1xyXG5pbXBvcnQgbWluTWF4IGZyb20gJ2RheWpzL3BsdWdpbi9taW5NYXgnO1xyXG5pbXBvcnQgaXNCZXR3ZWVuIGZyb20gJ2RheWpzL3BsdWdpbi9pc0JldHdlZW4nO1xyXG5pbXBvcnQgeyBTb3J0VHlwZSwgU29ydFR5cGVFbnVtIH0gZnJvbSAnLi4vbW9kZWxzL2FubmEtc29ydC5tb2RlbCc7XHJcblxyXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSwgTmdiRGF0ZVR5cGUgfSBmcm9tICcuL2FubmEtZGF0ZS10aW1lLWZvcm1hdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQW5uYVNvcnRTZXJ2aWNlIH0gZnJvbSAnLi9hbm5hLXNvcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvb2x0aXBNb2RlbCB9IGZyb20gJy4uL21vZGVscy9hbm5hLXRvb2x0aXAubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5uYUZpbHRlclNlcnZpY2Uge1xyXG4gICAgdG9vbHRpcE1hcCA9IG5ldyBNYXAoKTtcclxuICAgIHRvb2x0aXBTZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTtcclxuICAgIGluaXRpYWxWYWx1ZU1hcDogTWFwPHN0cmluZywgYW55PjtcclxuICAgIHRyYW5zbGF0ZUZ1bmM6IHN0cmluZztcclxuICAgIHNlbGVjdGVkUmFkaW86IHN0cmluZztcclxuICAgIHN1YlJhZGlvQnV0dG9uOiBzdHJpbmc7XHJcblxyXG4gICAgY2FsZW5kYXJTZXQ6IFNldDxzdHJpbmc+O1xyXG4gICAgc2xpZGVyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICAgIHRpbWVTZXQ6IFNldDxzdHJpbmc+O1xyXG5cclxuICAgIGluY2x1ZGVNdWx0aVRpbWU6IGJvb2xlYW47XHJcbiAgICBpbmNsdWRlWmVyb1RpbWU6IGJvb2xlYW47XHJcbiAgICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuO1xyXG5cclxuICAgIGFwcGxpZWRGaWx0ZXJzQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgICBmbGlnaHREYXRlUmFuZ2U6IHsgbWluU2VsZWN0ZWREYXRlOiBhbnk7IG1heFNlbGVjdGVkRGF0ZTogYW55IH07XHJcbiAgICBzbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9O1xyXG4gICAgbmd4U2xpZGVyT2JqOiBPcHRpb25zO1xyXG4gICAgc2xpZGVyQ3VycmVuY3lTZXQgPSBuZXcgU2V0KFtcclxuICAgICAgICAnYm9va2VkJyxcclxuICAgICAgICAnY3BwJyxcclxuICAgICAgICAnY3BtJyxcclxuICAgICAgICAncmN2UHJlZW1wdCcsXHJcbiAgICAgICAgJ29zUHJlZW1wdCcsXHJcbiAgICAgICAgJ3Bvc3RlZEFkdScsXHJcbiAgICAgICAgJ3NjaGVkdWxlZEFkdScsXHJcbiAgICAgICAgJ2F1ZGllbmNlRGVmaWNpdCcsXHJcbiAgICAgICAgJ1JhdGUnLFxyXG4gICAgICAgICd1c2VyQURVcycsXHJcbiAgICAgICAgJ2J1eWVyQ2hhbmdlcycsXHJcbiAgICAgICAgJ3VzZXJDaGFuZ2VzJyxcclxuICAgICAgICAndXNlck1HJyxcclxuICAgICAgICAndWRWYWx1ZScsXHJcbiAgICAgICAgJ29kVmFsdWUnLFxyXG4gICAgXSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBidWZmZXJTaXplID0gMjA7XHJcbiAgICBpc0ZpbHRlclNvcnRBY3RpdmU6IGFueSA9IHt9O1xyXG4gICAgcmVzZXRGaWx0ZXJTb3J0QWN0aXZlU3RhdHVzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGRhdGVUaW1lRm9ybWF0U2VydmljZTogQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKG1pbk1heCk7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKGlzQmV0d2Vlbik7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKEN1c3RvbVBhcnNlRm9ybWF0KTtcclxuICAgICAgICBjb25zdCBzbGlkZXJBcnIgPSBbXHJcbiAgICAgICAgICAgICdyY3ZQcmVlbXB0JyxcclxuICAgICAgICAgICAgJ29zUHJlZW1wdCcsXHJcbiAgICAgICAgICAgICdyY3ZVbmRlckRseScsXHJcbiAgICAgICAgICAgICdwb3N0ZWRBdWRQZXJjZW50JyxcclxuICAgICAgICAgICAgJ2Jvb2tlZCcsXHJcbiAgICAgICAgICAgICdzcG90cycsXHJcbiAgICAgICAgICAgICdncnAnLFxyXG4gICAgICAgICAgICAnY3BwJyxcclxuICAgICAgICAgICAgJ2ltcHMnLFxyXG4gICAgICAgICAgICAnY3BtJyxcclxuICAgICAgICAgICAgJ29zVW5kZXJEbHknLFxyXG4gICAgICAgICAgICAndG90YWxXZWVrcycsXHJcbiAgICAgICAgICAgICdXZWVrTnVtYmVyJyxcclxuICAgICAgICAgICAgJ1JhdGUnLFxyXG4gICAgICAgICAgICAnT3JkZXJlZFJhdGluZ3NPckltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgJ1Bvc3RlZFJhdGluZ3NPckltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAncG9zdGVkQXVkUGVyY2VudCcsXHJcbiAgICAgICAgICAgICdwb3N0ZWRBZHUnLFxyXG4gICAgICAgICAgICAnc2NoZWR1bGVkQWR1JyxcclxuICAgICAgICAgICAgJ2F1ZGllbmNlRGVmaWNpdCcsXHJcbiAgICAgICAgICAgICdvZmZlcmVkTUdzJyxcclxuICAgICAgICAgICAgJ291dHN0YW5kaW5nUEUnLFxyXG4gICAgICAgICAgICAnb2ZmZXJlZEFEVXMnLFxyXG4gICAgICAgICAgICAndWREZWZpY2l0VmFsdWUnLFxyXG4gICAgICAgICAgICAnYm9va2VkVmFsdWUnLFxyXG4gICAgICAgICAgICAnYm9va2VkU3BvdHMnLFxyXG4gICAgICAgICAgICAndXNlckNoYW5nZXMnLFxyXG4gICAgICAgICAgICAnVURHcnAnLFxyXG4gICAgICAgICAgICAnVURJbXBzJyxcclxuICAgICAgICAgICAgJ09ER3JwJyxcclxuICAgICAgICAgICAgJ09ESW1wcycsXHJcbiAgICAgICAgICAgICd1ZEltcHNQZXJjZW50JyxcclxuICAgICAgICAgICAgJ3VkR3JwUGVyY2VudCcsXHJcbiAgICAgICAgICAgICdvZEltcHNQZXJjZW50JyxcclxuICAgICAgICAgICAgJ29kR3JwUGVyY2VudCcsXHJcbiAgICAgICAgICAgICd1c2VyQURVcycsXHJcbiAgICAgICAgICAgICdidXllckNoYW5nZXMnLFxyXG4gICAgICAgICAgICAndXNlckNoYW5nZXMnLFxyXG4gICAgICAgICAgICAndXNlck1HJyxcclxuICAgICAgICAgICAgJ1dlZWtseUFVUicsXHJcbiAgICAgICAgICAgICdXZWVrbHlBVVJhdGluZ09ySW1wcmVzc2lvbnMnLFxyXG4gICAgICAgICAgICAnTUdzVmFsdWUnLFxyXG4gICAgICAgICAgICAnQURVc1ZhbHVlJyxcclxuICAgICAgICAgICAgJ1VzZXJDcmVkaXRlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ1VzZXJVbnJlc29sdmVkVmFsdWUnLFxyXG4gICAgICAgICAgICAnQnV5ZXJBZGRlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ0J1eWVyRGVsZXRlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ0J1eWVyQ2hhbmdlc1ZhbHVlJyxcclxuICAgICAgICAgICAgJ1VzZXJDaGFuZ2VzVmFsdWUnLFxyXG4gICAgICAgICAgICAnQm9va2VkR1JQT3JJTVBTJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZENQUE9yQ1BNJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZFNwb3RzJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZFJhdGUnLFxyXG4gICAgICAgICAgICAnYXZlcmFnZVJhdGUnLFxyXG4gICAgICAgICAgICAncHJvamVjdGVkSU1QUycsXHJcbiAgICAgICAgICAgICdwcm9qZWN0ZWRSVEcnLFxyXG4gICAgICAgICAgICAnZGVzaXJlZENQTScsXHJcbiAgICAgICAgICAgICdkZXNpcmVkQ1BQJyxcclxuICAgICAgICAgICAgJ2ludmVudG9yeUZpbGxQZXJjZW50YWdlU2FtZVdlZWsnLFxyXG4gICAgICAgICAgICAnaW52ZW50b3J5RmlsbFBlcmNlbnRhZ2VGaW5hbCcsXHJcbiAgICAgICAgICAgICdpbnZlbnRvcnlGaWxsUGVyY2VudGFnZVRpbGxEYXRlJyxcclxuICAgICAgICAgICAgJ2RvbGxhclJhdGVJbXBhY3QnLFxyXG4gICAgICAgICAgICAnZG9sbGFySU1QU0ltcGFjdCcsXHJcbiAgICAgICAgICAgICdJTVBTSW1wYWN0JyxcclxuICAgICAgICAgICAgJ2RvbGxhclJUR0ltcGFjdCcsXHJcbiAgICAgICAgICAgICdSVEdJbXBhY3QnLFxyXG4gICAgICAgICAgICAnQm9va2VkUlRHJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZElNUFMnLFxyXG4gICAgICAgICAgICAnQVVSVEcnLFxyXG4gICAgICAgICAgICAnQVVSVEcnLFxyXG4gICAgICAgICAgICAnUG9zdGVkUmF0aW5nJyxcclxuICAgICAgICAgICAgJ1Bvc3RlZEltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgJ05vcm1hbGl6ZWRPcmRlcmVkUmF0aW5nJyxcclxuICAgICAgICAgICAgJ05vcm1hbGl6ZWRPcmRlcmVkSW1wcmVzc2lvbnMnLFxyXG4gICAgICAgICAgICAnTm9ybWFsaXplZFBvc3RlZFJhdGluZycsXHJcbiAgICAgICAgICAgICdOb3JtYWxpemVkUG9zdGVkSW1wcmVzc2lvbnMnLFxyXG4gICAgICAgICAgICAnQm9va2VkR1JQJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZElNUFNSZXZUYWInLFxyXG4gICAgICAgICAgICAnQm9va2VkQ1BQJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZENQTScsXHJcbiAgICAgICAgICAgICdBVUlNUFMnLFxyXG4gICAgICAgICAgICAnYm9va2VkQW1vdW50VmFsdWUnLFxyXG4gICAgICAgICAgICAnZXF1aXZhbGl6ZWRCb29rZWRBbW91bnRWYWx1ZScsXHJcbiAgICAgICAgICAgICdJTVBTJyxcclxuICAgICAgICAgICAgJ3VkVmFsdWUnLFxyXG4gICAgICAgICAgICAnb2RWYWx1ZScsXHJcbiAgICAgICAgICAgICdWaW9sYXRlZEJvb2tlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ1Zpb2xhdGVkQm9va2VkRVVSVmFsdWUnLFxyXG4gICAgICAgICAgICAnVmlvbGF0aW5nQm9va2VkRVVSVmFsdWUnLFxyXG4gICAgICAgICAgICAnVmlvbGF0aW5nQm9va2VkVmFsdWUnLFxyXG4gICAgICAgICAgICAnUmViYXRlJyxcclxuICAgICAgICAgICAgJ1dlZWtseUFVUicsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUnRnJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1Bvc3RlZFJ0ZycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVJ0ZycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dTdGF0aW9uRXN0aW1hdGVzUnRnJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd0FubmFFc3RpbWF0ZXNJbXBzJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1Bvc3RlZEltcHMnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VJbXBzJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1N0YXRpb25Fc3RpbWF0ZXNJbXBzJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd0FubmFFc3RpbWF0ZXNTaGFyZScsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dQb3N0ZWRTaGFyZScsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVNoYXJlJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd0FubmFFc3RpbWF0ZXNQdXRQZXInLFxyXG4gICAgICAgICAgICAncGFyZW50Um93UG9zdGVkUHV0UGVyJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1JvbGxpbmdBdmVyYWdlUHV0UGVyJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd0FubmFFc3RpbWF0ZXNQdXQnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93UG9zdGVkUHV0JyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1JvbGxpbmdBdmVyYWdlUHV0JyxcclxuICAgICAgICAgICAgJ1Byb2plY3RlZEltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgJ1Byb2plY3RlZFJ0ZycsXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCBjYWxlbmRhckFyciA9IFtcclxuICAgICAgICAgICAgJ3BlcmlvZCcsXHJcbiAgICAgICAgICAgICdBaXJEYXRlJyxcclxuICAgICAgICAgICAgJ2ZsaWdodFN0YXJ0RGF0ZScsXHJcbiAgICAgICAgICAgICdmbGlnaHRFbmREYXRlJyxcclxuICAgICAgICAgICAgJ2RhdGUnLFxyXG4gICAgICAgICAgICAnc3RhcnREYXRlJyxcclxuICAgICAgICAgICAgJ2VuZERhdGUnLFxyXG4gICAgICAgICAgICAncmV2aXNpb25TdGFydERhdGUnLFxyXG4gICAgICAgICAgICAnR2VuZXJhdGVkT24nLFxyXG4gICAgICAgICAgICAnV2VlaycsXHJcbiAgICAgICAgICAgICd0aW1lb3V0RGF0ZScsXHJcbiAgICAgICAgICAgICdWaW9sYXRpbmdTcG90RGF0ZScsXHJcbiAgICAgICAgICAgICdWaW9sYXRlZFNwb3REYXRlJyxcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IHRpbWVBcnIgPSBbXHJcbiAgICAgICAgICAgICdTdGFydFRpbWVGb3JGaWx0ZXInLFxyXG4gICAgICAgICAgICAnRW5kVGltZUZvckZpbHRlcicsXHJcbiAgICAgICAgICAgICd0aW1lJyxcclxuICAgICAgICAgICAgJ3N0YXJ0VGltZUZvckZpbHRlcicsXHJcbiAgICAgICAgICAgICdlbmRUaW1lRm9yRmlsdGVyJyxcclxuICAgICAgICAgICAgJ3N0YXJ0X3RpbWVfZm9yX2ZpbHRlcicsXHJcbiAgICAgICAgICAgICdlbmRfdGltZV9mb3JfZmlsdGVyJyxcclxuICAgICAgICAgICAgJ3N0YXJ0RW5kVGltZU11bHRpJyxcclxuICAgICAgICAgICAgJ3N0YXJ0RW5kVGltZScsXHJcbiAgICAgICAgICAgICd0aW1lb3V0VGltZScsXHJcbiAgICAgICAgICAgICdTdGFydFRpbWUnLFxyXG4gICAgICAgICAgICAnRW5kVGltZScsXHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLnNsaWRlclNldCA9IG5ldyBTZXQoc2xpZGVyQXJyKTtcclxuICAgICAgICB0aGlzLmNhbGVuZGFyU2V0ID0gbmV3IFNldChjYWxlbmRhckFycik7XHJcbiAgICAgICAgdGhpcy50aW1lU2V0ID0gbmV3IFNldCh0aW1lQXJyKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5NYXhBbmRNaW5WYWx1ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcsIGlzTWluOiBib29sZWFuKSB7XHJcbiAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKChvYmopID0+ICFbJycsICctJywgbnVsbF0uaW5jbHVkZXMob2JqW2tleV0pKTtcclxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBkYXRhLm1hcCgoeCkgPT4geFtrZXldKTtcclxuICAgICAgICBsZXQgdmFsdWVUb1JldHVybiA9IGlzTWluID8gbWluKHZhbHVlcykgOiBtYXgodmFsdWVzKTtcclxuICAgICAgICByZXR1cm4gdmFsdWVUb1JldHVybjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5NaW5BbmRNYXhEYXRlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhWycnLCAnLScsIG51bGxdLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcbiAgICAgICAgbGV0IERhdGVBcnIgPSBkYXRhLm1hcCgob2JqKSA9PiBkYXlqcyhvYmpba2V5XSkpO1xyXG4gICAgICAgIGxldCBtaW5EYXRlID0gZGF5anMubWluKERhdGVBcnIpO1xyXG4gICAgICAgIGxldCBtYXhEYXRlID0gZGF5anMubWF4KERhdGVBcnIpO1xyXG5cclxuICAgICAgICByZXR1cm4gW21pbkRhdGUsIG1heERhdGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVG9vbHRpcEFjdGl2ZShoZWFkZXI6IHN0cmluZ1tdLCBzb3J0TWFwOiBNYXA8c3RyaW5nLCBTb3J0VHlwZT4pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgICAgICBsZXQgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclswXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzBdKSAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuICAgICAgICBsZXQgaXNTb3J0TWFwRm9ySGVhZGVyMUFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclsxXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzFdKSAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuXHJcbiAgICAgICAgaWYgKGhlYWRlci5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHNvcnRNYXAuc2l6ZSA+IDAgJiYgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSkgfHwgc2V0LmhhcyhoZWFkZXJbMF0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgKHNvcnRNYXAuc2l6ZSA+IDAgJiYgc29ydE1hcC5oYXMoaGVhZGVyWzBdKSAmJiBpc1NvcnRNYXBGb3JIZWFkZXIwQWN0aXZlKSB8fFxyXG4gICAgICAgICAgICAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmhhcyhoZWFkZXJbMV0pICYmIGlzU29ydE1hcEZvckhlYWRlcjFBY3RpdmUpIHx8XHJcbiAgICAgICAgICAgIHNldC5oYXMoaGVhZGVyWzBdKSB8fFxyXG4gICAgICAgICAgICBzZXQuaGFzKGhlYWRlclsxXSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyQ29sdW1uRmlsdGVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVyU2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkgPSBbLi4uYXBwbGllZEZpbHRlclNldF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0T3B0aW9uVmFsdWVzKG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBmbG9vcjogbWluVmFsdWUsXHJcbiAgICAgICAgICAgIGNlaWw6IG1heFZhbHVlLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgdHJhbnNsYXRlOiB0aGlzLm5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcGVyY2VudFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGRhdGEpID49IDEwMDApIHtcclxuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IChNYXRoLmFicyhkYXRhKSAvIDEwMDApLnRvRml4ZWQoMSkgKyAnayUnO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyAnLScgKyB2YWwgOiB2YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGxldCBpc1dob2xlTnVtID0gcGFyc2VJbnQoZGF0YS50b1N0cmluZygpKSA9PSBkYXRhO1xyXG4gICAgICAgICAgICBsZXQgdmFsID0gaXNXaG9sZU51bSA/IE1hdGguYWJzKGRhdGEpLnRvU3RyaW5nKCkgOiBNYXRoLmFicyhkYXRhKS50b0ZpeGVkKDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyAnLScgKyB2YWwgKyAnJScgOiB2YWwgKyAnJSc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGRhdGEpID49IDEwMDApIHtcclxuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9ICckJyArIChNYXRoLmFicyhkYXRhKSAvIDEwMDApLnRvRml4ZWQoMSkgKyAnayc7XHJcbiAgICAgICAgICAgIHJldHVybiBpc05lZ1ZhbCA/ICctJyArIHZhbCA6IHZhbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgaXNOZWdWYWwgPSBkYXRhIDwgMDtcclxuICAgICAgICAgICAgbGV0IGlzV2hvbGVOdW0gPSBwYXJzZUludChkYXRhLnRvU3RyaW5nKCkpID09IGRhdGE7XHJcbiAgICAgICAgICAgIGxldCB2YWwgPSBpc1dob2xlTnVtID8gTWF0aC5hYnMoZGF0YSkudG9TdHJpbmcoKSA6IE1hdGguYWJzKGRhdGEpLnRvRml4ZWQoMSk7XHJcbiAgICAgICAgICAgIHJldHVybiBpc05lZ1ZhbCA/ICctJCcgKyB2YWwgOiAnJCcgKyB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBub3JtYWxUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhID49IDEwMDApIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gKGRhdGEgLyAxMDAwKS50b0ZpeGVkKDEpICsgJ2snO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSAhPSBNYXRoLmZsb29yKGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnRvRml4ZWQoMSkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcclxuICAgIH07XHJcblxyXG4gICAgZmluZFVuaXF1ZURhdGVzV2l0aERhdGEoZGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgdW5pcXVlRGF0ZXMgPSB1bmlxKGRhdGEubWFwKCh1KSA9PiB1WydkYXRlJ10pKTtcclxuICAgICAgICBsZXQgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ6IE5nYkRhdGVUeXBlW10gPSBbXTtcclxuICAgICAgICB1bmlxdWVEYXRlcy5mb3JFYWNoKChkYXRlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQucHVzaChcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGVTdGFuZGFyZEZvcm1hdChkYXlqcyhkYXRlLCAnTU0vREQvWVknKS5mb3JtYXQoJ01NL0REL1lZWVknKSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0O1xyXG4gICAgfVxyXG5cclxuICAgIHJlT3JkZXJBcHBsaWVkRmlsdGVyc0FycmF5KGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgICAgICBsZXQgaXNGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgaXNGaWx0ZXJlZCA9IHRoaXMuY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQsIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQsIGRhdGUpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmRGF0YUlzRmlsdGVyZWQoaXNGaWx0ZXJlZDogYm9vbGVhbiwgaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZDogYm9vbGVhbiwgZGF0ZT86IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3VzZXInICYmICF0aGlzLnRvb2x0aXBNYXAuaGFzKCd1c2VyJykpIHtcclxuICAgICAgICAgICAgaXNGaWx0ZXJlZCA9IGNsb25lRGVlcChpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkKTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ1N0YXJ0VGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdFbmRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3N0YXJ0VGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdlbmRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3RpbWUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAndGltZW91dFRpbWUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnU3RhcnRUaW1lJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ0VuZFRpbWUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnc3RhcnRfdGltZV9mb3JfZmlsdGVyJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ2VuZF90aW1lX2Zvcl9maWx0ZXInIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnc3RhcnRFbmRUaW1lTXVsdGknXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3N0YXJ0RW5kVGltZScgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdUaW1lQmFuZCcpIHtcclxuICAgICAgICAgICAgaXNGaWx0ZXJlZCA9XHJcbiAgICAgICAgICAgICAgICAhaXNFcXVhbChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICkgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVaZXJvVGltZSB8fFxyXG4gICAgICAgICAgICAgICAgIXRoaXMuaW5jbHVkZU11bHRpVGltZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2xpZGVyU2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApICYmICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLnNsaWRlckRhdGEpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09ICdwb3N0ZWRBZHUnICYmIHRoaXMuc3ViUmFkaW9CdXR0b24gPT0gJ25vdFJlcXVpcmVkJykge1xyXG4gICAgICAgICAgICAgICAgaXNGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFpc0ZpbHRlcmVkICYmIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnc3RhcnREYXRlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ2VuZERhdGUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAncGVyaW9kJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ0FpckRhdGUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAndGltZW91dERhdGUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gJ2ZsaWdodFN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSAnZmxpZ2h0RW5kRGF0ZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdkYXRlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3JldmlzaW9uU3RhcnREYXRlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ0dlbmVyYXRlZE9uJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ1dlZWsnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApICYmICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLmZsaWdodERhdGVSYW5nZSk7XHJcbiAgICAgICAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdG90YWxPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnNDb3VudCA9IHRoaXMudG9vbHRpcE1hcFxyXG4gICAgICAgICAgICAgICAgLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuICYmIHguaXNTZWxlY3RlZCkubGVuZ3RoO1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID0gc2VsZWN0ZWRPcHRpb25zQ291bnQgPiAwICYmIHNlbGVjdGVkT3B0aW9uc0NvdW50ICE9IHRvdGFsT3B0aW9uc0NvdW50ID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgc2V0ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG5cclxuICAgICAgICBpZiAoaXNGaWx0ZXJlZCAmJiAhc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzRmlsdGVyZWQgJiYgc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgc2V0LmFkZCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLnNldF07XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWRUaGVuU29ydFRoZURhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGlmICghdGhpcy5hbm5hU29ydFNlcnZpY2U/LmNvbHVtblNvcnRTdGF0ZSkgcmV0dXJuIG9yaWdpbmFsRGF0YTtcclxuICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gJ0FTQycpIHtcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRGF0YSA9IGNsb25lRGVlcChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UodHJ1ZSwgb3JpZ2luYWxEYXRhLCBrZXkpLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAnREVTQycpIHtcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRGF0YSA9IGNsb25lRGVlcChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UoZmFsc2UsIG9yaWdpbmFsRGF0YSwga2V5KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJEYXRhKG9yaWdpbmFsRGF0YTogYW55W10sIGtleVRvU2tpcDogc3RyaW5nLCBpc0x1ckNzclBhZ2U6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSBbLi4ub3JpZ2luYWxEYXRhXTtcclxuICAgICAgICBpZiAoIWlzTHVyQ3NyUGFnZSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSB0aGlzLmNoZWNrSWZTb3J0aW5nSXNBcHBsaWVkVGhlblNvcnRUaGVEYXRhKG9yaWdpbmFsRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleSAhPSBrZXlUb1NraXAgJiYgb3JpZ2luYWxEYXRhLmxlbmd0aCA+IDAgJiYgT2JqZWN0LmtleXMob3JpZ2luYWxEYXRhWzBdKS5pbmNsdWRlcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zbGlkZXJTZXQuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IG9ialtrZXldID49IHZhbHVlLm1pbiAmJiBvYmpba2V5XSA8PSB2YWx1ZS5tYXgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdzdGFydERhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnZW5kRGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdBaXJEYXRlJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ3RpbWVvdXREYXRlJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ2ZsaWdodFN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdmbGlnaHRFbmREYXRlJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PSAnZGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ0RhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICdyZXZpc2lvblN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ0dlbmVyYXRlZE9uJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ1dlZWsnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnVmlvbGF0ZWRTcG90RGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdWaW9sYXRpbmdTcG90RGF0ZSdcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5pc09iamVjdEluVGhlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdTdGFydFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnRW5kVGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ3RpbWVvdXRUaW1lJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0VGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdlbmRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ1N0YXJ0VGltZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ0VuZFRpbWUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnc3RhcnRfdGltZV9mb3JfZmlsdGVyJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ2VuZF90aW1lX2Zvcl9maWx0ZXInIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICd0aW1lJ1xyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3N0YXJ0RW5kVGltZU11bHRpJyB8fCBrZXkgPT0gJ3N0YXJ0RW5kVGltZScgfHwga2V5ID09PSAnVGltZUJhbmQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpLFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PiB2YWx1ZS5pbmNsdWRlcyh1W2tleV0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuT3JkZXJzSW5UaGVSYW5nZShvcmRlcjogYW55LCByYW5nZTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgICAgIGxldCBpc0RhdGVCZXR3ZWVuVGhlU2VsZWN0ZWRSYW5nZSA9IGRheWpzKG9yZGVyW2tleV0pLmlzQmV0d2VlbihyYW5nZS5taW5TZWxlY3RlZERhdGUsIHJhbmdlLm1heFNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSA9IGRheWpzKG9yZGVyW2tleV0pLmlzU2FtZShyYW5nZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIGxldCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGUgPSBkYXlqcyhvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWF4U2VsZWN0ZWREYXRlKTtcclxuICAgICAgICByZXR1cm4gaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgfHwgaXNEYXRlU2FtZUFzVGhlTWluU2VsZWN0ZWREYXRlIHx8IGlzRGF0ZVNhbWVBc1RoZU1heFNlbGVjdGVkRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5EYXRhRm9yVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSkge1xyXG4gICAgICAgIGxldCBmb3JtYXQgPSAnSEg6bW06c3MnO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFN0YXJ0RGF0ZSA9IGRheWpzKHNlbGVjdGVkRGF0YS5zdGFydFRpbWUsIGZvcm1hdCk7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRW5kRGF0ZSA9IGRheWpzKHNlbGVjdGVkRGF0YS5lbmRUaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBkYXlqcyhvYmouc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBlbmRUaW1lID0gZGF5anMob2JqLmVuZFRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgICAgIGxldCBpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lID0gc3RhcnRUaW1lLmlzU2FtZShzZWxlY3RlZFN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gc3RhcnRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgICAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgICAgICBsZXQgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gZW5kVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnksIGtleTogYW55KSB7XHJcbiAgICAgICAgbGV0IGZvcm1hdCA9ICdNTS9ERC9ZWVlZIEhIOm1tOnNzJztcclxuICAgICAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZSA9IGRheWpzKCcwMS8wMS8yMDAxICcgKyBzZWxlY3RlZERhdGEuZnJvbVRpbWUsIGZvcm1hdCk7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkVG9UaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIHNlbGVjdGVkRGF0YS50b1RpbWUsIGZvcm1hdCk7XHJcbiAgICAgICAgbGV0IG9ialRpbWUgPSBvYmpba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKFsnJywgJy0nLCBudWxsXS5pbmNsdWRlcyhvYmpUaW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09ICc8bXVsdGk+Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09ICc8bXVsdGk+Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XSA9PSAnMCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkYXlqc1RpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgb2JqVGltZSwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgbGV0IGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgPSBkYXlqc1RpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgICAgIGxldCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSA9IGRheWpzVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgICAgIGxldCBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZSA9IGRheWpzVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lIHx8XHJcbiAgICAgICAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkVG9UaW1lIHx8XHJcbiAgICAgICAgICAgIGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55LCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBmb3JtYXQgPSAnTU0vREQvWVlZWSBISDptbTpzcyc7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRnJvbVRpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgc2VsZWN0ZWREYXRhLmZyb21UaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IGRheWpzKCcwMS8wMS8yMDAxICcgKyBzZWxlY3RlZERhdGEudG9UaW1lLCBmb3JtYXQpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XVswXSA9PSAnPG11bHRpPicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlTXVsdGkgJiYgb2JqW2tleV1bMF0gPT0gJzxtdWx0aT4nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV1bMF0gPT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV1bMF0gPT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVUaW1lUmFuZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IGRheWpzKCcwMS8wMS8yMDAxICcgKyBvYmpba2V5XVsxXSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgZW5kVGltZSA9IGRheWpzKCcwMS8wMS8yMDAxICcgKyBvYmpba2V5XVsyXSwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgICAgIGxldCBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUgPSBlbmRUaW1lLmlzU2FtZShzZWxlY3RlZFRvVGltZSk7XHJcbiAgICAgICAgbGV0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqOiBhbnksIHZhbHVlOiBhbnksIGtleTogYW55KSB7XHJcbiAgICAgICAgbGV0IHBhcnNpbmdGb3JtYXQ6IHN0cmluZztcclxuICAgICAgICBpZiAoa2V5ID09PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICBwYXJzaW5nRm9ybWF0ID0gJ1lZWVktTU0tREQnO1xyXG5cclxuICAgICAgICAgICAgbGV0IGRheWpzU3RhcnREYXRlID0gZGF5anMob2JqLnN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgIGxldCBkYXlqc0VuZERhdGUgPSBkYXlqcyhvYmouZW5kRGF0ZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzU3RhcnREYXRlLmlzQmV0d2Vlbih2YWx1ZS5mcm9tRGF0ZSwgdmFsdWUudG9EYXRlKTtcclxuICAgICAgICAgICAgbGV0IGVuZERhdGVJc0JldHdlZW5TZWxEYXRlID0gZGF5anNFbmREYXRlLmlzQmV0d2Vlbih2YWx1ZS5mcm9tRGF0ZSwgdmFsdWUudG9EYXRlKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSA9IHZhbHVlLmZyb21EYXRlLmlzU2FtZShkYXlqc1N0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgIGxldCBlbmREYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gdmFsdWUudG9EYXRlLmlzU2FtZShkYXlqc0VuZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIChzdGFydERhdGVJc0JldHdlZW5TZWxEYXRlIHx8IHN0YXJ0RGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlKSAmJlxyXG4gICAgICAgICAgICAgICAgKGVuZERhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGVuZERhdGVJc1NhbWVBc1NlbEVuZERhdGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAga2V5ID09PSAnQWlyRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0U3RhcnREYXRlJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdmbGlnaHRFbmREYXRlJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdXZWVrJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICd0aW1lb3V0RGF0ZSdcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcGFyc2luZ0Zvcm1hdCA9ICdNTS9ERC9ZWVlZJztcclxuICAgICAgICAgICAgbGV0IGRhdGVJc0JldHdlZW5TZWxEYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzQmV0d2VlbihcclxuICAgICAgICAgICAgICAgIHZhbHVlLm1pblNlbGVjdGVkRGF0ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlLm1heFNlbGVjdGVkRGF0ZSxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSBkYXlqcyhvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNTYW1lKHZhbHVlLm1pblNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5tYXhTZWxlY3RlZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGRhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZVRpbWVGaWx0ZXJEYXRhKGNsb25lZERhdGE6IGFueVtdLCBrZXkgPSAnc3RhcnRFbmRUaW1lJykge1xyXG4gICAgICAgIGxldCBzdGFydFRpbWVBcnIgPSBtYXAoY2xvbmVkRGF0YSwgJ3N0YXJ0VGltZScpO1xyXG4gICAgICAgIGxldCBlbmRUaW1lQXJyID0gbWFwKGNsb25lZERhdGEsICdlbmRUaW1lJyk7XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZUFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZW5kVGltZUFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZURlc2NlbmRpbmcoYSwgYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBpbml0aWFsU3RhcnRFbmRUaW1lID0ge1xyXG4gICAgICAgICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZUFyclswXSxcclxuICAgICAgICAgICAgZW5kVGltZTogZW5kVGltZUFyclswXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIGluaXRpYWxTdGFydEVuZFRpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkNvbHVtbkZpbHRlclN0YXR1cyhkYXRhOiBhbnlbXSwgaGVhZGVyTmFtZTogc3RyaW5nIHwgbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGhlYWRlck5hbWUgPT0gJ3N0YXJ0RW5kVGltZScpIHtcclxuICAgICAgICAgICAgbGV0IHRpbWUgPSBkYXRhLm1hcCgodSkgPT4gdVtoZWFkZXJOYW1lXVswXSk7XHJcbiAgICAgICAgICAgIGxldCB1bmlxVGltZSA9IHVuaXEodGltZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmlxVGltZS5sZW5ndGggPT0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB1bmlxKGRhdGEubWFwKCh1KSA9PiB1W2hlYWRlck5hbWVdKSkubGVuZ3RoID4gMSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJPcHRpb25zRGF0YShkYXRhOiBhbnlbXSwgY2xvbmVkRGF0YTogYW55W10sIGtleT86IHN0cmluZykge1xyXG4gICAgICAgIGxldCBhcHBsaWVkRmlsdGVyU2V0ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG4gICAgICAgIGtleSA9IGtleSA/IGtleSA6IHRoaXMuc2VsZWN0ZWRSYWRpbztcclxuICAgICAgICBpZiAoYXBwbGllZEZpbHRlclNldC5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJEYXRhKGNsb25lZERhdGEsIGtleSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlT3JkZXJBcHBsaWVkRmlsdGVyc1N0YXRlKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZGaWx0ZXJJc0FwcGxpZWQoY2xvbmVkRGF0YSwgdmFsdWUpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkKTtcclxuICAgICAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmRmlsdGVySXNBcHBsaWVkKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGluaXRpYWxWYWx1ZU9mQ29sdW1uID0gc29ydEJ5KGNsb25lZERhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKTtcclxuICAgICAgICBsZXQgY3VycmVudFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkodGhpcy5hcHBseUZpbHRlcihjbG9uZWREYXRhLCB2YWx1ZSkubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKTtcclxuICAgICAgICByZXR1cm4gIWlzRXF1YWwoaW5pdGlhbFZhbHVlT2ZDb2x1bW4sIGN1cnJlbnRWYWx1ZU9mQ29sdW1uKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUZpbHRlcihkYXRhOiBhbnlbXSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSBkYXRhO1xyXG4gICAgICAgIGxldCBrZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV0gPj0gdmFsdWUubWluICYmIG9ialtrZXldIDw9IHZhbHVlLm1heCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAga2V5ID09PSAnc3RhcnREYXRlJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdlbmREYXRlJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdBaXJEYXRlJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICd0aW1lb3V0RGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0U3RhcnREYXRlJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdmbGlnaHRFbmREYXRlJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gJ2RhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSAnRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09ICdyZXZpc2lvblN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09ICdHZW5lcmF0ZWRPbicgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnV2VlaycgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnVmlvbGF0ZWRTcG90RGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnVmlvbGF0aW5nU3BvdERhdGUnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5pc09iamVjdEluVGhlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdwZXJpb2QnKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5nZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAga2V5ID09PSAnU3RhcnRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdFbmRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gJ3RpbWVvdXRUaW1lJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdzdGFydFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ2VuZFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0X3RpbWVfZm9yX2ZpbHRlcicgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnZW5kX3RpbWVfZm9yX2ZpbHRlcicgfHxcclxuICAgICAgICAgICAga2V5ID09ICd0aW1lJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gJ1N0YXJ0VGltZScgfHxcclxuICAgICAgICAgICAga2V5ID09ICdFbmRUaW1lJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3N0YXJ0RW5kVGltZU11bHRpJyB8fCBrZXkgPT0gJ3N0YXJ0RW5kVGltZScgfHwga2V5ID09PSAnVGltZUJhbmQnKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKHUpID0+IHZhbHVlLmluY2x1ZGVzKHVba2V5XSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGlzT2JqZWN0SW5UaGVSYW5nZShvYmo6IGFueSwgdmFsdWU6IGFueSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgb2JqVmFsID0gb2JqW2tleV07XHJcbiAgICAgICAgbGV0IGRheWpzRGF0ZSA9IGRheWpzKG9ialZhbCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mcm9tRGF0ZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlLnRvRGF0ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdmFsdWUuZnJvbURhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZSh2YWx1ZS5mcm9tRGF0ZSwgJ0REL01NL1lZWVknKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHZhbHVlLnRvRGF0ZSA9IGRheWpzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHZhbHVlLnRvRGF0ZSwgJ0REL01NL1lZWVknKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpc0RhdGVTYW1lQXNTdGFydE9mVGhlUmFuZ2UgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUob2JqVmFsKTtcclxuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUob2JqVmFsKTtcclxuICAgICAgICBsZXQgaXNEYXRlQmV0d2VlblRoZVN0YXJ0QW5kRW5kT2ZSYW5nZSA9IGRheWpzRGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIGlzRGF0ZVNhbWVBc1N0YXJ0T2ZUaGVSYW5nZSB8fCBpc0RhdGVTYW1lQXNFbmRPZlRoZVJhbmdlIHx8IGlzRGF0ZUJldHdlZW5UaGVTdGFydEFuZEVuZE9mUmFuZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU3RhdGVPZlRoZUN1cnJlbnRGaWx0ZXJUYWIoc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KSB7XHJcbiAgICAgICAgbGV0IGFjdGl2ZUtleSA9IHRoaXMuc2VsZWN0ZWRSYWRpbztcclxuICAgICAgICBsZXQga2V5QXJyOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleS5pbmNsdWRlcyhhY3RpdmVLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlBcnIgPSBrZXkuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlW2tleV0gPSB0aGlzLmlzVG9vbHRpcEFjdGl2ZShrZXlBcnIsIHNvcnRNYXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU3RhdGVPZkFsbFRoZUtleXMoc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5pc0ZpbHRlclNvcnRBY3RpdmUpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQga2V5QXJyID0ga2V5LnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlW2tleV0gPSB0aGlzLmlzVG9vbHRpcEFjdGl2ZShrZXlBcnIsIHNvcnRNYXApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudEhvdXIodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSAnJykge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludCh2YWx1ZSkgPCAxMikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKSArIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50SG91cih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09ICcnKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMTI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludCh2YWx1ZSkgPiAxKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpIC0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IDEyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50TWludXRlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICAvLyBpbmNyZW1lbnQgdG8gbmVhcmVzdCBwcm9wZXIgaW50ZXJ2YWwoMTUsMzAsNDUpXHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KHZhbHVlKTtcclxuICAgICAgICBpZiAobWluIDw9IDE0KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzE1JztcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAxNSAmJiBtaW4gPD0gMjkpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnMzAnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDMwICYmIG1pbiA8PSA0NCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9ICc0NSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gNDUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnMDAnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50TWludXRlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQodmFsdWUpO1xyXG4gICAgICAgIGlmIChtaW4gPiAwICYmIG1pbiA8PSAxNSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9ICcwMCc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMTYgJiYgbWluIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzE1JztcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAzMSAmJiBtaW4gPD0gNDUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnMzAnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gNDUgfHwgbWluID09IDApIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnNDUnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Q2hlY2tib3ggbWV0aG9kPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcblxyXG4gICAgZGlzYWJsZUFjdGl2ZUZpbHRlckNsZWFyQnV0dG9uKCkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEZpbHRlclNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gdGhpcy5nZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk7XHJcbiAgICAgICAgbGV0IGlzU29ydFByZXNlbnQgPVxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNpemUgPiAwICYmXHJcbiAgICAgICAgICAgIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyICE9IFNvcnRUeXBlRW51bS5ERUZBVUxUO1xyXG5cclxuICAgICAgICByZXR1cm4gIShzZWxlY3RlZEZpbHRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSB8fCBpc1NvcnRQcmVzZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID1cclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSAmJlxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPSBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA/IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyIDogU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUxpc3RGb3JDaGVja2JveEZpbHRlcihoZWFkZXI6IHN0cmluZywgb3B0aW9uRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgdG9vbHRpcE9wdGlvbnMgPSB0aGlzLmdldFRvb2x0aXBNb2RlbEZyb21PcHRpb25EYXRhKG9wdGlvbkRhdGEsIGhlYWRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0VW5zZWxlY3RMaXN0Q2hlY2tib3godG9vbHRpcE9wdGlvbnMsIGhlYWRlcik7XHJcbiAgICAgICAgdGhpcy5mb3JtYXROdWxsT3B0aW9uVG9TcGVjaWZpZWRTdHJpbmcodG9vbHRpcE9wdGlvbnMsICctJyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b29sdGlwT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb29sdGlwTW9kZWxGcm9tT3B0aW9uRGF0YShvcHRpb25EYXRhOiBhbnlbXSwgaGVhZGVyOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgdW5pcU9wdGlvbkRhdGEgPSB1bmlxKG9wdGlvbkRhdGEubWFwKChpdGVtKSA9PiBpdGVtW2hlYWRlcl0pKTtcclxuICAgICAgICByZXR1cm4gdW5pcU9wdGlvbkRhdGEubWFwKChpdGVtLCBpbmRleCkgPT4gbmV3IFRvb2x0aXBNb2RlbChpdGVtLCBpbmRleCArIDEpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RVbnNlbGVjdExpc3RDaGVja2JveCh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGhlYWRlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFZhbHVlU2V0ID0gbmV3IFNldCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKSk7XHJcbiAgICAgICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmlzU2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlU2V0LmhhcyhpdGVtLnZhbHVlKSA/IHRydWUgOiBmYWxzZSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmlzU2VsZWN0ZWQgPSB0cnVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvcm1hdE51bGxPcHRpb25Ub1NwZWNpZmllZFN0cmluZyh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGZvcm1hdHRlZFN0cmluZzogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLnZhbHVlID09IG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHtcclxuICAgICAgICAgICAgdG9vbHRpcE9wdGlvbnNbaW5kZXhdLmxhYmVsID0gZm9ybWF0dGVkU3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRDbG9uZWRUb29sdGlwQW5kVG9vbHRpcE9wdGlvbih0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIHNvcnRCeVN0cmluZzogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IFtzZWxlY3RlZEl0ZW1zLCB1bnNlbGVjdGVkSXRlbXNdID0gdGhpcy5nZXRTZWxlY3RlZEFuZFVuc2VsZWN0ZWRJdGVtcyh0b29sdGlwT3B0aW9ucyk7XHJcbiAgICAgICAgbGV0IHNvcnRlZFNlbGVjdGVkSXRlbXMgPSBzb3J0Qnkoc2VsZWN0ZWRJdGVtcywgc29ydEJ5U3RyaW5nKTtcclxuICAgICAgICBsZXQgc29ydGVkVW5zZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHVuc2VsZWN0ZWRJdGVtcywgc29ydEJ5U3RyaW5nKTtcclxuXHJcbiAgICAgICAgbGV0IGNsb25lZFRvb2x0aXBPcHRpb25zID0gWy4uLnNvcnRlZFNlbGVjdGVkSXRlbXMsIC4uLnNvcnRlZFVuc2VsZWN0ZWRJdGVtc107XHJcbiAgICAgICAgbGV0IHVwZGF0ZWRUb29sdGlwT3B0aW9ucyA9IGNsb25lRGVlcChjbG9uZWRUb29sdGlwT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHJldHVybiBbY2xvbmVkVG9vbHRpcE9wdGlvbnMsIHVwZGF0ZWRUb29sdGlwT3B0aW9ucywgc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRIZWlnaHRPZkNoZWNrYm94VG9vbHRpcEZpbHRlcihkYXRhTGVuZ3RoOiBudW1iZXIsIG1hcmdpbjogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFMZW5ndGggPiA2ID8gMjAwIDogMjYuMDMgKiBkYXRhTGVuZ3RoICsgbWFyZ2luICogZGF0YUxlbmd0aCArIG1hcmdpbjtcclxuICAgIH1cclxuXHJcbiAgICB1bkNoZWNrQWxsQ2hlY2tib3godG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKG9wdCkgPT4gb3B0LmlkID09IGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdEFsbENoZWNrYm94KHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgY2xvbmVkVG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKG9wdCkgPT4gb3B0LmlkID09IGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VW5zZWxlY3RDaGVja2JveChkYXRhOiBUb29sdGlwTW9kZWwsIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIGRhdGEuaXNTZWxlY3RlZCA9ICFkYXRhLmlzU2VsZWN0ZWQ7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09IGRhdGEuaWQpO1xyXG4gICAgICAgIGNsb25lZFRvb2x0aXBPcHRpb25zW2luZGV4XS5pc1NlbGVjdGVkID0gZGF0YS5pc1NlbGVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdGVkQW5kVW5zZWxlY3RlZEl0ZW1zKHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEl0ZW1zID0gdG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzU2VsZWN0ZWQpO1xyXG4gICAgICAgIGxldCB1bnNlbGVjdGVkSXRlbXMgPSB0b29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzU2VsZWN0ZWQpO1xyXG5cclxuICAgICAgICByZXR1cm4gW3NlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtc107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2hlY2tib3hQcmV2aW91c1NlbGVjdGVkVmFsdWUoY2xvbmVkVGFibGVEYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluaXRpYWxWYWx1ZSA9IHNvcnRCeSh1bmlxKGNsb25lZFRhYmxlRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIGluaXRpYWxWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeSh1bmlxKGNsb25lZFRhYmxlRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KHRoaXMuc2VsZWN0ZWRSYWRpbywgcHJldmlvdXNTZWxlY3RlZFZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1NlbGVjdGVkVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2hlY2tib3hDdXJyZW50U2VsZWN0ZWRWYWx1ZShzZWFyY2hlZFN0cmluZzogc3RyaW5nLCB0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBsZXQgY3VycmVudFNlbGVjdGVkVmFsdWUgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRvb2x0aXBPcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gc29ydEJ5KHRvb2x0aXBPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pc1NlbGVjdGVkKS5tYXAoKGl0ZW0pID0+IGl0ZW0udmFsdWUpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICFzZWFyY2hlZFN0cmluZyAmJlxyXG4gICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUubGVuZ3RoID09IHRvb2x0aXBPcHRpb25zLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbylcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYmxhbmtJbmRleCA9IGN1cnJlbnRTZWxlY3RlZFZhbHVlLmZpbmRJbmRleCgoaXRlbTogc3RyaW5nKSA9PiBpdGVtID09IG51bGwpO1xyXG4gICAgICAgIGlmIChibGFua0luZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gc29ydEJ5KGN1cnJlbnRTZWxlY3RlZFZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0ZWRWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmU29ydGluZ0NoYW5nZWQodGVtcFNvcnRPcmRlcjogU29ydFR5cGUpIHtcclxuICAgICAgICBsZXQgY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPSB0aGlzLmdldENvbHVtblNvcnRTdGF0ZUZvclNlbGVjdGVkUmFkaW8oKTtcclxuXHJcbiAgICAgICAgbGV0IGlzU29ydENoYW5nZWQgPSB0ZW1wU29ydE9yZGVyICE9IG51bGwgJiYgdGVtcFNvcnRPcmRlciAhPSBjdXJyZW50Q29sdW1uU29ydEZpbHRlcjtcclxuICAgICAgICByZXR1cm4gaXNTb3J0Q2hhbmdlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJlZE9wdGlvbkFzQm9sZFN0cmluZyhzdHI6IHN0cmluZywgY2xvbmVkVG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgbGV0IHRvb2x0aXBPcHRpb25zID0gY2xvbmVEZWVwKFxyXG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubGFiZWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHN0ci50b0xvd2VyQ2FzZSgpKSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQubGFiZWwgPSB0aGlzLmJvbGRTdHJpbmcoZWxlbWVudC5sYWJlbCwgc3RyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvb2x0aXBPcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGJvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGZpbmQ6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmRleGVzID0gdGhpcy5nZXRJbmRpY2VzT2YoZmluZCwgc3RyLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGluZGV4ZXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBpdGVtICsgaW5kZXggKiA3OyAvL011bHRpcGx5aW5nIGJ5IDcgYXMgdGhlcmUgYXJlIDdjaGFyOiA8Yj48L2I+XHJcbiAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBmaW5kLmxlbmd0aDtcclxuICAgICAgICAgICAgbGV0IHN0clRvQmVSZXBsYWNlZCA9IHN0ci5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xyXG4gICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShzdHJUb0JlUmVwbGFjZWQsICc8Yj4nICsgc3RyVG9CZVJlcGxhY2VkICsgJzwvYj4nKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEluZGljZXNPZihzZWFyY2hTdHI6IHN0cmluZywgc3RyOiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgc2VhcmNoU3RyTGVuID0gc2VhcmNoU3RyLmxlbmd0aDtcclxuICAgICAgICBpZiAoc2VhcmNoU3RyTGVuID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDAsXHJcbiAgICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgICBpbmRpY2VzID0gW107XHJcbiAgICAgICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICBzZWFyY2hTdHIgPSBzZWFyY2hTdHIudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKChpbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0ciwgc3RhcnRJbmRleCkpID4gLTEpIHtcclxuICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGluZGV4KTtcclxuICAgICAgICAgICAgc3RhcnRJbmRleCA9IGluZGV4ICsgc2VhcmNoU3RyTGVuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5kaWNlcztcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlQWxsQnRuc1doZW5UaGVyZUFyZU5vRmlsdGVyZWRSZXN1bHRzKCk6IFtudW1iZXIsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW5dIHtcclxuICAgICAgICAvLyBbc2VsZWN0ZWRDaGVja2JveE9wdGlvbnNDb3VudCwgZGlzYWJsZUNoZWNrYm94QXBwbHksIGRpc2FibGVDbGVhckFsbCwgZGlzYWJsZVNlbGVjdEFsbF07XHJcbiAgICAgICAgcmV0dXJuIFswLCB0cnVlLCB0cnVlLCB0cnVlXTtcclxuICAgIH1cclxuXHJcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PUNhbGVuZGFyIGZpbHRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIGNyZWF0ZVJhbmdlRm9yVGhlRGF0ZUZpbHRlcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5NYXhEYXRlO1xyXG4gICAgICAgIC8vV2hlbiB5b3Ugd2FudCB0byB1c2Ugc3RhcnREYXRlIGFuZCBlbmREYXRlIGNvbWJpbmVkIGFzIHNpbmdsZSBjb2x1bW4gdGhlbiB1c2UgUGVyaW9kLlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdwZXJpb2QnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnYnV5ZXJGbGlnaHREYXRlcycgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICd0cmFmZmljRmxpZ2h0RGF0ZXMnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIG1pbk1heERhdGUgPSB0aGlzLmNyZWF0ZVN0YXJ0RW5kRGF0ZVJhbmdlKG9wdGlvbkRhdGEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1pbk1heERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUob3B0aW9uRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtaW5NYXhEYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVN0YXJ0RW5kRGF0ZVJhbmdlKG9wdGlvbkRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IG1pblN0YXJ0RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShvcHRpb25EYXRhLCAnc3RhcnREYXRlJyk7XHJcbiAgICAgICAgbGV0IG1heEVuZERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUob3B0aW9uRGF0YSwgJ2VuZERhdGUnKTtcclxuICAgICAgICByZXR1cm4gW21pblN0YXJ0RGF0ZVswXSwgbWF4RW5kRGF0ZVsxXV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TWluQW5kTWF4RGF0ZVJhbmdlRm9yQ2FsZW5kYXIobWluTWF4RGF0ZTogYW55W10sIHBhcnNpbmdGb3JtYXQ6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBjYWxlbmRhck1pbkVuYWJsZWREYXRlID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShtaW5NYXhEYXRlWzBdLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICBsZXQgY2FsZW5kYXJNYXhFbmFibGVkRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVsxXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgcmV0dXJuIFtjYWxlbmRhck1pbkVuYWJsZWREYXRlLCBjYWxlbmRhck1heEVuYWJsZWREYXRlXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RlZERhdGVGb3JDYWxlbmRhcihtaW5NYXhEYXRlOiBhbnlbXSwgcGFyc2luZ0Zvcm1hdDogc3RyaW5nLCBtaW5EYXRlOiBOZ2JEYXRlVHlwZSwgbWF4RGF0ZTogTmdiRGF0ZVR5cGUpIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRNaW5EYXRlO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZE1heERhdGU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWREYXRlT2JqID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlT2JqLmZyb21EYXRlLmlzQWZ0ZXIobWluTWF4RGF0ZVswXSkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUoc2VsZWN0ZWREYXRlT2JqLmZyb21EYXRlLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVswXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGVPYmoudG9EYXRlLmlzQWZ0ZXIobWluTWF4RGF0ZVsxXSkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWF4RGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVsxXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHNlbGVjdGVkRGF0ZU9iai50b0RhdGUsIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRNaW5EYXRlID0gY2xvbmVEZWVwKG1pbkRhdGUpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSBjbG9uZURlZXAobWF4RGF0ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3NlbGVjdGVkTWluRGF0ZSwgc2VsZWN0ZWRNYXhEYXRlXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmV2aW91c1NlbGVjdGVkRGF0ZXNGb3JDYWxlbmRhcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NlbGVjdGVkRGF0ZTogeyBmcm9tRGF0ZTogYW55OyB0b0RhdGU6IGFueSB9ID0geyBmcm9tRGF0ZTogbnVsbCwgdG9EYXRlOiBudWxsIH07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRGF0ZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JEYXRlRmlsdGVyKG9wdGlvbkRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRGF0ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yRGF0ZUZpbHRlcihvcHRpb25EYXRhKTtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1NlbGVjdGVkRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsVmFsdWVNYXBGb3JEYXRlRmlsdGVyKG9wdGlvbkRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IG1pbk1heERhdGUgPSB0aGlzLmNyZWF0ZVJhbmdlRm9yVGhlRGF0ZUZpbHRlcihvcHRpb25EYXRhKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZSA9IHsgZnJvbURhdGU6IG1pbk1heERhdGVbMF0sIHRvRGF0ZTogbWluTWF4RGF0ZVsxXSB9O1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHNlbGVjdGVkRGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkRGF0ZXNGb3JDYWxlbmRhcihjdXJyZW50U2VsZWN0ZWREYXRlOiBhbnksIG1pbkRhdGU6IE5nYkRhdGVUeXBlLCBtYXhEYXRlOiBOZ2JEYXRlVHlwZSkge1xyXG4gICAgICAgIGxldCBmcm9tRGF0ZSA9IHtcclxuICAgICAgICAgICAgeWVhcjogY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZS55ZWFyLFxyXG4gICAgICAgICAgICBtb250aDogY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZS5tb250aCxcclxuICAgICAgICAgICAgZGF5OiBjdXJyZW50U2VsZWN0ZWREYXRlLmZyb21EYXRlLmRheSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCB0b0RhdGUgPSB7XHJcbiAgICAgICAgICAgIHllYXI6IGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlLnllYXIsXHJcbiAgICAgICAgICAgIG1vbnRoOiBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZS5tb250aCxcclxuICAgICAgICAgICAgZGF5OiBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZS5kYXksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGlzRXF1YWwobWluRGF0ZSwgZnJvbURhdGUpICYmIGlzRXF1YWwobWF4RGF0ZSwgdG9EYXRlKSAmJiB0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWREYXRlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZSA9IGRheWpzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudChjdXJyZW50U2VsZWN0ZWREYXRlLmZyb21EYXRlKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1TTElERVI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcblxyXG4gICAgZ2V0U2xpZGVyVHJhbnNsYXRlRnVuY1ZhbChoZWFkZXI6IHN0cmluZywgY3VycmVuY3lTZXQ6IFNldDxzdHJpbmc+KSB7XHJcbiAgICAgICAgbGV0IHRyYW5zbGF0ZUZ1bmM7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW5jeVNldC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVGdW5jID0gJ2N1cnJlbmN5JztcclxuICAgICAgICB9IGVsc2UgaWYgKGhlYWRlciA9PSAncG9zdGVkQXVkUGVyY2VudCcgfHwgaGVhZGVyID09ICdwYXJlbnRSb3dTaGFyZXMnIHx8IGhlYWRlciA9PSAncGFyZW50Um93UHV0UGVyY2VudCcpIHtcclxuICAgICAgICAgICAgdHJhbnNsYXRlRnVuYyA9ICdwZXJjZW50JztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVGdW5jID0gJ25vcm1hbCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRnVuYztcclxuICAgIH1cclxuXHJcbiAgICBnZXRTbGlkZXJPcHRpb25zKG9wdGlvbnNEYXRhOiBhbnlbXSwgdHJhbnNsYXRlRnVuYzogc3RyaW5nLCBoZWFkZXI6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBtaW5WYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUob3B0aW9uc0RhdGEsIGhlYWRlciwgdHJ1ZSk7XHJcbiAgICAgICAgbGV0IG1heFZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShvcHRpb25zRGF0YSwgaGVhZGVyLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGxldCBvYmogPSB0aGlzLnNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZSwgbWF4VmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAodHJhbnNsYXRlRnVuYyA9PT0gJ25vcm1hbCcpIHtcclxuICAgICAgICAgICAgb2JqLnRyYW5zbGF0ZSA9IHRoaXMubm9ybWFsVHJhbnNsYXRlRnVuY3Rpb247XHJcbiAgICAgICAgfSBlbHNlIGlmICh0cmFuc2xhdGVGdW5jID09PSAncGVyY2VudCcpIHtcclxuICAgICAgICAgICAgb2JqLnRyYW5zbGF0ZSA9IHRoaXMucGVyY2VudFRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlRnVuYyA9PT0gJ2N1cnJlbmN5Jykge1xyXG4gICAgICAgICAgICBvYmoudHJhbnNsYXRlID0gdGhpcy5jdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFJhbmdlRm9yU2xpZGVyKGhlYWRlcjogc3RyaW5nLCBvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IHNsaWRlck1pblZhbHVlO1xyXG4gICAgICAgIGxldCBzbGlkZXJNYXhWYWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZE9iaiA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpO1xyXG4gICAgICAgICAgICBzbGlkZXJNaW5WYWx1ZSA9IHNlbGVjdGVkT2JqLm1pbiA8IG9wdGlvbnMuZmxvb3IgPyBvcHRpb25zLmZsb29yIDogc2VsZWN0ZWRPYmoubWluO1xyXG4gICAgICAgICAgICBzbGlkZXJNYXhWYWx1ZSA9IHNlbGVjdGVkT2JqLm1heCA8IG9wdGlvbnMuY2VpbCA/IHNlbGVjdGVkT2JqLm1heCA6IG9wdGlvbnMuY2VpbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzbGlkZXJNaW5WYWx1ZSA9IG9wdGlvbnMuZmxvb3I7XHJcbiAgICAgICAgICAgIHNsaWRlck1heFZhbHVlID0gb3B0aW9ucy5jZWlsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFtzbGlkZXJNaW5WYWx1ZSwgc2xpZGVyTWF4VmFsdWVdO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVmFsdWVJblJhbmdlKG9wdGlvbnM6IE9wdGlvbnMsIHZhbDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZmxvb3IgPD0gdmFsICYmIHZhbCA8PSBvcHRpb25zLmNlaWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJldmlvdXNTZWxlY3RlZFZhbHVlRm9yU2xpZGVyKGNsb25lZERhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzU2xpZGVyRGF0YTogeyBtaW46IGFueTsgbWF4OiBhbnkgfSA9IHsgbWluOiAnJywgbWF4OiAnJyB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yU2xpZGVyRmlsdGVyKGNsb25lZERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NsaWRlckRhdGEgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhKTtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTbGlkZXJEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5WYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoY2xvbmVkRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvLCB0cnVlKTtcclxuICAgICAgICBsZXQgbWF4VmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKGNsb25lZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgZmFsc2UpO1xyXG4gICAgICAgIGxldCBzbGlkZXJEYXRhID0geyBtaW46IG1pblZhbHVlLCBtYXg6IG1heFZhbHVlIH07XHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KHRoaXMuc2VsZWN0ZWRSYWRpbywgc2xpZGVyRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkVmFsdWVGb3JTbGlkZXIobWluRW50ZXJlZFZhbDogbnVtYmVyLCBtYXhFbnRlcmVkVmFsOiBudW1iZXIsIG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICAgICAgICBsZXQgY3VycmVudFNsaWRlckRhdGE6IHsgbWluOiBhbnk7IG1heDogYW55IH0gPSB7IG1pbjogbnVsbCwgbWF4OiBudWxsIH07XHJcbiAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWF4ID0gbWF4RW50ZXJlZFZhbDtcclxuICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5taW4gPSBtaW5FbnRlcmVkVmFsO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1pbiA9PSBvcHRpb25zLmZsb29yICYmXHJcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1heCA9PSBvcHRpb25zLmNlaWwgJiZcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2xpZGVyRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09VElNRT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIGdldFNlbGVjdGVkVGltZVJhbmdlKGhlYWRlcjogc3RyaW5nLCBjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEZyb21UaW1lOiBhbnlbXTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRUb1RpbWU6IGFueVtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpLmZyb21UaW1lO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpLnRvVGltZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclRpbWVGaWx0ZXIoY2xvbmVkRGF0YSwgaGVhZGVyKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChoZWFkZXIpLmZyb21UaW1lO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChoZWFkZXIpLnRvVGltZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZEZyb21UaW1lICE9IHVuZGVmaW5lZCB8fCBzZWxlY3RlZFRvVGltZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuZm9ybWF0VG9Ud2VsdmVIcnMoc2VsZWN0ZWRGcm9tVGltZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVG9UaW1lID0gQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5mb3JtYXRUb1R3ZWx2ZUhycyhzZWxlY3RlZFRvVGltZSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IFsnLScsICctJywgJy0nXTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSBbJy0nLCAnLScsICctJ107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3NlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsVmFsdWVNYXBGb3JUaW1lRmlsdGVyKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChrZXkgPT0gJ3N0YXJ0RW5kVGltZScgfHwga2V5ID09ICdUaW1lQmFuZCcpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShjbG9uZWREYXRhLCBrZXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRPckVuZFRpbWVSYW5nZShjbG9uZWREYXRhLCBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL3VzZSBmb3IgZmlsdGVyIHdoZXJlIHdlIGhhdmUgc3RhcnQgYW5kIGVuZCB0aW1lIHJhbmdlIGluIG9uZSBmaWx0ZXJcclxuICAgIC8vc3RhcnRFbmRUaW1lOiBbXCI2IC0gN0FcIiwgXCIwNjogMDAgOiAwMFwiICwgXCIwNzowMDowMFwiXVxyXG4gICAgc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YTogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVNdWx0aSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdID09ICc8bXVsdGk+JykgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVaZXJvID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV1bMF0gPT0gJzAnKSAhPSAtMTtcclxuICAgICAgICBsZXQgaW5jbHVkZVRpbWVSYW5nZSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdICE9ICcwJyAmJiBvYmpba2V5XVswXSAhPSAnPG11bHRpPicpICE9IC0xO1xyXG5cclxuICAgICAgICBsZXQgZmlsdGVyZWRTdGFydFRpbWUgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhWycnLCAnLScsIG51bGwsICcwJywgJzxtdWx0aT4nXS5pbmNsdWRlcyhvYmpbJ3N0YXJ0VGltZSddKSk7XHJcbiAgICAgICAgbGV0IGZpbHRlcmVkRW5kVGltZSA9IGNsb25lZERhdGEuZmlsdGVyKChvYmopID0+ICFbJycsICctJywgbnVsbCwgJzAnLCAnPG11bHRpPiddLmluY2x1ZGVzKG9ialsnZW5kVGltZSddKSk7XHJcblxyXG4gICAgICAgIGxldCBzdGFydFRpbWVBcnIgPSBtYXAoZmlsdGVyZWRTdGFydFRpbWUsICdzdGFydFRpbWUnKTtcclxuICAgICAgICBsZXQgZW5kVGltZUFyciA9IG1hcChmaWx0ZXJlZEVuZFRpbWUsICdlbmRUaW1lJyk7XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZUFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBlbmRUaW1lQXJyLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogc3RhcnRUaW1lQXJyWzBdLFxyXG4gICAgICAgICAgICB0b1RpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICAvL3VzZSBmb3IgdGhlIGZpbHRlcnMgd2hlcmUgd2UgaGF2ZSBkaWZmZXJlbnQgZmlsdGVyIGZvciBzdGFydCBhbmQgZW5kIHRpbWVcclxuICAgIC8vc3RhcnRUaW1lOiBcIjA2OjAwOjAwXCJcclxuICAgIHNldEluaXRpYWxWYWx1ZUZvclN0YXJ0T3JFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YTogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVNdWx0aSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldID09ICc8bXVsdGk+JykgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVaZXJvID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV0gPT0gJzAnKSAhPSAtMTtcclxuICAgICAgICBsZXQgaW5jbHVkZVRpbWVSYW5nZSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldICE9ICcwJyAmJiBvYmpba2V5XSAhPSAnPG11bHRpPicpICE9IC0xO1xyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IGNsb25lZERhdGEuZmlsdGVyKChvYmopID0+ICFbJycsICctJywgbnVsbCwgJzAnLCAnPG11bHRpPiddLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcblxyXG4gICAgICAgIGxldCB0aW1lQXJyID0gbWFwKGRhdGEsIGtleSk7XHJcbiAgICAgICAgdGltZUFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogdGltZUFyclswXSxcclxuICAgICAgICAgICAgdG9UaW1lOiB0aW1lQXJyW3RpbWVBcnIubGVuZ3RoIC0gMV0sXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RVbnNlbGVjdFRpbWVGaWx0ZXJDaGVja2JveChrZXk6IHN0cmluZywgb3B0aW9uc0RhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHNob3dNdWx0aVRpbWVDaGVja2JveCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzaG93WmVyb1RpbWVDaGVja2JveCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzaG93RW50ZXJUaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgICAgICBsZXQgbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHplcm9UaW1lQ2hlY2tib3hDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRUaW1lT2JqO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUaW1lT2JqID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGtleSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUaW1lT2JqID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KGtleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGltZUFycjogc3RyaW5nW107XHJcbiAgICAgICAgaWYgKGtleSA9PSAnc3RhcnRFbmRUaW1lJyB8fCBrZXkgPT0gJ1RpbWVCYW5kJykge1xyXG4gICAgICAgICAgICB0aW1lQXJyID0gb3B0aW9uc0RhdGEubWFwKChpdGVtKSA9PiBpdGVtW2tleV1bMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRpbWVBcnIgPSBvcHRpb25zRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1ba2V5XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZUFyci5maW5kSW5kZXgoKHZhbCkgPT4gdmFsID09ICcwJykgIT0gLTEpIHtcclxuICAgICAgICAgICAgc2hvd1plcm9UaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgICAgICAgICB6ZXJvVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkVGltZU9iai5pbmNsdWRlWmVybztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgPT0gJzxtdWx0aT4nKSAhPSAtMSkge1xyXG4gICAgICAgICAgICBzaG93TXVsdGlUaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgICAgICAgICBtdWx0aVRpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmouaW5jbHVkZU11bHRpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3daZXJvVGltZUNoZWNrYm94IHx8IHNob3dNdWx0aVRpbWVDaGVja2JveCkge1xyXG4gICAgICAgICAgICBzaG93RW50ZXJUaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVBcnIuZmluZEluZGV4KCh2YWwpID0+IHZhbCAhPSAnPG11bHRpPicgJiYgdmFsICE9ICcwJykgIT0gLTEpIHtcclxuICAgICAgICAgICAgZW50ZXJUaW1lQ2hlY2tib3hDaGVja2VkID0gc2VsZWN0ZWRUaW1lT2JqPy5pbmNsdWRlVGltZVJhbmdlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2hvd011bHRpVGltZUNoZWNrYm94OiBzaG93TXVsdGlUaW1lQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIHNob3daZXJvVGltZUNoZWNrYm94OiBzaG93WmVyb1RpbWVDaGVja2JveCxcclxuICAgICAgICAgICAgc2hvd0VudGVyVGltZUNoZWNrYm94OiBzaG93RW50ZXJUaW1lQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZDogbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkLFxyXG4gICAgICAgICAgICB6ZXJvVGltZUNoZWNrYm94Q2hlY2tlZDogemVyb1RpbWVDaGVja2JveENoZWNrZWQsXHJcbiAgICAgICAgICAgIGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZDogZW50ZXJUaW1lQ2hlY2tib3hDaGVja2VkLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZlN0YXJ0VGltZUlzQWZ0ZXJFbmRUaW1lKHN0YXJ0VGltZTogc3RyaW5nW10sIGVuZFRpbWU6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgbGV0IHRpbWVGb3JtYXQgPSAnSEg6bW06c3MnO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnRUaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgICAgIHN0YXJ0VGltZVswXSArICc6JyArIHN0YXJ0VGltZVsxXSArICcgJyArIHN0YXJ0VGltZVsyXSxcclxuICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUyNEhyRm9ybWF0ID0gc3RhcnRUaW1lMjRIckZvcm1hdEFyclswXSArICc6JyArIHN0YXJ0VGltZTI0SHJGb3JtYXRBcnJbMV0gKyAnOjAwJztcclxuICAgICAgICBsZXQgZW5kVGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBlbmRUaW1lWzBdICsgJzonICsgZW5kVGltZVsxXSArICcgJyArIGVuZFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgZW5kVGltZTI0SHJGb3JtYXQgPSBlbmRUaW1lMjRIckZvcm1hdEFyclswXSArICc6JyArIGVuZFRpbWUyNEhyRm9ybWF0QXJyWzFdICsgJzowMCc7XHJcbiAgICAgICAgcmV0dXJuIGRheWpzKHN0YXJ0VGltZTI0SHJGb3JtYXQsIHRpbWVGb3JtYXQpLmlzQWZ0ZXIoZGF5anMoZW5kVGltZTI0SHJGb3JtYXQsIHRpbWVGb3JtYXQpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlcigpIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlciA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyKFxyXG4gICAgICAgIHN0YXJ0VGltZTogc3RyaW5nW10sXHJcbiAgICAgICAgZW5kVGltZTogc3RyaW5nW10sXHJcbiAgICAgICAgaW5jbHVkZU11bHRpOiBib29sZWFuLFxyXG4gICAgICAgIGluY2x1ZGVaZXJvOiBib29sZWFuLFxyXG4gICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGJvb2xlYW4sXHJcbiAgICApIHtcclxuICAgICAgICBsZXQgY3VycmVudFNlbGVjdGVkVGltZUZpbHRlcjtcclxuXHJcbiAgICAgICAgbGV0IGZyb21UaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgICAgIHN0YXJ0VGltZVswXSArICc6JyArIHN0YXJ0VGltZVsxXSArICcgJyArIHN0YXJ0VGltZVsyXSxcclxuICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCBmcm9tVGltZTI0SHJGb3JtYXQgPSBmcm9tVGltZTI0SHJGb3JtYXRBcnJbMF0gKyAnOicgKyBmcm9tVGltZTI0SHJGb3JtYXRBcnJbMV0gKyAnOjAwJztcclxuXHJcbiAgICAgICAgbGV0IHRvVGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBlbmRUaW1lWzBdICsgJzonICsgZW5kVGltZVsxXSArICcgJyArIGVuZFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgdG9UaW1lMjRIckZvcm1hdCA9IHRvVGltZTI0SHJGb3JtYXRBcnJbMF0gKyAnOicgKyB0b1RpbWUyNEhyRm9ybWF0QXJyWzFdICsgJzowMCc7XHJcblxyXG4gICAgICAgIGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXIgPSB7XHJcbiAgICAgICAgICAgIGZyb21UaW1lOiBmcm9tVGltZTI0SHJGb3JtYXQsXHJcbiAgICAgICAgICAgIHRvVGltZTogdG9UaW1lMjRIckZvcm1hdCxcclxuICAgICAgICAgICAgaW5jbHVkZU11bHRpOiBpbmNsdWRlTXVsdGksXHJcbiAgICAgICAgICAgIGluY2x1ZGVaZXJvOiBpbmNsdWRlWmVybyxcclxuICAgICAgICAgICAgaW5jbHVkZVRpbWVSYW5nZTogaW5jbHVkZVRpbWVSYW5nZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdGVkVGltZUZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRIb3VySW5wdXQoYXJyOiBhbnlbXSkge1xyXG4gICAgICAgIGlmIChhcnJbMF0gPT0gJycpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KGFyclswXSkgPCAxMikge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSBwYXJzZUludChhcnJbMF0pICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWNyZW1lbnRIb3VySW5wdXQoYXJyOiBhbnlbXSkge1xyXG4gICAgICAgIGlmIChhcnJbMF0gPT0gJycpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludChhcnJbMF0pID4gMSkge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSBwYXJzZUludChhcnJbMF0pIC0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSAxMjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50TWludXRlSW5wdXQoYXJyOiBhbnlbXSkge1xyXG4gICAgICAgIC8vIGluY3JlbWVudCB0byBuZWFyZXN0IHByb3BlciBpbnRlcnZhbCgxNSwzMCw0NSlcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQoYXJyWzFdKTtcclxuICAgICAgICBpZiAobWluIDw9IDE0KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICcxNSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMTUgJiYgbWluIDw9IDI5KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICczMCc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzAgJiYgbWluIDw9IDQ0KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICc0NSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gNDUpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gJzAwJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50TWludXRlSW5wdXQoYXJyOiBhbnkpIHtcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQoYXJyWzFdKTtcclxuICAgICAgICBpZiAobWluID4gMCAmJiBtaW4gPD0gMTUpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gJzAwJztcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAxNiAmJiBtaW4gPD0gMzApIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gJzE1JztcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAzMSAmJiBtaW4gPD0gNDUpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gJzMwJztcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+IDQ1IHx8IG1pbiA9PSAwKSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICc0NSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE9yRGVjcmVtZW50SG91cihpbmNyZW1lbnQ6IGJvb2xlYW4sIHRpbWU6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudEhvdXJJbnB1dCh0aW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudEhvdXJJbnB1dCh0aW1lKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50T3JEZWNyZW1lbnRNaW4oaW5jcmVtZW50OiBib29sZWFuLCB0aW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGlmIChpbmNyZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRNaW51dGVJbnB1dCh0aW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudE1pbnV0ZUlucHV0KHRpbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0hvdXJWYWx1ZUludmFsaWQoaHI6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBoci5sZW5ndGggPT0gMCB8fCAhK2hyIHx8IDEgPiBwYXJzZUludChocikgfHwgcGFyc2VJbnQoaHIpID4gMTIgfHwgaHIuaW5jbHVkZXMoJy4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpc01pbnV0ZVZhbHVlSW52YWxpZChtaW46IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIG1pbi5sZW5ndGggIT0gMiB8fCAoISttaW4gJiYgbWluICE9ICcwMCcpIHx8IDAgPiBwYXJzZUludChtaW4pIHx8IHBhcnNlSW50KG1pbikgPiA1OSB8fCBtaW4uaW5jbHVkZXMoJy4nKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09U09SVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG4gICAgdXBkYXRlU29ydE1hcCh0ZW1wU29ydE9yZGVyOiBTb3J0VHlwZSwgdGFibGVEYXRhOiBhbnlbXSwgaXNMdXJBbmRDc3JDb21wb25lbnQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHRlbXBTb3J0T3JkZXIpO1xyXG4gICAgICAgIGxldCBzb3J0ZWRUYWJsZURhdGEgPSB0aGlzLmFubmFTb3J0U2VydmljZS5hcHBseVNvcnRpbmcoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyxcclxuICAgICAgICAgICAgdGVtcFNvcnRPcmRlcixcclxuICAgICAgICAgICAgdGFibGVEYXRhLFxyXG4gICAgICAgICAgICBpc0x1ckFuZENzckNvbXBvbmVudCxcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBzb3J0ZWRUYWJsZURhdGE7XHJcbiAgICB9XHJcbn1cclxuIl19