@annalib/anna-core 1.0.0 → 1.0.2

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 (201) hide show
  1. package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +6 -6
  2. package/esm2020/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +35 -0
  3. package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +6 -6
  4. package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +6 -6
  5. package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +6 -6
  6. package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +4 -4
  7. package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +6 -6
  8. package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +3 -2
  9. package/esm2020/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +281 -0
  10. package/esm2020/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +27 -0
  11. package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
  12. package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
  13. package/esm2020/lib/anna-core-shared-lib/models/anna-manage-users.model.mjs +8 -0
  14. package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +11 -3
  15. package/esm2020/lib/anna-core-shared-lib/models/anna-sort.model.mjs +7 -2
  16. package/esm2020/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +5 -3
  17. package/esm2020/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +26 -0
  18. package/esm2020/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +23 -8
  19. package/esm2020/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +25 -0
  20. package/esm2020/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +16 -0
  21. package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +52 -34
  22. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +165 -260
  23. package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +95 -8
  24. package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +4 -5
  25. package/esm2020/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +41 -0
  26. package/esm2020/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +60 -0
  27. package/esm2020/lib/anna-core-shared-lib/services/anna-sort.service.mjs +12 -6
  28. package/esm2020/lib/anna-core.module.mjs +178 -0
  29. package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +23 -12
  30. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +27 -23
  31. package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +1105 -580
  32. package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +29 -20
  33. package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +7 -7
  34. 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 +5 -5
  35. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +3 -3
  36. package/esm2020/public-api.mjs +48 -4
  37. package/fesm2015/annalib-anna-core.mjs +3989 -2922
  38. package/fesm2015/annalib-anna-core.mjs.map +1 -1
  39. package/fesm2020/annalib-anna-core.mjs +3956 -2893
  40. package/fesm2020/annalib-anna-core.mjs.map +1 -1
  41. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +1 -1
  42. package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +16 -0
  43. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +1 -1
  44. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +1 -1
  45. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +1 -1
  46. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +1 -1
  47. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +1 -1
  48. package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +2 -1
  49. package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -0
  50. package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +9 -0
  51. package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +8 -0
  52. package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +1 -0
  53. package/lib/anna-core-shared-lib/models/anna-manage-users.model.d.ts +6 -0
  54. package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +44 -2
  55. package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +5 -0
  56. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +4 -2
  57. package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -0
  58. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +1 -1
  59. package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -0
  60. package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -0
  61. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +2 -0
  62. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +13 -19
  63. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +20 -4
  64. package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +7 -0
  65. package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +8 -0
  66. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +2 -0
  67. package/lib/anna-core.module.d.ts +36 -0
  68. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +8 -6
  69. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +5 -2
  70. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +134 -27
  71. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +8 -5
  72. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +3 -3
  73. 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 +1 -1
  74. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +1 -1
  75. package/package.json +11 -34
  76. package/public-api.d.ts +35 -3
  77. package/src/lib/anna-assets/images/bg-heads.png +0 -0
  78. package/src/lib/anna-common-scss/_animate.scss +27 -0
  79. package/src/lib/anna-common-scss/_application-spacing.scss +6 -0
  80. package/src/lib/anna-common-scss/_bootstrap-tooltip.scss +25 -0
  81. package/src/lib/anna-common-scss/_colors.scss +107 -0
  82. package/src/lib/anna-common-scss/_customDropdown.scss +129 -0
  83. package/src/lib/anna-common-scss/_dashboard-partials.scss +104 -0
  84. package/src/lib/anna-common-scss/_date-picker-form.scss +87 -0
  85. package/src/lib/anna-common-scss/_filters.scss +641 -0
  86. package/src/lib/anna-common-scss/_font.scss +10 -0
  87. package/src/lib/anna-common-scss/_fonts.scss +86 -0
  88. package/src/lib/anna-common-scss/_generic-table-common.scss +112 -0
  89. package/src/lib/anna-common-scss/_legend.scss +11 -0
  90. package/src/lib/anna-common-scss/_mixins.scss +188 -0
  91. package/src/lib/anna-common-scss/_modal.scss +37 -0
  92. package/src/lib/anna-common-scss/_ng-select.scss +176 -0
  93. package/src/lib/anna-common-scss/_sort.scss +30 -0
  94. package/src/lib/anna-common-scss/_toggle.scss +84 -0
  95. package/src/lib/anna-common-scss/style.scss +1 -0
  96. package/esm2020/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +0 -59
  97. package/esm2020/lib/anna-core-shared-lib/index.mjs +0 -2
  98. package/esm2020/lib/anna-core-shared-lib/public-api.mjs +0 -26
  99. package/esm2020/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +0 -43
  100. package/esm2020/lib/anna-dropdown-lib/index.mjs +0 -2
  101. package/esm2020/lib/anna-dropdown-lib/public-api.mjs +0 -6
  102. package/esm2020/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +0 -86
  103. package/esm2020/lib/anna-generic-table-lib/index.mjs +0 -2
  104. package/esm2020/lib/anna-generic-table-lib/public-api.mjs +0 -10
  105. package/esm2020/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +0 -59
  106. package/esm2020/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +0 -5
  107. package/esm2020/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +0 -15
  108. package/esm2020/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +0 -15
  109. package/esm2020/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +0 -22
  110. package/esm2020/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +0 -15
  111. package/esm2020/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +0 -21
  112. package/esm2020/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +0 -15
  113. package/esm2020/src/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -34
  114. package/esm2020/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +0 -2
  115. package/esm2020/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +0 -2
  116. package/esm2020/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +0 -3
  117. package/esm2020/src/lib/anna-core-shared-lib/models/anna-sort.model.mjs +0 -2
  118. package/esm2020/src/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +0 -28
  119. package/esm2020/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +0 -31
  120. package/esm2020/src/lib/anna-core-shared-lib/public-api.mjs +0 -26
  121. package/esm2020/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +0 -180
  122. package/esm2020/src/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -588
  123. package/esm2020/src/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +0 -48
  124. package/esm2020/src/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +0 -133
  125. package/esm2020/src/lib/anna-core-shared-lib/services/anna-sort.service.mjs +0 -145
  126. package/esm2020/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +0 -43
  127. package/esm2020/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +0 -5
  128. package/esm2020/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +0 -90
  129. package/esm2020/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -360
  130. package/esm2020/src/lib/anna-dropdown-lib/public-api.mjs +0 -6
  131. package/esm2020/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +0 -86
  132. package/esm2020/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +0 -5
  133. package/esm2020/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -1392
  134. package/esm2020/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +0 -55
  135. package/esm2020/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
  136. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +0 -189
  137. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +0 -2
  138. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
  139. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +0 -2
  140. package/esm2020/src/lib/anna-generic-table-lib/public-api.mjs +0 -10
  141. package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +0 -1307
  142. package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +0 -1
  143. package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +0 -486
  144. package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +0 -1
  145. package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +0 -2222
  146. package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +0 -1
  147. package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +0 -1307
  148. package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +0 -1
  149. package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +0 -484
  150. package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +0 -1
  151. package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +0 -2221
  152. package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +0 -1
  153. package/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +0 -14
  154. package/lib/anna-core-shared-lib/index.d.ts +0 -1
  155. package/lib/anna-core-shared-lib/public-api.d.ts +0 -19
  156. package/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +0 -11
  157. package/lib/anna-dropdown-lib/index.d.ts +0 -1
  158. package/lib/anna-dropdown-lib/public-api.d.ts +0 -3
  159. package/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +0 -21
  160. package/lib/anna-generic-table-lib/index.d.ts +0 -1
  161. package/lib/anna-generic-table-lib/public-api.d.ts +0 -6
  162. package/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +0 -14
  163. package/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.d.ts +0 -5
  164. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +0 -8
  165. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +0 -8
  166. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +0 -11
  167. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +0 -8
  168. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +0 -11
  169. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +0 -8
  170. package/src/lib/anna-core-shared-lib/constants/shared.constant.d.ts +0 -32
  171. package/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +0 -8
  172. package/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +0 -95
  173. package/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +0 -70
  174. package/src/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +0 -6
  175. package/src/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +0 -23
  176. package/src/lib/anna-core-shared-lib/package.json +0 -10
  177. package/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +0 -9
  178. package/src/lib/anna-core-shared-lib/public-api.d.ts +0 -19
  179. package/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +0 -25
  180. package/src/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +0 -80
  181. package/src/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +0 -14
  182. package/src/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +0 -21
  183. package/src/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +0 -14
  184. package/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +0 -11
  185. package/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.d.ts +0 -5
  186. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +0 -32
  187. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +0 -67
  188. package/src/lib/anna-dropdown-lib/package.json +0 -10
  189. package/src/lib/anna-dropdown-lib/public-api.d.ts +0 -3
  190. package/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +0 -21
  191. package/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.d.ts +0 -5
  192. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +0 -191
  193. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +0 -14
  194. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +0 -141
  195. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +0 -89
  196. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +0 -1
  197. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +0 -45
  198. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +0 -1
  199. package/src/lib/anna-generic-table-lib/package.json +0 -10
  200. package/src/lib/anna-generic-table-lib/public-api.d.ts +0 -6
  201. /package/{annalib-anna-core.d.ts → index.d.ts} +0 -0
@@ -1,32 +1,65 @@
1
1
  import { Injectable } from "@angular/core";
2
2
  // Third party import statements
3
3
  import { min, max, map, sortBy, uniq, cloneDeep, isEqual } from "lodash-es";
4
- import moment from "moment";
4
+ import dayjs from "dayjs";
5
+ import minMax from "dayjs/plugin/minMax";
6
+ import isBetween from "dayjs/plugin/isBetween";
7
+ import { SortTypeEnum } from '../models/anna-sort.model';
5
8
  // User defined import statements
6
- import { AllSelectedStatus, tooltipModelForColumnLevelFiltering } from "../models/anna-tooltip.model";
7
9
  import { AnnaDateTimeFormatService } from './anna-date-time-format.service';
10
+ import { AnnaSortService } from './anna-sort.service';
8
11
  import * as i0 from "@angular/core";
9
12
  import * as i1 from "./anna-date-time-format.service";
13
+ import * as i2 from "./anna-sort.service";
10
14
  export class AnnaFilterService {
11
- constructor(dateTimeFormatService) {
15
+ constructor(dateTimeFormatService, annaSortService) {
12
16
  this.dateTimeFormatService = dateTimeFormatService;
17
+ this.annaSortService = annaSortService;
13
18
  this.tooltipMap = new Map();
14
19
  this.tooltipSelectedMap = new Map();
15
20
  this.appliedFiltersArray = [];
16
- this.sliderCurrencySet = new Set(["booked", "cpp", "cpm", "rcvPreempt", "osPreempt", "postedAdu", "scheduledAdu", "audienceDeficit", "Rate"]);
21
+ this.sliderCurrencySet = new Set([
22
+ 'booked',
23
+ 'cpp',
24
+ 'cpm',
25
+ 'rcvPreempt',
26
+ 'osPreempt',
27
+ 'postedAdu',
28
+ 'scheduledAdu',
29
+ 'audienceDeficit',
30
+ 'Rate',
31
+ 'userADUs',
32
+ 'buyerChanges',
33
+ 'userChanges',
34
+ 'userMG',
35
+ ]);
36
+ this.isFilterSortActive = {};
37
+ this.resetFilterSortActiveStatus = true;
17
38
  this.percentTranslateFunction = (data) => {
18
- const val = data.toFixed(1) + "%";
19
- return val;
39
+ if (Math.abs(data) >= 1000) {
40
+ let isNegVal = data < 0;
41
+ const val = (Math.abs(data) / 1000).toFixed(1) + "k%";
42
+ return isNegVal ? "-" + val : val;
43
+ }
44
+ else {
45
+ let isNegVal = data < 0;
46
+ let isWholeNum = parseInt(data.toString()) == data;
47
+ let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
48
+ return isNegVal ? "-" + val + "%" : val + "%";
49
+ }
20
50
  };
21
51
  this.currencyTranslateFunction = (data) => {
22
- if (data >= 1000) {
23
- const val = (data / 1000).toFixed(1) + "k";
24
- return "$" + val;
52
+ if (Math.abs(data) >= 1000) {
53
+ let isNegVal = data < 0;
54
+ const val = "$" + (Math.abs(data) / 1000).toFixed(1) + "k";
55
+ return isNegVal ? "-" + val : val;
25
56
  }
26
- else if (data != Math.floor(data)) {
27
- return data.toFixed(1).toString();
57
+ else {
58
+ let isNegVal = data < 0;
59
+ let isWholeNum = parseInt(data.toString()) == data;
60
+ let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
61
+ return isNegVal ? "-$" + val : "$" + val;
28
62
  }
29
- return "$" + data;
30
63
  };
31
64
  this.normalTranslateFunction = (data) => {
32
65
  if (data >= 1000) {
@@ -38,7 +71,8 @@ export class AnnaFilterService {
38
71
  }
39
72
  return data.toString();
40
73
  };
41
- console.log("AnnaFilterService service created.");
74
+ dayjs.extend(minMax);
75
+ dayjs.extend(isBetween);
42
76
  const sliderArr = [
43
77
  "rcvPreempt",
44
78
  "osPreempt",
@@ -66,10 +100,47 @@ export class AnnaFilterService {
66
100
  "udDeficitValue",
67
101
  "bookedValue",
68
102
  "bookedSpots",
69
- "userChanges"
103
+ "userChanges",
104
+ "UDGrp",
105
+ "UDImps",
106
+ "ODGrp",
107
+ "ODImps",
108
+ "udImpsPercent",
109
+ "udGrpPercent",
110
+ "odImpsPercent",
111
+ "odGrpPercent",
112
+ "userADUs",
113
+ "buyerChanges",
114
+ "userChanges",
115
+ "userMG",
116
+ "WeeklyAUR",
117
+ "WeeklyAURatingOrImpressions",
118
+ "ApprovedMGsValue",
119
+ "ApprovedADUsValue",
120
+ "BuyerChangesValue",
121
+ "UserChangesValue",
122
+ "BookedGRPOrIMPS",
123
+ "BookedCPPOrCPM",
124
+ "BookedValue",
125
+ "BookedSpots",
126
+ "BookedRate",
127
+ "BookedRTG",
128
+ "BookedIMPS",
129
+ "AURTG",
130
+ "AURTG",
131
+ "PostedRating",
132
+ "PostedImpressions",
133
+ "NormalizedOrderedRating",
134
+ "NormalizedOrderedImpressions",
135
+ "NormalizedPostedRating",
136
+ "NormalizedPostedImpressions",
137
+ "BookedGRP",
138
+ "BookedIMPSRevTab",
139
+ "BookedCPP",
140
+ "BookedCPM"
70
141
  ];
71
- const calendarArr = ["period", "AirDate", "flightStartDate", "flightEndDate", "date", "startDate", "endDate"];
72
- const timeArr = ["StartTimeForFilter", "EndTimeForFilter",
142
+ const calendarArr = ["period", "AirDate", "flightStartDate", "flightEndDate", "date", "startDate", "endDate", "revisionStartDate", "GeneratedOn", "Week"];
143
+ const timeArr = ["StartTimeForFilter", "EndTimeForFilter", "time",
73
144
  "start_time_for_filter", "end_time_for_filter", "startEndTimeMulti", "startEndTime"];
74
145
  this.sliderSet = new Set(sliderArr);
75
146
  this.calendarSet = new Set(calendarArr);
@@ -83,59 +154,30 @@ export class AnnaFilterService {
83
154
  }
84
155
  returnMinAndMaxDate(data, key) {
85
156
  data = data.filter((obj) => !["", "-", null].includes(obj[key]));
86
- let DateArr = data.map((obj) => moment(obj[key]));
87
- let minDate = moment.min(DateArr);
88
- let maxDate = moment.max(DateArr);
157
+ let DateArr = data.map((obj) => dayjs(obj[key]));
158
+ let minDate = dayjs.min(DateArr);
159
+ let maxDate = dayjs.max(DateArr);
89
160
  return [minDate, maxDate];
90
161
  }
91
162
  isTooltipActive(header, sortMap) {
92
163
  let set = new Set(this.appliedFiltersArray);
164
+ let isSortMapForHeader0Active = sortMap.has(header[0]) && (sortMap.get(header[0]) != SortTypeEnum.DEFAULT);
165
+ let isSortMapForHeader1Active = sortMap.has(header[1]) && (sortMap.get(header[1]) != SortTypeEnum.DEFAULT);
93
166
  if (header.length == 1) {
94
- return ((sortMap.size > 0 && sortMap.get(header[0]) != "DEFAULT") || set.has(header[0]));
167
+ return ((sortMap.size > 0 && isSortMapForHeader0Active) || set.has(header[0]));
95
168
  }
96
- return ((sortMap.size > 0 && sortMap.get(header[0]) != "DEFAULT") || (sortMap.size > 0 && sortMap.get(header[1]) != "DEFAULT") || set.has(header[0]) || set.has(header[1]));
169
+ return ((sortMap.size > 0 && sortMap.has(header[0]) && isSortMapForHeader0Active) || (sortMap.size > 0 && sortMap.has(header[1]) && isSortMapForHeader1Active) || set.has(header[0]) || set.has(header[1]));
97
170
  }
98
171
  clearColumnFilter() {
99
- this.tooltipSelectedMap.delete(this.selectedRadio);
100
- let appliedFilterSet = new Set(this.appliedFiltersArray);
101
- appliedFilterSet.delete(this.selectedRadio);
102
- this.appliedFiltersArray = [...appliedFilterSet];
103
- }
104
- populateSliderTooltip(completeData, filteredData) {
105
- let minValue;
106
- let maxValue;
107
- if (this.appliedFiltersArray.length > 0 &&
108
- this.appliedFiltersArray[this.appliedFiltersArray.length - 1] === this.selectedRadio) {
109
- let subsetData;
110
- let subfilterApplied = false;
111
- //applying all filterexcept the current filter
112
- if (this.selectedRadio === "postedAdu" && this.tooltipSelectedMap.has("isAudRequired")) {
113
- this.tooltipSelectedMap.delete("isAudRequired");
114
- subfilterApplied = true;
115
- }
116
- subsetData = this.filterData(completeData, this.selectedRadio);
117
- //need to find min and max value for
118
- minValue = this.returnMaxAndMinValue(subsetData, this.selectedRadio, true);
119
- maxValue = this.returnMaxAndMinValue(subsetData, this.selectedRadio, false);
120
- if (this.selectedRadio === "postedAdu" && subfilterApplied) {
121
- this.tooltipSelectedMap.set("isAudRequired", [false]);
122
- }
123
- }
124
- else {
125
- minValue = this.returnMaxAndMinValue(filteredData, this.selectedRadio, true);
126
- maxValue = this.returnMaxAndMinValue(filteredData, this.selectedRadio, false);
127
- }
128
- this.ngxSliderObj = this.setOptionValues(minValue, maxValue);
129
- if (this.translateFunc === "normal") {
130
- this.ngxSliderObj.translate = this.normalTranslateFunction;
172
+ if (this.tooltipSelectedMap.has(this.selectedRadio)) {
173
+ this.tooltipSelectedMap.delete(this.selectedRadio);
174
+ let appliedFilterSet = new Set(this.appliedFiltersArray);
175
+ appliedFilterSet.delete(this.selectedRadio);
176
+ this.appliedFiltersArray = [...appliedFilterSet];
131
177
  }
132
- else if (this.translateFunc === "percent") {
133
- this.ngxSliderObj.translate = this.percentTranslateFunction;
178
+ if (this.annaSortService.columnSortState.has(this.selectedRadio)) {
179
+ this.annaSortService.columnSortState.delete(this.selectedRadio);
134
180
  }
135
- else if (this.translateFunc === "currency") {
136
- this.ngxSliderObj.translate = this.currencyTranslateFunction;
137
- }
138
- return this.ngxSliderObj;
139
181
  }
140
182
  setOptionValues(minValue, maxValue) {
141
183
  return {
@@ -145,156 +187,14 @@ export class AnnaFilterService {
145
187
  translate: this.normalTranslateFunction
146
188
  };
147
189
  }
148
- populateTooltip(selectedColumnName, completeData, filteredData) {
149
- let tooltipData;
150
- if (this.appliedFiltersArray.length === 0) {
151
- tooltipData = this.populateTooltipDataBasedOnSelectedRadio([selectedColumnName], completeData);
152
- tooltipData.forEach((item) => (item.isHidden = false));
153
- }
154
- else if (selectedColumnName === this.appliedFiltersArray[this.appliedFiltersArray.length - 1]) {
155
- let subsetData = this.filterData(completeData, selectedColumnName); //filter the data without applying the latest filter
156
- tooltipData = this.showHideFilterCheckbox(subsetData, selectedColumnName);
157
- }
158
- else {
159
- //if it is not the latest filter
160
- //then filtered Data will be used
161
- //create the option data
162
- if (!this.tooltipMap.has(selectedColumnName)) {
163
- this.populateTooltipDataBasedOnSelectedRadio([selectedColumnName], completeData);
164
- }
165
- tooltipData = this.showHideFilterCheckbox(filteredData, selectedColumnName);
166
- }
167
- return tooltipData;
168
- }
169
- populateTooltipDataBasedOnSelectedRadio(value, originalData) {
170
- //if the initial tooltip data is already present fetch from the map
171
- if (this.tooltipMap.has(value[0])) {
172
- return this.tooltipMap.get(value[0]);
173
- }
174
- else {
175
- //get the unique values from the column and save it in the map
176
- this.selectedRadio = value[0];
177
- const data = sortBy(originalData.map((u) => u[this.selectedRadio])).filter((n) => n !== null); //sorting the data in alphabetical order
178
- const dataSet = new Set(data); //created a set from the data
179
- const toolTipdata = [...dataSet].map((x) => new tooltipModelForColumnLevelFiltering(x));
180
- this.tooltipMap.set(value[0], toolTipdata); //setting the key value pair in the tooltipMap
181
- this.tooltipSelectedMap.set(value[0], map(toolTipdata, "data")); //setting the key value pair in tooltipSelectedMap
182
- return toolTipdata;
183
- }
184
- }
185
- showHideFilterCheckbox(arr, selectedColumnName) {
186
- let currentSubsetData = uniq(arr.map((u) => u[selectedColumnName]));
187
- //get the initial tooltip Data
188
- let tooltipData = this.tooltipMap.get(selectedColumnName);
189
- //show or hide the value
190
- tooltipData.forEach((value) => {
191
- //if the element is not present then hide the element
192
- let elementToFindIndex = currentSubsetData.findIndex((n) => n === value.data);
193
- if (elementToFindIndex === -1) {
194
- value.isHidden = true;
195
- }
196
- else {
197
- //show the element
198
- value.isHidden = false;
199
- }
200
- });
201
- return tooltipData;
202
- }
203
- isAllOptionsSelected() {
204
- let allSelected;
205
- let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
206
- let selectedOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden && x.isSelected).length;
207
- if (selectedOptionsCount === 0) {
208
- allSelected = AllSelectedStatus.none;
209
- }
210
- else if (selectedOptionsCount > 0 && selectedOptionsCount < totalOptionsCount) {
211
- allSelected = AllSelectedStatus.fewSelected;
212
- }
213
- else {
214
- allSelected = AllSelectedStatus.allSelected;
215
- }
216
- return allSelected;
217
- }
218
- populateDatePickerTooltipWithData(completeData, filteredData) {
219
- let enabledDates;
220
- //some filter is applied and the latest filter is the date filter
221
- if (this.appliedFiltersArray.length > 0 &&
222
- this.appliedFiltersArray[this.appliedFiltersArray.length - 1] === this.selectedRadio) {
223
- let subsetData;
224
- //applying all filterexcept thec current filter
225
- if (this.selectedRadio === "period") {
226
- subsetData = this.filterData(completeData, "period");
227
- let minStartDate = this.returnMinAndMaxDate(subsetData, "startDate");
228
- let maxEndDate = this.returnMinAndMaxDate(subsetData, "endDate");
229
- enabledDates = { minStartDate: minStartDate[0], maxEndDate: maxEndDate[1] };
230
- }
231
- else if (this.selectedRadio === "AirDate" || this.selectedRadio === "flightStartDate" ||
232
- this.selectedRadio === "flightEndDate" || this.selectedRadio == "date") {
233
- subsetData = this.filterData(completeData, this.selectedRadio);
234
- let minAndMaxDate = this.returnMinAndMaxDate(subsetData, this.selectedRadio);
235
- enabledDates = { minStartDate: minAndMaxDate[0], maxEndDate: minAndMaxDate[1] };
236
- }
237
- else {
238
- subsetData = this.filterData(completeData, this.selectedRadio);
239
- //need to find min and max date for start and end date
240
- //enabledDates is an arr of minDate and maxDate
241
- enabledDates = this.returnMinAndMaxDate(subsetData, this.selectedRadio);
242
- }
243
- }
244
- else {
245
- if (this.selectedRadio === "period") {
246
- let minStartDate = this.returnMinAndMaxDate(filteredData, "startDate");
247
- let maxEndDate = this.returnMinAndMaxDate(filteredData, "endDate");
248
- enabledDates = { minStartDate: minStartDate[0], maxEndDate: maxEndDate[1] };
249
- }
250
- else if (this.selectedRadio === "AirDate" || this.selectedRadio === "flightStartDate" ||
251
- this.selectedRadio === "flightEndDate" || this.selectedRadio == "date") {
252
- let minAndMaxDate = this.returnMinAndMaxDate(filteredData, this.selectedRadio);
253
- enabledDates = { minStartDate: minAndMaxDate[0], maxEndDate: minAndMaxDate[1] };
254
- }
255
- else {
256
- //need to find min and max date for start and end date.
257
- // enabledDates is an arr of minDate and maxDate
258
- enabledDates = this.returnMinAndMaxDate(filteredData, this.selectedRadio);
259
- }
260
- }
261
- return enabledDates;
262
- }
263
190
  findUniqueDatesWithData(data) {
264
191
  let uniqueDates = uniq(data.map((u) => u["date"]));
265
192
  let uniqueDatesInNgbDateFormat = [];
266
193
  uniqueDates.forEach((date) => {
267
- uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(moment(date, "MM/DD/YY").format("MM/DD/YYYY")));
194
+ uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(dayjs(date, "MM/DD/YY").format("MM/DD/YYYY")));
268
195
  });
269
196
  return uniqueDatesInNgbDateFormat;
270
197
  }
271
- isCheckboxSelected(selectedData) {
272
- selectedData.isSelected = !selectedData.isSelected;
273
- let allSelected = this.isAllOptionsSelected();
274
- return allSelected;
275
- }
276
- allOptionsClicked(status) {
277
- let header = this.selectedRadio;
278
- if (status === 1) {
279
- this.tooltipMap.get(header).forEach((item) => {
280
- if (!item.isHidden) {
281
- item.isSelected = true;
282
- }
283
- });
284
- this.tooltipSelectedMap.set(header, this.tooltipMap
285
- .get(header)
286
- .filter((x) => x.isSelected)
287
- .map((x) => x.data));
288
- }
289
- else {
290
- this.tooltipMap.get(header).forEach((item) => {
291
- if (!item.isHidden) {
292
- item.isSelected = false;
293
- }
294
- });
295
- this.tooltipSelectedMap.delete(header);
296
- }
297
- }
298
198
  reOrderAppliedFiltersArray(isHierarchialUserFiltered, date) {
299
199
  let isFiltered = true;
300
200
  isFiltered = this.checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date);
@@ -304,7 +204,7 @@ export class AnnaFilterService {
304
204
  if (this.selectedRadio == "user" && !this.tooltipMap.has("user")) {
305
205
  isFiltered = cloneDeep(isHierarchialUserFiltered);
306
206
  }
307
- else if (this.selectedRadio == "StartTimeForFilter" || this.selectedRadio == "EndTimeForFilter"
207
+ else if (this.selectedRadio == "StartTimeForFilter" || this.selectedRadio == "EndTimeForFilter" || this.selectedRadio == "time"
308
208
  || this.selectedRadio == "start_time_for_filter" || this.selectedRadio == "end_time_for_filter" || this.selectedRadio == "startEndTimeMulti") {
309
209
  isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) || !this.includeZeroTime || !this.includeMultiTime;
310
210
  }
@@ -326,7 +226,10 @@ export class AnnaFilterService {
326
226
  this.selectedRadio == "AirDate" ||
327
227
  this.selectedRadio === "flightStartDate" ||
328
228
  this.selectedRadio === "flightEndDate" ||
329
- this.selectedRadio == "date") {
229
+ this.selectedRadio == "date" ||
230
+ this.selectedRadio == "revisionStartDate" ||
231
+ this.selectedRadio == "GeneratedOn" ||
232
+ this.selectedRadio == "Week") {
330
233
  isFiltered =
331
234
  !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) &&
332
235
  !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
@@ -362,14 +265,14 @@ export class AnnaFilterService {
362
265
  if (this.sliderSet.has(key)) {
363
266
  filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
364
267
  }
365
- else if (key === "startDate" || key === "endDate" || key === "AirDate" || key === "flightStartDate" || key === "flightEndDate" || key == "date") {
268
+ else if (key === "startDate" || key === "endDate" || key === "AirDate" || key === "flightStartDate" || key === "flightEndDate" || key == "date" || key == "revisionStartDate" || key == "GeneratedOn" || key === "Week") {
366
269
  filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
367
270
  }
368
271
  else if (key === "period") {
369
272
  filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
370
273
  }
371
274
  else if (key === "StartTimeForFilter" || key === "EndTimeForFilter"
372
- || key === "start_time_for_filter" || key === "end_time_for_filter") {
275
+ || key === "start_time_for_filter" || key === "end_time_for_filter" || key == "time") {
373
276
  filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
374
277
  }
375
278
  else if (key === "startEndTimeMulti" || key == "startEndTime" || key === "TimeBand") {
@@ -383,17 +286,17 @@ export class AnnaFilterService {
383
286
  return filteredData;
384
287
  }
385
288
  returnOrdersInTheRange(order, range, key) {
386
- let isDateBetweenTheSelectedRange = moment(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
387
- let isDateSameAsTheMinSelectedDate = moment(order[key]).isSame(range.minSelectedDate);
388
- let isDateSameAsTheMaxSelectedDate = moment(order[key]).isSame(range.maxSelectedDate);
289
+ let isDateBetweenTheSelectedRange = dayjs(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
290
+ let isDateSameAsTheMinSelectedDate = dayjs(order[key]).isSame(range.minSelectedDate);
291
+ let isDateSameAsTheMaxSelectedDate = dayjs(order[key]).isSame(range.maxSelectedDate);
389
292
  return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
390
293
  }
391
294
  returnDataForTimeRange(obj, selectedData) {
392
295
  let format = "HH:mm:ss";
393
- let selectedStartDate = moment(selectedData.startTime, format);
394
- let selectedEndDate = moment(selectedData.endTime, format);
395
- let startTime = moment(obj.startTime, format);
396
- let endTime = moment(obj.endTime, format);
296
+ let selectedStartDate = dayjs(selectedData.startTime, format);
297
+ let selectedEndDate = dayjs(selectedData.endTime, format);
298
+ let startTime = dayjs(obj.startTime, format);
299
+ let endTime = dayjs(obj.endTime, format);
397
300
  let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedStartDate);
398
301
  let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedStartDate, selectedEndDate);
399
302
  let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedEndDate);
@@ -405,8 +308,8 @@ export class AnnaFilterService {
405
308
  }
406
309
  returnDataForFromAndToTimeRange(obj, selectedData, key) {
407
310
  let format = "HH:mm:ss";
408
- let selectedFromTime = moment(selectedData.fromTime, format);
409
- let selectedToTime = moment(selectedData.toTime, format);
311
+ let selectedFromTime = dayjs(selectedData.fromTime, format);
312
+ let selectedToTime = dayjs(selectedData.toTime, format);
410
313
  let objTime = obj[key];
411
314
  if (["", "-", null].includes(objTime)) {
412
315
  return false;
@@ -426,28 +329,18 @@ export class AnnaFilterService {
426
329
  if (!selectedData.includeTimeRange) {
427
330
  return false;
428
331
  }
429
- // objTime = this.dateTimeFormatService.formatToTwelveHrs(objTime, true);
430
- // objTime = this.dateTimeFormatService.convertTotwentyFourHrsFormat(
431
- // objTime[0] + ":" + objTime[1] + " " + objTime[2],
432
- // true
433
- // );
434
- // objTime = objTime[0] + ":" + objTime[1] + ":00";
435
- // objTime = moment(objTime, format);
436
- let momentTime = moment(objTime, format);
437
- console.log(momentTime);
438
- console.log(selectedFromTime);
439
- console.log(selectedToTime);
440
- let isObjTimeSameAsSelectedFromTime = momentTime.isSame(selectedFromTime);
441
- let isObjTimeSameAsSelectedToTime = momentTime.isSame(selectedToTime);
442
- let isObjTimeBetweenSelectedFromTimeAndToTime = momentTime.isBetween(selectedFromTime, selectedToTime);
332
+ let dayjsTime = dayjs(objTime, format);
333
+ let isObjTimeSameAsSelectedFromTime = dayjsTime.isSame(selectedFromTime);
334
+ let isObjTimeSameAsSelectedToTime = dayjsTime.isSame(selectedToTime);
335
+ let isObjTimeBetweenSelectedFromTimeAndToTime = dayjsTime.isBetween(selectedFromTime, selectedToTime);
443
336
  return (isObjTimeSameAsSelectedFromTime ||
444
337
  isObjTimeSameAsSelectedToTime ||
445
338
  isObjTimeBetweenSelectedFromTimeAndToTime);
446
339
  }
447
340
  returnDataForStartAndEndTimeRange(obj, selectedData, key) {
448
341
  let format = "HH:mm:ss";
449
- let selectedFromTime = moment(selectedData.fromTime, format);
450
- let selectedToTime = moment(selectedData.toTime, format);
342
+ let selectedFromTime = dayjs(selectedData.fromTime, format);
343
+ let selectedToTime = dayjs(selectedData.toTime, format);
451
344
  if (selectedData.includeMulti && obj[key][0] == "<multi>") {
452
345
  return true;
453
346
  }
@@ -463,8 +356,8 @@ export class AnnaFilterService {
463
356
  if (!selectedData.includeTimeRange) {
464
357
  return false;
465
358
  }
466
- let startTime = moment(obj[key][1], format);
467
- let endTime = moment(obj[key][2], format);
359
+ let startTime = dayjs(obj[key][1], format);
360
+ let endTime = dayjs(obj[key][2], format);
468
361
  let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
469
362
  let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
470
363
  let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
@@ -478,21 +371,20 @@ export class AnnaFilterService {
478
371
  let parsingFormat;
479
372
  if (key === "period") {
480
373
  parsingFormat = "YYYY-MM-DD";
481
- let momentStartDate = moment(obj.startDate);
482
- let momentEndDate = moment(obj.endDate);
483
- let startDateIsBetweenSelDate = momentStartDate.isBetween(value.fromDate, value.toDate);
484
- let endDateIsBetweenSelDate = momentEndDate.isBetween(value.fromDate, value.toDate);
485
- console.log(moment(obj.startDate, parsingFormat));
486
- let startDateIsSameAsSelStartDate = value.fromDate.isSame(momentStartDate);
487
- let endDateIsSameAsSelEndDate = value.toDate.isSame(momentEndDate);
374
+ let dayjsStartDate = dayjs(obj.startDate);
375
+ let dayjsEndDate = dayjs(obj.endDate);
376
+ let startDateIsBetweenSelDate = dayjsStartDate.isBetween(value.fromDate, value.toDate);
377
+ let endDateIsBetweenSelDate = dayjsEndDate.isBetween(value.fromDate, value.toDate);
378
+ let startDateIsSameAsSelStartDate = value.fromDate.isSame(dayjsStartDate);
379
+ let endDateIsSameAsSelEndDate = value.toDate.isSame(dayjsEndDate);
488
380
  return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
489
381
  (endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
490
382
  }
491
- else if (key === "AirDate" || key === "flightStartDate" || key === "flightEndDate") {
383
+ else if (key === "AirDate" || key === "flightStartDate" || key === "flightEndDate" || key === "Week") {
492
384
  parsingFormat = "MM/DD/YYYY";
493
- let dateIsBetweenSelDate = moment(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
494
- let dateIsSameAsSelStartDate = moment(obj[key], parsingFormat).isSame(value.minSelectedDate);
495
- let dateIsSameAsSelEndDate = moment(obj[key], parsingFormat).isSame(value.maxSelectedDate);
385
+ let dateIsBetweenSelDate = dayjs(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
386
+ let dateIsSameAsSelStartDate = dayjs(obj[key], parsingFormat).isSame(value.minSelectedDate);
387
+ let dateIsSameAsSelEndDate = dayjs(obj[key], parsingFormat).isSame(value.maxSelectedDate);
496
388
  return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
497
389
  }
498
390
  }
@@ -519,12 +411,11 @@ export class AnnaFilterService {
519
411
  }
520
412
  return uniq(data.map((u) => u[headerName])).length > 1 ? false : true;
521
413
  }
522
- getFilterOptionsData(data, clonedData) {
414
+ getFilterOptionsData(data, clonedData, key) {
523
415
  let appliedFilterSet = new Set(this.appliedFiltersArray);
524
- console.log("appliedFilterSet");
525
- console.log(appliedFilterSet);
526
- if (appliedFilterSet.has(this.selectedRadio)) {
527
- return this.filterData(clonedData, this.selectedRadio);
416
+ key = key ? key : this.selectedRadio;
417
+ if (appliedFilterSet.has(key)) {
418
+ return this.filterData(clonedData, key);
528
419
  }
529
420
  else {
530
421
  return data;
@@ -547,14 +438,14 @@ export class AnnaFilterService {
547
438
  if (this.sliderSet.has(key)) {
548
439
  filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
549
440
  }
550
- else if (key === "startDate" || key === "endDate" || key === "AirDate" || key === "flightStartDate" || key === "flightEndDate" || key == "date") {
441
+ else if (key === "startDate" || key === "endDate" || key === "AirDate" || key === "flightStartDate" || key === "flightEndDate" || key == "date" || key == "revisionStartDate" || key == "GeneratedOn" || key === "Week") {
551
442
  filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
552
443
  }
553
444
  else if (key === "period") {
554
445
  filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
555
446
  }
556
447
  else if (key === "StartTimeForFilter" || key === "EndTimeForFilter"
557
- || key === "start_time_for_filter" || key === "end_time_for_filter") {
448
+ || key === "start_time_for_filter" || key === "end_time_for_filter" || key == "time") {
558
449
  filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
559
450
  }
560
451
  else if (key === "startEndTimeMulti" || key == "startEndTime" || key === "TimeBand") {
@@ -567,22 +458,36 @@ export class AnnaFilterService {
567
458
  }
568
459
  isObjectInTheRange(obj, value, key) {
569
460
  let objVal = obj[key];
570
- let momentDate = moment(objVal);
571
- console.log(objVal);
572
- console.log(value.fromDate);
461
+ let dayjsDate = dayjs(objVal);
573
462
  let isDateSameAsStartOfTheRange = value.fromDate.isSame(objVal);
574
463
  let isDateSameAsEndOfTheRange = value.toDate.isSame(objVal);
575
- let isDateBetweenTheStartAndEndOfRange = momentDate.isBetween(value.fromDate, value.toDate);
464
+ let isDateBetweenTheStartAndEndOfRange = dayjsDate.isBetween(value.fromDate, value.toDate);
576
465
  return isDateSameAsStartOfTheRange || isDateSameAsEndOfTheRange || isDateBetweenTheStartAndEndOfRange;
577
466
  }
467
+ updateStateOfTheCurrentFilterTab(sortMap) {
468
+ let activeKey = this.selectedRadio;
469
+ let keyArr = [];
470
+ Object.keys(this.isFilterSortActive).forEach(key => {
471
+ if (key.includes(activeKey)) {
472
+ keyArr = key.split(",");
473
+ this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
474
+ }
475
+ });
476
+ }
477
+ updateStateOfAllTheKeys(sortMap) {
478
+ Object.keys(this.isFilterSortActive).forEach(key => {
479
+ let keyArr = key.split(",");
480
+ this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
481
+ });
482
+ }
578
483
  }
579
484
  AnnaFilterService.bufferSize = 20;
580
- AnnaFilterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }], target: i0.ɵɵFactoryTarget.Injectable });
581
- AnnaFilterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, providedIn: 'root' });
582
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, decorators: [{
485
+ AnnaFilterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }, { token: i2.AnnaSortService }], target: i0.ɵɵFactoryTarget.Injectable });
486
+ AnnaFilterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AnnaFilterService, providedIn: 'root' });
487
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AnnaFilterService, decorators: [{
583
488
  type: Injectable,
584
489
  args: [{
585
490
  providedIn: 'root'
586
491
  }]
587
- }], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }]; } });
588
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRHLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDOzs7QUFLekYsTUFBTSxPQUFPLGlCQUFpQjtJQTBCNUIsWUFBb0IscUJBQWdEO1FBQWhELDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBMkI7UUF4QnBFLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JBQW1CLEdBQWEsRUFBRSxDQUFDO1FBSW5DLHNCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsWUFBWSxFQUFDLFdBQVcsRUFBQyxXQUFXLEVBQUMsY0FBYyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUF5SGpJLDZCQUF3QixHQUFHLENBQUMsSUFBWSxFQUFVLEVBQUU7WUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFD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QUFDLENBQUM7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsSUFBSSwyQkFBMkIsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRSxJQUFJLHlCQUF5QixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELElBQUksa0NBQWtDLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRixPQUFPLDJCQUEyQixJQUFJLHlCQUF5QixJQUFJLGtDQUFrQyxDQUFDO0lBQ3hHLENBQUM7O0FBL25CYSw0QkFBVSxHQUFHLEVBQUcsQ0FBQTs4R0F4Qm5CLGlCQUFpQjtrSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07MkZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyLXNsaWRlci9uZ3gtc2xpZGVyJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBUaGlyZCBwYXJ0eSBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBtaW4sIG1heCwgbWFwLCBzb3J0QnksIHVuaXEsIGNsb25lRGVlcCwgaXNFcXVhbCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcblxyXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHMgXHJcbmltcG9ydCB7IEFsbFNlbGVjdGVkU3RhdHVzLCB0b29sdGlwTW9kZWxGb3JDb2x1bW5MZXZlbEZpbHRlcmluZyB9IGZyb20gXCIuLi9tb2RlbHMvYW5uYS10b29sdGlwLm1vZGVsXCI7XHJcbmltcG9ydCB7IFNvcnRUeXBlIH0gZnJvbSAnLi4vcHVibGljLWFwaSc7XHJcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsIE5nYkRhdGVUeXBlIH0gZnJvbSAnLi9hbm5hLWRhdGUtdGltZS1mb3JtYXQuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbm5hRmlsdGVyU2VydmljZSB7XHJcblxyXG4gIHRvb2x0aXBNYXAgPSBuZXcgTWFwKCk7XHJcbiAgdG9vbHRpcFNlbGVjdGVkTWFwID0gbmV3IE1hcCgpO1xyXG4gIGluaXRpYWxWYWx1ZU1hcDogTWFwPHN0cmluZywgYW55PjtcclxuICB0cmFuc2xhdGVGdW5jOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRSYWRpbzogc3RyaW5nO1xyXG4gIHN1YlJhZGlvQnV0dG9uOiBzdHJpbmc7XHJcblxyXG4gIGNhbGVuZGFyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICBzbGlkZXJTZXQ6IFNldDxzdHJpbmc+O1xyXG4gIHRpbWVTZXQ6IFNldDxzdHJpbmc+O1xyXG5cclxuICBpbmNsdWRlTXVsdGlUaW1lOiBib29sZWFuO1xyXG4gIGluY2x1ZGVaZXJvVGltZTogYm9vbGVhbjtcclxuICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuO1xyXG5cclxuICBhcHBsaWVkRmlsdGVyc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZsaWdodERhdGVSYW5nZTogeyBtaW5TZWxlY3RlZERhdGU6IGFueSwgbWF4U2VsZWN0ZWREYXRlOiBhbnkgfTtcclxuICBzbGlkZXJEYXRhOiB7IG1pbjogYW55LCBtYXg6IGFueSB9O1xyXG4gIG5neFNsaWRlck9iajogT3B0aW9ucztcclxuICBzbGlkZXJDdXJyZW5jeVNldCA9IG5ldyBTZXQoW1wiYm9va2VkXCIsXCJjcHBcIixcImNwbVwiLFwicmN2UHJlZW1wdFwiLFwib3NQcmVlbXB0XCIsXCJwb3N0ZWRBZHVcIixcInNjaGVkdWxlZEFkdVwiLFwiYXVkaWVuY2VEZWZpY2l0XCIsXCJSYXRlXCJdKTtcclxuXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgYnVmZmVyU2l6ZSA9IDIwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVUaW1lRm9ybWF0U2VydmljZTogQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSkge1xyXG4gICAgY29uc29sZS5sb2coXCJBbm5hRmlsdGVyU2VydmljZSBzZXJ2aWNlIGNyZWF0ZWQuXCIpXHJcbiAgICBjb25zdCBzbGlkZXJBcnIgPSBbXHJcbiAgICAgIFwicmN2UHJlZW1wdFwiLFxyXG4gICAgICBcIm9zUHJlZW1wdFwiLFxyXG4gICAgICBcInJjdlVuZGVyRGx5XCIsXHJcbiAgICAgIFwicG9zdGVkQXVkUGVyY2VudFwiLFxyXG4gICAgICBcImJvb2tlZFwiLFxyXG4gICAgICBcInNwb3RzXCIsXHJcbiAgICAgIFwiZ3JwXCIsXHJcbiAgICAgIFwiY3BwXCIsXHJcbiAgICAgIFwiaW1wc1wiLFxyXG4gICAgICBcImNwbVwiLFxyXG4gICAgICBcIm9zVW5kZXJEbHlcIixcclxuICAgICAgXCJ0b3RhbFdlZWtzXCIsXHJcbiAgICAgIFwiV2Vla051bWJlclwiLFxyXG4gICAgICBcIlJhdGVcIixcclxuICAgICAgXCJPcmRlcmVkUmF0aW5nc09ySW1wcmVzc2lvbnNcIixcclxuICAgICAgXCJQb3N0ZWRSYXRpbmdzT3JJbXByZXNzaW9uc1wiLCAsXHJcbiAgICAgIFwicG9zdGVkQXVkUGVyY2VudFwiLFxyXG4gICAgICBcInBvc3RlZEFkdVwiLFxyXG4gICAgICBcInNjaGVkdWxlZEFkdVwiLFxyXG4gICAgICBcImF1ZGllbmNlRGVmaWNpdFwiLFxyXG4gICAgICBcIm9mZmVyZWRNR3NcIixcclxuICAgICAgXCJvdXRzdGFuZGluZ1BFXCIsXHJcbiAgICAgIFwib2ZmZXJlZEFEVXNcIixcclxuICAgICAgXCJ1ZERlZmljaXRWYWx1ZVwiLFxyXG4gICAgICBcImJvb2tlZFZhbHVlXCIsXHJcbiAgICAgIFwiYm9va2VkU3BvdHNcIixcclxuICAgICAgXCJ1c2VyQ2hhbmdlc1wiXHJcbiAgICBdO1xyXG4gICAgY29uc3QgY2FsZW5kYXJBcnIgPSBbXCJwZXJpb2RcIiwgXCJBaXJEYXRlXCIsIFwiZmxpZ2h0U3RhcnREYXRlXCIsIFwiZmxpZ2h0RW5kRGF0ZVwiLFwiZGF0ZVwiLCBcInN0YXJ0RGF0ZVwiLCBcImVuZERhdGVcIl07XHJcbiAgICBjb25zdCB0aW1lQXJyID0gW1wiU3RhcnRUaW1lRm9yRmlsdGVyXCIsIFwiRW5kVGltZUZvckZpbHRlclwiLFxyXG4gICAgICBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiLCBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiwgXCJzdGFydEVuZFRpbWVNdWx0aVwiLCBcInN0YXJ0RW5kVGltZVwiXTtcclxuICAgIHRoaXMuc2xpZGVyU2V0ID0gbmV3IFNldChzbGlkZXJBcnIpO1xyXG4gICAgdGhpcy5jYWxlbmRhclNldCA9IG5ldyBTZXQoY2FsZW5kYXJBcnIpO1xyXG4gICAgdGhpcy50aW1lU2V0ID0gbmV3IFNldCh0aW1lQXJyKTtcclxuICB9XHJcblxyXG4gIHJldHVybk1heEFuZE1pblZhbHVlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZywgaXNNaW46IGJvb2xlYW4pIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgY29uc3QgdmFsdWVzID0gZGF0YS5tYXAoKHgpID0+IHhba2V5XSk7XHJcbiAgICBsZXQgdmFsdWVUb1JldHVybiA9IGlzTWluID8gbWluKHZhbHVlcykgOiBtYXgodmFsdWVzKTtcclxuICAgIHJldHVybiB2YWx1ZVRvUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuTWluQW5kTWF4RGF0ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgbGV0IERhdGVBcnIgPSBkYXRhLm1hcCgob2JqKSA9PiBtb21lbnQob2JqW2tleV0pKTtcclxuICAgIGxldCBtaW5EYXRlID0gbW9tZW50Lm1pbihEYXRlQXJyKTtcclxuICAgIGxldCBtYXhEYXRlID0gbW9tZW50Lm1heChEYXRlQXJyKTtcclxuICAgIHJldHVybiBbbWluRGF0ZSwgbWF4RGF0ZV07XHJcbiAgfVxyXG5cclxuICBpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyOiBzdHJpbmdbXSwgc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgIGlmKGhlYWRlci5sZW5ndGggPT0gMSl7XHJcbiAgICAgIHJldHVybiAoIChzb3J0TWFwLnNpemUgPiAwICYmIHNvcnRNYXAuZ2V0KGhlYWRlclswXSkgIT0gXCJERUZBVUxUXCIpIHx8IHNldC5oYXMoaGVhZGVyWzBdKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKCAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmdldChoZWFkZXJbMF0pICE9IFwiREVGQVVMVFwiKSB8fCAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmdldChoZWFkZXJbMV0pICE9IFwiREVGQVVMVFwiKSB8fCBzZXQuaGFzKGhlYWRlclswXSkgfHwgc2V0LmhhcyhoZWFkZXJbMV0pKTsgXHJcblxyXG4gIH1cclxuXHJcbiAgY2xlYXJDb2x1bW5GaWx0ZXIoKSB7XHJcbiAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgIFxyXG4gICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG4gICAgYXBwbGllZEZpbHRlclNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSA9IFsuLi5hcHBsaWVkRmlsdGVyU2V0XTtcclxuICB9XHJcblxyXG4gIHBvcHVsYXRlU2xpZGVyVG9vbHRpcChjb21wbGV0ZURhdGE6IGFueVtdLCBmaWx0ZXJlZERhdGE6IGFueVtdKSB7XHJcbiAgICBsZXQgbWluVmFsdWU7XHJcbiAgICBsZXQgbWF4VmFsdWU7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPiAwICYmXHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheVt0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkubGVuZ3RoIC0gMV0gPT09IHRoaXMuc2VsZWN0ZWRSYWRpb1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBzdWJzZXREYXRhO1xyXG4gICAgICBsZXQgc3ViZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xyXG4gICAgICAvL2FwcGx5aW5nIGFsbCBmaWx0ZXJleGNlcHQgdGhlIGN1cnJlbnQgZmlsdGVyXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwicG9zdGVkQWR1XCIgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKFwiaXNBdWRSZXF1aXJlZFwiKSkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZShcImlzQXVkUmVxdWlyZWRcIik7XHJcbiAgICAgICAgc3ViZmlsdGVyQXBwbGllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgc3Vic2V0RGF0YSA9IHRoaXMuZmlsdGVyRGF0YShjb21wbGV0ZURhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIC8vbmVlZCB0byBmaW5kIG1pbiBhbmQgbWF4IHZhbHVlIGZvclxyXG4gICAgICBtaW5WYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoc3Vic2V0RGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvLCB0cnVlKTtcclxuICAgICAgbWF4VmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKHN1YnNldERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgZmFsc2UpO1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInBvc3RlZEFkdVwiICYmIHN1YmZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5zZXQoXCJpc0F1ZFJlcXVpcmVkXCIsIFtmYWxzZV0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtaW5WYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIHRydWUpO1xyXG4gICAgICBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMubmd4U2xpZGVyT2JqID0gdGhpcy5zZXRPcHRpb25WYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKTtcclxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZUZ1bmMgPT09IFwibm9ybWFsXCIpIHtcclxuICAgICAgdGhpcy5uZ3hTbGlkZXJPYmoudHJhbnNsYXRlID0gdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2xhdGVGdW5jID09PSBcInBlcmNlbnRcIikge1xyXG4gICAgICB0aGlzLm5neFNsaWRlck9iai50cmFuc2xhdGUgPSB0aGlzLnBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2xhdGVGdW5jID09PSBcImN1cnJlbmN5XCIpIHtcclxuICAgICAgdGhpcy5uZ3hTbGlkZXJPYmoudHJhbnNsYXRlID0gdGhpcy5jdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubmd4U2xpZGVyT2JqO1xyXG4gIH1cclxuXHJcbiAgc2V0T3B0aW9uVmFsdWVzKG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZsb29yOiBtaW5WYWx1ZSxcclxuICAgICAgY2VpbDogbWF4VmFsdWUsXHJcbiAgICAgIGRpc2FibGVkOiB0cnVlLFxyXG4gICAgICB0cmFuc2xhdGU6IHRoaXMubm9ybWFsVHJhbnNsYXRlRnVuY3Rpb25cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwZXJjZW50VHJhbnNsYXRlRnVuY3Rpb24gPSAoZGF0YTogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IHZhbCA9IGRhdGEudG9GaXhlZCgxKSArIFwiJVwiO1xyXG4gICAgcmV0dXJuIHZhbDtcclxuICB9O1xyXG5cclxuICBjdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICBpZiAoZGF0YSA+PSAxMDAwKSB7XHJcbiAgICAgIGNvbnN0IHZhbCA9IChkYXRhIC8gMTAwMCkudG9GaXhlZCgxKSArIFwia1wiO1xyXG4gICAgICByZXR1cm4gXCIkXCIgKyB2YWw7XHJcbiAgICB9IGVsc2UgaWYgKGRhdGEgIT0gTWF0aC5mbG9vcihkYXRhKSkge1xyXG4gICAgICByZXR1cm4gZGF0YS50b0ZpeGVkKDEpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCIkXCIgKyBkYXRhO1xyXG4gIH07XHJcblxyXG4gIG5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICBpZiAoZGF0YSA+PSAxMDAwKSB7XHJcbiAgICAgIGNvbnN0IHZhbCA9IChkYXRhIC8gMTAwMCkudG9GaXhlZCgxKSArIFwia1wiO1xyXG4gICAgICByZXR1cm4gdmFsO1xyXG4gICAgfSBlbHNlIGlmIChkYXRhICE9IE1hdGguZmxvb3IoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuIGRhdGEudG9GaXhlZCgxKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcclxuICB9O1xyXG5cclxuICBwb3B1bGF0ZVRvb2x0aXAoc2VsZWN0ZWRDb2x1bW5OYW1lOiBzdHJpbmcsIGNvbXBsZXRlRGF0YTogYW55W10sIGZpbHRlcmVkRGF0YTogYW55W10pIHtcclxuICAgIGxldCB0b29sdGlwRGF0YTtcclxuXHJcbiAgICBpZiAodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0b29sdGlwRGF0YSA9IHRoaXMucG9wdWxhdGVUb29sdGlwRGF0YUJhc2VkT25TZWxlY3RlZFJhZGlvKFtzZWxlY3RlZENvbHVtbk5hbWVdLCBjb21wbGV0ZURhdGEpO1xyXG4gICAgICB0b29sdGlwRGF0YS5mb3JFYWNoKChpdGVtOiB7IGlzSGlkZGVuOiBib29sZWFuIH0pID0+IChpdGVtLmlzSGlkZGVuID0gZmFsc2UpKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb2x1bW5OYW1lID09PSB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXlbdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5Lmxlbmd0aCAtIDFdKSB7XHJcbiAgICAgIGxldCBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgc2VsZWN0ZWRDb2x1bW5OYW1lKTsgLy9maWx0ZXIgdGhlIGRhdGEgd2l0aG91dCBhcHBseWluZyB0aGUgbGF0ZXN0IGZpbHRlclxyXG4gICAgICB0b29sdGlwRGF0YSA9IHRoaXMuc2hvd0hpZGVGaWx0ZXJDaGVja2JveChzdWJzZXREYXRhLCBzZWxlY3RlZENvbHVtbk5hbWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9pZiBpdCBpcyBub3QgdGhlIGxhdGVzdCBmaWx0ZXJcclxuICAgICAgLy90aGVuIGZpbHRlcmVkIERhdGEgd2lsbCBiZSB1c2VkXHJcbiAgICAgIC8vY3JlYXRlIHRoZSBvcHRpb24gZGF0YVxyXG4gICAgICBpZiAoIXRoaXMudG9vbHRpcE1hcC5oYXMoc2VsZWN0ZWRDb2x1bW5OYW1lKSkge1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVUb29sdGlwRGF0YUJhc2VkT25TZWxlY3RlZFJhZGlvKFtzZWxlY3RlZENvbHVtbk5hbWVdLCBjb21wbGV0ZURhdGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0b29sdGlwRGF0YSA9IHRoaXMuc2hvd0hpZGVGaWx0ZXJDaGVja2JveChmaWx0ZXJlZERhdGEsIHNlbGVjdGVkQ29sdW1uTmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG9vbHRpcERhdGE7XHJcbiAgfVxyXG5cclxuICBwb3B1bGF0ZVRvb2x0aXBEYXRhQmFzZWRPblNlbGVjdGVkUmFkaW8odmFsdWU6IHN0cmluZ1tdLCBvcmlnaW5hbERhdGE6IGFueSkge1xyXG4gICAgLy9pZiB0aGUgaW5pdGlhbCB0b29sdGlwIGRhdGEgaXMgYWxyZWFkeSBwcmVzZW50IGZldGNoIGZyb20gdGhlIG1hcFxyXG4gICAgaWYgKHRoaXMudG9vbHRpcE1hcC5oYXModmFsdWVbMF0pKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRvb2x0aXBNYXAuZ2V0KHZhbHVlWzBdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vZ2V0IHRoZSB1bmlxdWUgdmFsdWVzIGZyb20gdGhlIGNvbHVtbiBhbmQgc2F2ZSBpdCBpbiB0aGUgbWFwXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9IHZhbHVlWzBdO1xyXG4gICAgICBjb25zdCBkYXRhID0gc29ydEJ5KG9yaWdpbmFsRGF0YS5tYXAoKHU6IGFueSkgPT4gdVt0aGlzLnNlbGVjdGVkUmFkaW9dKSkuZmlsdGVyKChuOmFueSkgPT4gbiAhPT0gbnVsbCk7IC8vc29ydGluZyB0aGUgZGF0YSBpbiBhbHBoYWJldGljYWwgb3JkZXJcclxuICAgICAgY29uc3QgZGF0YVNldCA9IG5ldyBTZXQoZGF0YSk7IC8vY3JlYXRlZCBhIHNldCBmcm9tIHRoZSBkYXRhXHJcbiAgICAgIGNvbnN0IHRvb2xUaXBkYXRhID0gWy4uLmRhdGFTZXRdLm1hcCgoeDogc3RyaW5nKSA9PiBuZXcgdG9vbHRpcE1vZGVsRm9yQ29sdW1uTGV2ZWxGaWx0ZXJpbmcoeCkpO1xyXG4gICAgICB0aGlzLnRvb2x0aXBNYXAuc2V0KHZhbHVlWzBdLCB0b29sVGlwZGF0YSk7IC8vc2V0dGluZyB0aGUga2V5IHZhbHVlIHBhaXIgaW4gdGhlIHRvb2x0aXBNYXBcclxuICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuc2V0KHZhbHVlWzBdLCBtYXAodG9vbFRpcGRhdGEsIFwiZGF0YVwiKSk7IC8vc2V0dGluZyB0aGUga2V5IHZhbHVlIHBhaXIgaW4gdG9vbHRpcFNlbGVjdGVkTWFwXHJcbiAgICAgIHJldHVybiB0b29sVGlwZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dIaWRlRmlsdGVyQ2hlY2tib3goYXJyOiBhbnlbXSwgc2VsZWN0ZWRDb2x1bW5OYW1lOiBzdHJpbmcpIHtcclxuICAgIGxldCBjdXJyZW50U3Vic2V0RGF0YSA9IHVuaXEoYXJyLm1hcCgodSkgPT4gdVtzZWxlY3RlZENvbHVtbk5hbWVdKSk7XHJcblxyXG4gICAgLy9nZXQgdGhlIGluaXRpYWwgdG9vbHRpcCBEYXRhXHJcbiAgICBsZXQgdG9vbHRpcERhdGEgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHNlbGVjdGVkQ29sdW1uTmFtZSk7XHJcblxyXG4gICAgLy9zaG93IG9yIGhpZGUgdGhlIHZhbHVlXHJcbiAgICB0b29sdGlwRGF0YS5mb3JFYWNoKCh2YWx1ZTogeyBkYXRhOiBzdHJpbmcgfCBudW1iZXI7IGlzSGlkZGVuOiBib29sZWFuOyB9KSA9PiB7XHJcbiAgICAgIC8vaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgdGhlbiBoaWRlIHRoZSBlbGVtZW50XHJcbiAgICAgIGxldCBlbGVtZW50VG9GaW5kSW5kZXggPSBjdXJyZW50U3Vic2V0RGF0YS5maW5kSW5kZXgoKG46IHN0cmluZyB8IG51bWJlcikgPT4gbiA9PT0gdmFsdWUuZGF0YSk7XHJcbiAgICAgIGlmIChlbGVtZW50VG9GaW5kSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdmFsdWUuaXNIaWRkZW4gPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vc2hvdyB0aGUgZWxlbWVudFxyXG4gICAgICAgIHZhbHVlLmlzSGlkZGVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0b29sdGlwRGF0YTtcclxuICB9XHJcblxyXG4gIGlzQWxsT3B0aW9uc1NlbGVjdGVkKCkge1xyXG4gICAgbGV0IGFsbFNlbGVjdGVkO1xyXG4gICAgbGV0IHRvdGFsT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbikubGVuZ3RoO1xyXG4gICAgbGV0IHNlbGVjdGVkT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbiAmJiB4LmlzU2VsZWN0ZWQpLmxlbmd0aDtcclxuICAgIGlmIChzZWxlY3RlZE9wdGlvbnNDb3VudCA9PT0gMCkge1xyXG4gICAgICBhbGxTZWxlY3RlZCA9IEFsbFNlbGVjdGVkU3RhdHVzLm5vbmU7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkT3B0aW9uc0NvdW50ID4gMCAmJiBzZWxlY3RlZE9wdGlvbnNDb3VudCA8IHRvdGFsT3B0aW9uc0NvdW50KSB7XHJcbiAgICAgIGFsbFNlbGVjdGVkID0gQWxsU2VsZWN0ZWRTdGF0dXMuZmV3U2VsZWN0ZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbGxTZWxlY3RlZCA9IEFsbFNlbGVjdGVkU3RhdHVzLmFsbFNlbGVjdGVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFsbFNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgcG9wdWxhdGVEYXRlUGlja2VyVG9vbHRpcFdpdGhEYXRhKGNvbXBsZXRlRGF0YTogYW55W10sIGZpbHRlcmVkRGF0YTogYW55W10pIHtcclxuICAgIGxldCBlbmFibGVkRGF0ZXM7XHJcbiAgICAvL3NvbWUgZmlsdGVyIGlzIGFwcGxpZWQgYW5kIHRoZSBsYXRlc3QgZmlsdGVyIGlzIHRoZSBkYXRlIGZpbHRlclxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXlbdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5Lmxlbmd0aCAtIDFdID09PSB0aGlzLnNlbGVjdGVkUmFkaW9cclxuICAgICkge1xyXG4gICAgICBsZXQgc3Vic2V0RGF0YTtcclxuICAgICAgLy9hcHBseWluZyBhbGwgZmlsdGVyZXhjZXB0IHRoZWMgY3VycmVudCAgZmlsdGVyXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgICBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgXCJwZXJpb2RcIik7XHJcbiAgICAgICAgbGV0IG1pblN0YXJ0RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICBsZXQgbWF4RW5kRGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCBcImVuZERhdGVcIik7XHJcbiAgICAgICAgZW5hYmxlZERhdGVzID0geyBtaW5TdGFydERhdGU6IG1pblN0YXJ0RGF0ZVswXSwgbWF4RW5kRGF0ZTogbWF4RW5kRGF0ZVsxXSB9O1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJBaXJEYXRlXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodEVuZERhdGVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJkYXRlXCIpIHtcclxuICAgICAgICBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICBsZXQgbWluQW5kTWF4RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIGVuYWJsZWREYXRlcyA9IHsgbWluU3RhcnREYXRlOiBtaW5BbmRNYXhEYXRlWzBdLCBtYXhFbmREYXRlOiBtaW5BbmRNYXhEYXRlWzFdIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3Vic2V0RGF0YSA9IHRoaXMuZmlsdGVyRGF0YShjb21wbGV0ZURhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgLy9uZWVkIHRvIGZpbmQgbWluIGFuZCBtYXggZGF0ZSBmb3Igc3RhcnQgYW5kIGVuZCBkYXRlXHJcbiAgICAgICAgLy9lbmFibGVkRGF0ZXMgaXMgYW4gYXJyIG9mIG1pbkRhdGUgYW5kIG1heERhdGVcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoc3Vic2V0RGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJwZXJpb2RcIikge1xyXG4gICAgICAgIGxldCBtaW5TdGFydERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoZmlsdGVyZWREYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICBsZXQgbWF4RW5kRGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShmaWx0ZXJlZERhdGEsIFwiZW5kRGF0ZVwiKTtcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB7IG1pblN0YXJ0RGF0ZTogbWluU3RhcnREYXRlWzBdLCBtYXhFbmREYXRlOiBtYXhFbmREYXRlWzFdIH07XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIkFpckRhdGVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImRhdGVcIikge1xyXG4gICAgICAgIGxldCBtaW5BbmRNYXhEYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKGZpbHRlcmVkRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB7IG1pblN0YXJ0RGF0ZTogbWluQW5kTWF4RGF0ZVswXSwgbWF4RW5kRGF0ZTogbWluQW5kTWF4RGF0ZVsxXSB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vbmVlZCB0byBmaW5kIG1pbiBhbmQgbWF4IGRhdGUgZm9yIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cclxuICAgICAgICAvLyBlbmFibGVkRGF0ZXMgaXMgYW4gYXJyIG9mIG1pbkRhdGUgYW5kIG1heERhdGVcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW5hYmxlZERhdGVzO1xyXG4gIH1cclxuXHJcbiAgZmluZFVuaXF1ZURhdGVzV2l0aERhdGEoZGF0YTogYW55W10pIHtcclxuICAgIGxldCB1bmlxdWVEYXRlcyA9IHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbXCJkYXRlXCJdKSk7XHJcbiAgICBsZXQgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ6IE5nYkRhdGVUeXBlW10gPSBbXTtcclxuICAgIHVuaXF1ZURhdGVzLmZvckVhY2goKGRhdGU6IGFueSkgPT4ge1xyXG4gICAgICB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdC5wdXNoKFxyXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGVTdGFuZGFyZEZvcm1hdChtb21lbnQoZGF0ZSwgXCJNTS9ERC9ZWVwiKS5mb3JtYXQoXCJNTS9ERC9ZWVlZXCIpKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ7XHJcbiAgfVxyXG5cclxuICBpc0NoZWNrYm94U2VsZWN0ZWQoc2VsZWN0ZWREYXRhOiBhbnkpIHtcclxuICAgIHNlbGVjdGVkRGF0YS5pc1NlbGVjdGVkID0gIXNlbGVjdGVkRGF0YS5pc1NlbGVjdGVkO1xyXG4gICAgbGV0IGFsbFNlbGVjdGVkID0gdGhpcy5pc0FsbE9wdGlvbnNTZWxlY3RlZCgpO1xyXG4gICAgcmV0dXJuIGFsbFNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgYWxsT3B0aW9uc0NsaWNrZWQoc3RhdHVzOiBudW1iZXIpIHtcclxuICAgIGxldCBoZWFkZXIgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICBpZiAoc3RhdHVzID09PSAxKSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcE1hcC5nZXQoaGVhZGVyKS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWl0ZW0uaXNIaWRkZW4pIHtcclxuICAgICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuc2V0KFxyXG4gICAgICAgIGhlYWRlcixcclxuICAgICAgICB0aGlzLnRvb2x0aXBNYXBcclxuICAgICAgICAgIC5nZXQoaGVhZGVyKVxyXG4gICAgICAgICAgLmZpbHRlcigoeDogYW55KSA9PiB4LmlzU2VsZWN0ZWQpXHJcbiAgICAgICAgICAubWFwKCh4OiBhbnkpID0+IHguZGF0YSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcE1hcC5nZXQoaGVhZGVyKS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWl0ZW0uaXNIaWRkZW4pIHtcclxuICAgICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZShoZWFkZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVPcmRlckFwcGxpZWRGaWx0ZXJzQXJyYXkoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZDogYm9vbGVhbiwgZGF0ZT86IGFueSkge1xyXG4gICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgaXNGaWx0ZXJlZCA9IHRoaXMuY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQsIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQsIGRhdGUpO1xyXG4gICAgdGhpcy5yZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQ6IGJvb2xlYW4sIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJ1c2VyXCIgJiYgIXRoaXMudG9vbHRpcE1hcC5oYXMoXCJ1c2VyXCIpKSB7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSBjbG9uZURlZXAoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkVuZFRpbWVGb3JGaWx0ZXJcIlxyXG4gICAgICB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydF90aW1lX2Zvcl9maWx0ZXJcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwic3RhcnRFbmRUaW1lTXVsdGlcIikge1xyXG4gICAgICBpc0ZpbHRlcmVkID0gIWlzRXF1YWwoXHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbylcclxuICAgICAgKSB8fCAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHwgIXRoaXMuaW5jbHVkZU11bHRpVGltZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0RW5kVGltZVwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9ICFpc0VxdWFsKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSkgfHwgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8ICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNsaWRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICBpc0ZpbHRlcmVkID0gIWlzRXF1YWwodGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5zbGlkZXJEYXRhKTtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInBvc3RlZEFkdVwiICYmIHRoaXMuc3ViUmFkaW9CdXR0b24gPT0gXCJub3RSZXF1aXJlZFwiKSB7XHJcbiAgICAgICAgaXNGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc0ZpbHRlcmVkICYmIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImVuZERhdGVcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJwZXJpb2RcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJBaXJEYXRlXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJmbGlnaHRFbmREYXRlXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiZGF0ZVwiXHJcbiAgICApIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9XHJcbiAgICAgICAgIWlzRXF1YWwodGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pKSAmJlxyXG4gICAgICAgICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLmZsaWdodERhdGVSYW5nZSk7XHJcbiAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdG90YWxPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuKS5sZW5ndGg7XHJcbiAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnNDb3VudCA9IHRoaXMudG9vbHRpcE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKS5maWx0ZXIoKHg6IGFueSkgPT4gIXguaXNIaWRkZW4gJiYgeC5pc1NlbGVjdGVkKS5sZW5ndGg7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSBzZWxlY3RlZE9wdGlvbnNDb3VudCA+IDAgJiYgc2VsZWN0ZWRPcHRpb25zQ291bnQgIT0gdG90YWxPcHRpb25zQ291bnQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICB9XHJcblxyXG4gIHJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZDogYm9vbGVhbikge1xyXG4gICAgbGV0IHNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICBpZiAoaXNGaWx0ZXJlZCAmJiAhc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgIH0gZWxzZSBpZiAoaXNGaWx0ZXJlZCAmJiBzZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgc2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICBzZXQuYWRkKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkgPSBbLi4uc2V0XTtcclxuICB9XHJcblxyXG4gIGZpbHRlckRhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSwga2V5VG9Ta2lwOiBzdHJpbmcpIHtcclxuICAgIGxldCBmaWx0ZXJlZERhdGEgPSBbLi4ub3JpZ2luYWxEYXRhXTtcclxuXHJcbiAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgIGlmIChrZXkgIT0ga2V5VG9Ta2lwKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IG9ialtrZXldID49IHZhbHVlLm1pbiAmJiBvYmpba2V5XSA8PSB2YWx1ZS5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwic3RhcnREYXRlXCIgfHwga2V5ID09PSBcImVuZERhdGVcIiB8fCBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IGtleSA9PSBcImRhdGVcIikge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmlzT2JqZWN0SW5UaGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwZXJpb2RcIiApIHtcclxuICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5nZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fCBrZXkgPT09IFwiRW5kVGltZUZvckZpbHRlclwiXHJcbiAgICAgICAgICB8fCBrZXkgPT09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHwga2V5ID09PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIikge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJzdGFydEVuZFRpbWVNdWx0aVwiIHx8IGtleSA9PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PiB2YWx1ZS5pbmNsdWRlcyh1W2tleV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcclxuICB9XHJcblxyXG4gIHJldHVybk9yZGVyc0luVGhlUmFuZ2Uob3JkZXI6IGFueSwgcmFuZ2U6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGxldCBpc0RhdGVCZXR3ZWVuVGhlU2VsZWN0ZWRSYW5nZSA9IG1vbWVudChvcmRlcltrZXldKS5pc0JldHdlZW4ocmFuZ2UubWluU2VsZWN0ZWREYXRlLCByYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgbGV0IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSA9IG1vbWVudChvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWluU2VsZWN0ZWREYXRlKTtcclxuICAgIGxldCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGUgPSBtb21lbnQob3JkZXJba2V5XSkuaXNTYW1lKHJhbmdlLm1heFNlbGVjdGVkRGF0ZSk7XHJcbiAgICByZXR1cm4gaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgfHwgaXNEYXRlU2FtZUFzVGhlTWluU2VsZWN0ZWREYXRlIHx8IGlzRGF0ZVNhbWVBc1RoZU1heFNlbGVjdGVkRGF0ZTtcclxuICB9XHJcblxyXG4gIHJldHVybkRhdGFGb3JUaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55KSB7XHJcbiAgICBsZXQgZm9ybWF0ID0gXCJISDptbTpzc1wiO1xyXG4gICAgbGV0IHNlbGVjdGVkU3RhcnREYXRlID0gbW9tZW50KHNlbGVjdGVkRGF0YS5zdGFydFRpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRFbmREYXRlID0gbW9tZW50KHNlbGVjdGVkRGF0YS5lbmRUaW1lLCBmb3JtYXQpO1xyXG4gICAgbGV0IHN0YXJ0VGltZSA9IG1vbWVudChvYmouc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgbGV0IGVuZFRpbWUgPSBtb21lbnQob2JqLmVuZFRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkU3RhcnREYXRlKTtcclxuICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgIGxldCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGxldCBmb3JtYXQgPSBcIkhIOm1tOnNzXCI7XHJcbiAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZSA9IG1vbWVudChzZWxlY3RlZERhdGEuZnJvbVRpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRUb1RpbWUgPSBtb21lbnQoc2VsZWN0ZWREYXRhLnRvVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBvYmpUaW1lID0gb2JqW2tleV07XHJcbiAgICBcclxuICAgIGlmIChbXCJcIiwgXCItXCIsIG51bGxdLmluY2x1ZGVzKG9ialRpbWUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT0gXCIwXCIpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XSA9PSBcIjBcIikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gb2JqVGltZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmZvcm1hdFRvVHdlbHZlSHJzKG9ialRpbWUsIHRydWUpO1xyXG5cclxuICAgIC8vIG9ialRpbWUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgLy8gICBvYmpUaW1lWzBdICsgXCI6XCIgKyBvYmpUaW1lWzFdICsgXCIgXCIgKyBvYmpUaW1lWzJdLFxyXG4gICAgLy8gICB0cnVlXHJcbiAgICAvLyApO1xyXG4gICAgLy8gb2JqVGltZSA9IG9ialRpbWVbMF0gKyBcIjpcIiArIG9ialRpbWVbMV0gKyBcIjowMFwiO1xyXG5cclxuICAgIC8vIG9ialRpbWUgPSBtb21lbnQob2JqVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBtb21lbnRUaW1lID0gbW9tZW50KG9ialRpbWUsZm9ybWF0KTtcclxuICAgIGNvbnNvbGUubG9nKG1vbWVudFRpbWUpO1xyXG4gICAgY29uc29sZS5sb2coc2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICBjb25zb2xlLmxvZyhzZWxlY3RlZFRvVGltZSk7XHJcblxyXG4gICAgbGV0IGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgPSBtb21lbnRUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgIGxldCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSA9IG1vbWVudFRpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcclxuICAgIGxldCBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZSA9IG1vbWVudFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lIHx8XHJcbiAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkVG9UaW1lIHx8XHJcbiAgICAgIGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6YW55LCBrZXk6IHN0cmluZykge1xyXG4gICAgbGV0IGZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuICAgIGxldCBzZWxlY3RlZEZyb21UaW1lID0gbW9tZW50KHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IG1vbWVudChzZWxlY3RlZERhdGEudG9UaW1lLCBmb3JtYXQpO1xyXG4gICAgXHJcbiAgICBpZihzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XVswXSA9PSBcIjBcIikge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV1bMF0gPT0gXCIwXCIpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBsZXQgc3RhcnRUaW1lID0gbW9tZW50KG9ialtrZXldWzFdLCBmb3JtYXQpO1xyXG4gICAgbGV0IGVuZFRpbWUgPSBtb21lbnQob2JqW2tleV1bMl0sIGZvcm1hdCk7XHJcblxyXG4gICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgbGV0IGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gc3RhcnRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcbiAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgbGV0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKSB8fFxyXG4gICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKVxyXG4gICAgKTtcclxuXHJcbn1cclxuXHJcbiAgZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iajogYW55LCB2YWx1ZTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgbGV0IHBhcnNpbmdGb3JtYXQ6IHN0cmluZztcclxuICAgIGlmIChrZXkgPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgcGFyc2luZ0Zvcm1hdCA9IFwiWVlZWS1NTS1ERFwiO1xyXG4gICAgICBcclxuICAgICAgbGV0IG1vbWVudFN0YXJ0RGF0ZSA9IG1vbWVudChvYmouc3RhcnREYXRlKTtcclxuICAgICAgbGV0IG1vbWVudEVuZERhdGUgPSBtb21lbnQob2JqLmVuZERhdGUpO1xyXG4gICAgICBcclxuICAgICAgbGV0IHN0YXJ0RGF0ZUlzQmV0d2VlblNlbERhdGUgPSBtb21lbnRTdGFydERhdGUuaXNCZXR3ZWVuKFxyXG4gICAgICAgIHZhbHVlLmZyb21EYXRlLFxyXG4gICAgICAgIHZhbHVlLnRvRGF0ZVxyXG4gICAgICApO1xyXG4gICAgICBsZXQgZW5kRGF0ZUlzQmV0d2VlblNlbERhdGUgPSBtb21lbnRFbmREYXRlLmlzQmV0d2VlbihcclxuICAgICAgICB2YWx1ZS5mcm9tRGF0ZSxcclxuICAgICAgICB2YWx1ZS50b0RhdGVcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIFxyXG4gICAgICBjb25zb2xlLmxvZyhtb21lbnQob2JqLnN0YXJ0RGF0ZSwgcGFyc2luZ0Zvcm1hdCkpO1xyXG4gICAgICBsZXQgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUobW9tZW50U3RhcnREYXRlKTtcclxuICAgICAgbGV0IGVuZERhdGVJc1NhbWVBc1NlbEVuZERhdGUgPSB2YWx1ZS50b0RhdGUuaXNTYW1lKG1vbWVudEVuZERhdGUpO1xyXG5cclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICAoc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSkgJiZcclxuICAgICAgICAoZW5kRGF0ZUlzQmV0d2VlblNlbERhdGUgfHwgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIkFpckRhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHwga2V5ID09PSBcImZsaWdodEVuZERhdGVcIikge1xyXG4gICAgICBwYXJzaW5nRm9ybWF0ID0gXCJNTS9ERC9ZWVlZXCI7XHJcbiAgICAgIGxldCBkYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IG1vbWVudChvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNCZXR3ZWVuKHZhbHVlLm1pblNlbGVjdGVkRGF0ZSwgdmFsdWUubWF4U2VsZWN0ZWREYXRlKTtcclxuXHJcbiAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSBtb21lbnQob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICBsZXQgZGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IG1vbWVudChvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNTYW1lKHZhbHVlLm1heFNlbGVjdGVkRGF0ZSk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0ZUlzQmV0d2VlblNlbERhdGUgfHwgZGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlIHx8IGRhdGVJc1NhbWVBc1NlbEVuZERhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGluaXRpYWxpemVUaW1lRmlsdGVyRGF0YShjbG9uZWREYXRhOiBhbnlbXSwga2V5ID0gXCJzdGFydEVuZFRpbWVcIikge1xyXG4gICAgbGV0IHN0YXJ0VGltZUFyciA9IG1hcChjbG9uZWREYXRhLCBcInN0YXJ0VGltZVwiKTtcclxuICAgIGxldCBlbmRUaW1lQXJyID0gbWFwKGNsb25lZERhdGEsIFwiZW5kVGltZVwiKTtcclxuICBcclxuICAgIHN0YXJ0VGltZUFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBlbmRUaW1lQXJyLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBsZXQgaW5pdGlhbFN0YXJ0RW5kVGltZSA9IHtcclxuICAgICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZUFyclswXSxcclxuICAgICAgICBlbmRUaW1lOiBlbmRUaW1lQXJyWzBdLFxyXG4gICAgfTtcclxuICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIGluaXRpYWxTdGFydEVuZFRpbWUpO1xyXG4gIH0gXHJcblxyXG4gIHJldHVybkNvbHVtbkZpbHRlclN0YXR1cyhkYXRhOiBhbnlbXSwgaGVhZGVyTmFtZTogc3RyaW5nIHwgbnVtYmVyKSB7XHJcblxyXG4gICAgaWYoaGVhZGVyTmFtZSA9PSBcInN0YXJ0RW5kVGltZVwiKXtcclxuICAgICAgbGV0IHRpbWUgPSBkYXRhLm1hcCh1ID0+IHVbaGVhZGVyTmFtZV1bMF0pO1xyXG4gICAgICBsZXQgdW5pcVRpbWUgPSB1bmlxKHRpbWUpO1xyXG4gICAgICByZXR1cm4gdW5pcVRpbWUubGVuZ3RoID09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbaGVhZGVyTmFtZV0pKS5sZW5ndGggPiAxID8gZmFsc2UgOiB0cnVlO1xyXG4gIH1cclxuICBcclxuICBnZXRGaWx0ZXJPcHRpb25zRGF0YShkYXRhOiBhbnlbXSwgY2xvbmVkRGF0YTogYW55W10pe1xyXG4gICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICBjb25zb2xlLmxvZyhcImFwcGxpZWRGaWx0ZXJTZXRcIik7XHJcbiAgICBjb25zb2xlLmxvZyhhcHBsaWVkRmlsdGVyU2V0KTtcclxuICAgIGlmKGFwcGxpZWRGaWx0ZXJTZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpe1xyXG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJEYXRhKGNsb25lZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlT3JkZXJBcHBsaWVkRmlsdGVyc1N0YXRlKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KXtcclxuICAgIGxldCBpc0ZpbHRlcmVkID0gdHJ1ZTtcclxuICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZGaWx0ZXJJc0FwcGxpZWQoY2xvbmVkRGF0YSx2YWx1ZSk7XHJcbiAgICB0aGlzLnJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZCk7XHJcbiAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICB9XHJcblxyXG4gIGNoZWNrSWZGaWx0ZXJJc0FwcGxpZWQoY2xvbmVkRGF0YTogYW55W10sdmFsdWU6IGFueSl7XHJcbiAgICBsZXQgaW5pdGlhbFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkoY2xvbmVkRGF0YS5tYXAoaXRlbSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKTtcclxuICAgIGxldCBjdXJyZW50VmFsdWVPZkNvbHVtbiA9IHNvcnRCeSh0aGlzLmFwcGx5RmlsdGVyKGNsb25lZERhdGEsdmFsdWUpLm1hcChpdGVtID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpO1xyXG4gICAgcmV0dXJuICFpc0VxdWFsKGluaXRpYWxWYWx1ZU9mQ29sdW1uLCBjdXJyZW50VmFsdWVPZkNvbHVtbik7XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcihkYXRhOiBhbnlbXSx2YWx1ZTogYW55KXtcclxuICAgIGxldCBmaWx0ZXJlZERhdGEgPSBkYXRhO1xyXG4gICAgbGV0IGtleSA9IHRoaXMuc2VsZWN0ZWRSYWRpbztcclxuICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChrZXkgPT09IFwic3RhcnREYXRlXCIgfHwga2V5ID09PSBcImVuZERhdGVcIiB8fCBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IGtleSA9PSBcImRhdGVcIikge1xyXG4gICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5pc09iamVjdEluVGhlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInBlcmlvZFwiICkge1xyXG4gICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5nZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoa2V5ID09PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8IGtleSA9PT0gXCJFbmRUaW1lRm9yRmlsdGVyXCJcclxuICAgICAgICB8fCBrZXkgPT09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHwga2V5ID09PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIikge1xyXG4gICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJzdGFydEVuZFRpbWVNdWx0aVwiIHx8IGtleSA9PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigodSkgPT4gdmFsdWUuaW5jbHVkZXModVtrZXldKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTsgIFxyXG4gIH1cclxuXHJcbiAgaXNPYmplY3RJblRoZVJhbmdlKG9iajogYW55LCB2YWx1ZToge2Zyb21EYXRlOiBtb21lbnQuTW9tZW50LCB0b0RhdGU6IG1vbWVudC5Nb21lbnR9LGtleTpzdHJpbmcpe1xyXG4gICAgbGV0IG9ialZhbCA9IG9ialtrZXldO1xyXG4gICAgbGV0IG1vbWVudERhdGUgPSBtb21lbnQob2JqVmFsKTtcclxuICAgIGNvbnNvbGUubG9nKG9ialZhbCk7XHJcbiAgICBjb25zb2xlLmxvZyh2YWx1ZS5mcm9tRGF0ZSk7XHJcbiAgICBsZXQgaXNEYXRlU2FtZUFzU3RhcnRPZlRoZVJhbmdlID0gdmFsdWUuZnJvbURhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICBsZXQgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUob2JqVmFsKTtcclxuICAgIGxldCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlID0gbW9tZW50RGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsdmFsdWUudG9EYXRlKTtcclxuICAgIHJldHVybiBpc0RhdGVTYW1lQXNTdGFydE9mVGhlUmFuZ2UgfHwgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSB8fCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlO1xyXG4gIH1cclxuICAgIFxyXG59XHJcbiJdfQ==
492
+ }], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }, { type: i2.AnnaSortService }]; } });
493
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxNQUFNLE1BQU0scUJBQXFCLENBQUM7QUFDekMsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFZLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRW5FLGtDQUFrQztBQUNsQyxPQUFPLEVBQUUseUJBQXlCLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFLdEQsTUFBTSxPQUFPLGlCQUFpQjtJQXlDNUIsWUFBb0IscUJBQWdELEVBQVUsZUFBZ0M7UUFBMUYsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUEyQjtRQUFVLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQXZDOUcsZUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkIsdUJBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQWMvQix3QkFBbUIsR0FBYSxFQUFFLENBQUM7UUFJbkMsc0JBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDMUIsUUFBUTtZQUNSLEtBQUs7WUFDTCxLQUFLO1lBQ0wsWUFBWTtZQUNaLFdBQVc7WUFDWCxX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a0IsQ0FBQyxHQUFHLENBQUMsR0FBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQzthQUN2RTtRQUNILENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQUVELHVCQUF1QixDQUFDLE9BQThCO1FBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQzs7QUFqaEJhLDRCQUFVLEdBQUcsRUFBRSxDQUFDOzhHQXJDbkIsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FGaEIsTUFBTTsyRkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXItc2xpZGVyL25neC1zbGlkZXInO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIFRoaXJkIHBhcnR5IGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IG1pbiwgbWF4LCBtYXAsIHNvcnRCeSwgdW5pcSwgY2xvbmVEZWVwLCBpc0VxdWFsIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgZGF5anMgZnJvbSBcImRheWpzXCI7XHJcbmltcG9ydCBtaW5NYXggZnJvbSBcImRheWpzL3BsdWdpbi9taW5NYXhcIjtcclxuaW1wb3J0IGlzQmV0d2VlbiBmcm9tIFwiZGF5anMvcGx1Z2luL2lzQmV0d2VlblwiO1xyXG5pbXBvcnQgeyBTb3J0VHlwZSwgU29ydFR5cGVFbnVtIH0gZnJvbSAnLi4vbW9kZWxzL2FubmEtc29ydC5tb2RlbCc7XHJcblxyXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHMgXHJcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsIE5nYkRhdGVUeXBlIH0gZnJvbSAnLi9hbm5hLWRhdGUtdGltZS1mb3JtYXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEFubmFTb3J0U2VydmljZSB9IGZyb20gJy4vYW5uYS1zb3J0LnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5uYUZpbHRlclNlcnZpY2Uge1xyXG5cclxuICB0b29sdGlwTWFwID0gbmV3IE1hcCgpO1xyXG4gIHRvb2x0aXBTZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTtcclxuICBpbml0aWFsVmFsdWVNYXA6IE1hcDxzdHJpbmcsIGFueT47XHJcbiAgdHJhbnNsYXRlRnVuYzogc3RyaW5nO1xyXG4gIHNlbGVjdGVkUmFkaW86IHN0cmluZztcclxuICBzdWJSYWRpb0J1dHRvbjogc3RyaW5nO1xyXG5cclxuICBjYWxlbmRhclNldDogU2V0PHN0cmluZz47XHJcbiAgc2xpZGVyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICB0aW1lU2V0OiBTZXQ8c3RyaW5nPjtcclxuXHJcbiAgaW5jbHVkZU11bHRpVGltZTogYm9vbGVhbjtcclxuICBpbmNsdWRlWmVyb1RpbWU6IGJvb2xlYW47XHJcbiAgaW5jbHVkZVRpbWVSYW5nZTogYm9vbGVhbjtcclxuXHJcbiAgYXBwbGllZEZpbHRlcnNBcnJheTogc3RyaW5nW10gPSBbXTtcclxuICBmbGlnaHREYXRlUmFuZ2U6IHsgbWluU2VsZWN0ZWREYXRlOiBhbnksIG1heFNlbGVjdGVkRGF0ZTogYW55IH07XHJcbiAgc2xpZGVyRGF0YTogeyBtaW46IGFueSwgbWF4OiBhbnkgfTtcclxuICBuZ3hTbGlkZXJPYmo6IE9wdGlvbnM7XHJcbiAgc2xpZGVyQ3VycmVuY3lTZXQgPSBuZXcgU2V0KFtcclxuICAgICdib29rZWQnLFxyXG4gICAgJ2NwcCcsXHJcbiAgICAnY3BtJyxcclxuICAgICdyY3ZQcmVlbXB0JyxcclxuICAgICdvc1ByZWVtcHQnLFxyXG4gICAgJ3Bvc3RlZEFkdScsXHJcbiAgICAnc2NoZWR1bGVkQWR1JyxcclxuICAgICdhdWRpZW5jZURlZmljaXQnLFxyXG4gICAgJ1JhdGUnLFxyXG4gICAgJ3VzZXJBRFVzJyxcclxuICAgICdidXllckNoYW5nZXMnLFxyXG4gICAgJ3VzZXJDaGFuZ2VzJyxcclxuICAgICd1c2VyTUcnLFxyXG4gIF0pO1xyXG5cclxuICBwdWJsaWMgc3RhdGljIGJ1ZmZlclNpemUgPSAyMDtcclxuICBpc0ZpbHRlclNvcnRBY3RpdmU6IGFueSA9IHt9O1xyXG4gIHJlc2V0RmlsdGVyU29ydEFjdGl2ZVN0YXR1czogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlOiBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLCBwcml2YXRlIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlKSB7XHJcbiAgICBkYXlqcy5leHRlbmQobWluTWF4KTtcclxuICAgIGRheWpzLmV4dGVuZChpc0JldHdlZW4pO1xyXG4gICAgY29uc3Qgc2xpZGVyQXJyID0gW1xyXG4gICAgICBcInJjdlByZWVtcHRcIixcclxuICAgICAgXCJvc1ByZWVtcHRcIixcclxuICAgICAgXCJyY3ZVbmRlckRseVwiLFxyXG4gICAgICBcInBvc3RlZEF1ZFBlcmNlbnRcIixcclxuICAgICAgXCJib29rZWRcIixcclxuICAgICAgXCJzcG90c1wiLFxyXG4gICAgICBcImdycFwiLFxyXG4gICAgICBcImNwcFwiLFxyXG4gICAgICBcImltcHNcIixcclxuICAgICAgXCJjcG1cIixcclxuICAgICAgXCJvc1VuZGVyRGx5XCIsXHJcbiAgICAgIFwidG90YWxXZWVrc1wiLFxyXG4gICAgICBcIldlZWtOdW1iZXJcIixcclxuICAgICAgXCJSYXRlXCIsXHJcbiAgICAgIFwiT3JkZXJlZFJhdGluZ3NPckltcHJlc3Npb25zXCIsXHJcbiAgICAgIFwiUG9zdGVkUmF0aW5nc09ySW1wcmVzc2lvbnNcIiwgLFxyXG4gICAgICBcInBvc3RlZEF1ZFBlcmNlbnRcIixcclxuICAgICAgXCJwb3N0ZWRBZHVcIixcclxuICAgICAgXCJzY2hlZHVsZWRBZHVcIixcclxuICAgICAgXCJhdWRpZW5jZURlZmljaXRcIixcclxuICAgICAgXCJvZmZlcmVkTUdzXCIsXHJcbiAgICAgIFwib3V0c3RhbmRpbmdQRVwiLFxyXG4gICAgICBcIm9mZmVyZWRBRFVzXCIsXHJcbiAgICAgIFwidWREZWZpY2l0VmFsdWVcIixcclxuICAgICAgXCJib29rZWRWYWx1ZVwiLFxyXG4gICAgICBcImJvb2tlZFNwb3RzXCIsXHJcbiAgICAgIFwidXNlckNoYW5nZXNcIixcclxuICAgICAgXCJVREdycFwiLFxyXG4gICAgICBcIlVESW1wc1wiLFxyXG4gICAgICBcIk9ER3JwXCIsXHJcbiAgICAgIFwiT0RJbXBzXCIsXHJcbiAgICAgIFwidWRJbXBzUGVyY2VudFwiLFxyXG4gICAgICBcInVkR3JwUGVyY2VudFwiLFxyXG4gICAgICBcIm9kSW1wc1BlcmNlbnRcIixcclxuICAgICAgXCJvZEdycFBlcmNlbnRcIixcclxuICAgICAgXCJ1c2VyQURVc1wiLFxyXG4gICAgICBcImJ1eWVyQ2hhbmdlc1wiLFxyXG4gICAgICBcInVzZXJDaGFuZ2VzXCIsXHJcbiAgICAgIFwidXNlck1HXCIsXHJcbiAgICAgIFwiV2Vla2x5QVVSXCIsXHJcbiAgICAgIFwiV2Vla2x5QVVSYXRpbmdPckltcHJlc3Npb25zXCIsXHJcbiAgICAgIFwiQXBwcm92ZWRNR3NWYWx1ZVwiLFxyXG4gICAgICBcIkFwcHJvdmVkQURVc1ZhbHVlXCIsXHJcbiAgICAgIFwiQnV5ZXJDaGFuZ2VzVmFsdWVcIixcclxuICAgICAgXCJVc2VyQ2hhbmdlc1ZhbHVlXCIsXHJcbiAgICAgIFwiQm9va2VkR1JQT3JJTVBTXCIsXHJcbiAgICAgIFwiQm9va2VkQ1BQT3JDUE1cIixcclxuICAgICAgXCJCb29rZWRWYWx1ZVwiLFxyXG4gICAgICBcIkJvb2tlZFNwb3RzXCIsXHJcbiAgICAgIFwiQm9va2VkUmF0ZVwiLFxyXG4gICAgICBcIkJvb2tlZFJUR1wiLFxyXG4gICAgICBcIkJvb2tlZElNUFNcIixcclxuICAgICAgXCJBVVJUR1wiLFxyXG4gICAgICBcIkFVUlRHXCIsXHJcbiAgICAgIFwiUG9zdGVkUmF0aW5nXCIsXHJcbiAgICAgIFwiUG9zdGVkSW1wcmVzc2lvbnNcIixcclxuICAgICAgXCJOb3JtYWxpemVkT3JkZXJlZFJhdGluZ1wiLFxyXG4gICAgICBcIk5vcm1hbGl6ZWRPcmRlcmVkSW1wcmVzc2lvbnNcIixcclxuICAgICAgXCJOb3JtYWxpemVkUG9zdGVkUmF0aW5nXCIsXHJcbiAgICAgIFwiTm9ybWFsaXplZFBvc3RlZEltcHJlc3Npb25zXCIsXHJcbiAgICAgIFwiQm9va2VkR1JQXCIsIFxyXG4gICAgICBcIkJvb2tlZElNUFNSZXZUYWJcIixcclxuICAgICAgXCJCb29rZWRDUFBcIixcclxuICAgICAgXCJCb29rZWRDUE1cIlxyXG4gICAgXTtcclxuICAgIGNvbnN0IGNhbGVuZGFyQXJyID0gW1wicGVyaW9kXCIsIFwiQWlyRGF0ZVwiLCBcImZsaWdodFN0YXJ0RGF0ZVwiLCBcImZsaWdodEVuZERhdGVcIixcImRhdGVcIiwgXCJzdGFydERhdGVcIiwgXCJlbmREYXRlXCIsIFwicmV2aXNpb25TdGFydERhdGVcIixcIkdlbmVyYXRlZE9uXCIsIFwiV2Vla1wiXTtcclxuICAgIGNvbnN0IHRpbWVBcnIgPSBbXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiwgXCJFbmRUaW1lRm9yRmlsdGVyXCIsIFwidGltZVwiLFxyXG4gICAgICBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiLCBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiwgXCJzdGFydEVuZFRpbWVNdWx0aVwiLCBcInN0YXJ0RW5kVGltZVwiXTtcclxuICAgIHRoaXMuc2xpZGVyU2V0ID0gbmV3IFNldChzbGlkZXJBcnIpO1xyXG4gICAgdGhpcy5jYWxlbmRhclNldCA9IG5ldyBTZXQoY2FsZW5kYXJBcnIpO1xyXG4gICAgdGhpcy50aW1lU2V0ID0gbmV3IFNldCh0aW1lQXJyKTtcclxuICB9XHJcblxyXG4gIHJldHVybk1heEFuZE1pblZhbHVlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZywgaXNNaW46IGJvb2xlYW4pIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgY29uc3QgdmFsdWVzID0gZGF0YS5tYXAoKHgpID0+IHhba2V5XSk7XHJcbiAgICBsZXQgdmFsdWVUb1JldHVybiA9IGlzTWluID8gbWluKHZhbHVlcykgOiBtYXgodmFsdWVzKTtcclxuICAgIHJldHVybiB2YWx1ZVRvUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuTWluQW5kTWF4RGF0ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgbGV0IERhdGVBcnIgPSBkYXRhLm1hcCgob2JqKSA9PiBkYXlqcyhvYmpba2V5XSkpO1xyXG4gICAgbGV0IG1pbkRhdGUgPSBkYXlqcy5taW4oRGF0ZUFycik7XHJcbiAgICBsZXQgbWF4RGF0ZSA9IGRheWpzLm1heChEYXRlQXJyKTtcclxuXHJcblxyXG4gICAgcmV0dXJuIFttaW5EYXRlLCBtYXhEYXRlXTtcclxuICB9XHJcblxyXG4gIGlzVG9vbHRpcEFjdGl2ZShoZWFkZXI6IHN0cmluZ1tdLCBzb3J0TWFwOiBNYXA8c3RyaW5nLCBTb3J0VHlwZT4pOiBib29sZWFuIHtcclxuICAgIGxldCBzZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG4gICAgbGV0IGlzU29ydE1hcEZvckhlYWRlcjBBY3RpdmUgPSBzb3J0TWFwLmhhcyhoZWFkZXJbMF0pICYmIChzb3J0TWFwLmdldChoZWFkZXJbMF0pICE9IFNvcnRUeXBlRW51bS5ERUZBVUxUKTtcclxuICAgIGxldCBpc1NvcnRNYXBGb3JIZWFkZXIxQWN0aXZlID0gc29ydE1hcC5oYXMoaGVhZGVyWzFdKSAmJiAoc29ydE1hcC5nZXQoaGVhZGVyWzFdKSAhPSBTb3J0VHlwZUVudW0uREVGQVVMVCk7XHJcblxyXG4gICAgaWYoaGVhZGVyLmxlbmd0aCA9PSAxKXtcclxuICAgICAgcmV0dXJuICggKHNvcnRNYXAuc2l6ZSA+IDAgJiYgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSkgfHwgc2V0LmhhcyhoZWFkZXJbMF0pKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKCAoc29ydE1hcC5zaXplID4gMCAmJiAgc29ydE1hcC5oYXMoaGVhZGVyWzBdKSAmJiBpc1NvcnRNYXBGb3JIZWFkZXIwQWN0aXZlKSB8fCAoc29ydE1hcC5zaXplID4gMCAmJiAgc29ydE1hcC5oYXMoaGVhZGVyWzFdKSAmJiBpc1NvcnRNYXBGb3JIZWFkZXIxQWN0aXZlKSB8fCBzZXQuaGFzKGhlYWRlclswXSkgfHwgc2V0LmhhcyhoZWFkZXJbMV0pKTsgXHJcblxyXG4gIH1cclxuXHJcbiAgY2xlYXJDb2x1bW5GaWx0ZXIoKSB7XHJcbiAgICBpZih0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSl7XHJcbiAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICBsZXQgYXBwbGllZEZpbHRlclNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICAgIGFwcGxpZWRGaWx0ZXJTZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSA9IFsuLi5hcHBsaWVkRmlsdGVyU2V0XTsgIFxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSl7XHJcbiAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzZXRPcHRpb25WYWx1ZXMobWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZmxvb3I6IG1pblZhbHVlLFxyXG4gICAgICBjZWlsOiBtYXhWYWx1ZSxcclxuICAgICAgZGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHRyYW5zbGF0ZTogdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvblxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgXHJcbiAgICBpZiAoTWF0aC5hYnMoZGF0YSkgPj0gMTAwMCkge1xyXG4gICAgICBsZXQgaXNOZWdWYWwgPSBkYXRhIDwgMDtcclxuICAgICAgY29uc3QgdmFsID0gKE1hdGguYWJzKGRhdGEpIC8gMTAwMCkudG9GaXhlZCgxKSArIFwiayVcIjtcclxuICAgICAgcmV0dXJuIGlzTmVnVmFsID8gXCItXCIgKyB2YWwgOiB2YWw7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgIGxldCBpc1dob2xlTnVtID0gcGFyc2VJbnQoZGF0YS50b1N0cmluZygpKSA9PSBkYXRhO1xyXG4gICAgICBsZXQgdmFsID0gaXNXaG9sZU51bSA/IE1hdGguYWJzKGRhdGEpLnRvU3RyaW5nKCkgOiBNYXRoLmFicyhkYXRhKS50b0ZpeGVkKDEpOyBcclxuICAgICAgcmV0dXJuIGlzTmVnVmFsID8gXCItXCIgKyB2YWwgKyBcIiVcIiA6IHZhbCArIFwiJVwiO1xyXG4gICAgfVxyXG5cclxuICB9O1xyXG5cclxuICBjdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICBpZiAoTWF0aC5hYnMoZGF0YSkgPj0gMTAwMCkge1xyXG4gICAgICBsZXQgaXNOZWdWYWwgPSBkYXRhIDwgMDtcclxuICAgICAgY29uc3QgdmFsID0gXCIkXCIgKyAoTWF0aC5hYnMoZGF0YSkgLyAxMDAwKS50b0ZpeGVkKDEpICsgXCJrXCI7XHJcbiAgICAgIHJldHVybiBpc05lZ1ZhbCA/IFwiLVwiICsgdmFsIDogdmFsO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICBsZXQgaXNXaG9sZU51bSA9IHBhcnNlSW50KGRhdGEudG9TdHJpbmcoKSkgPT0gZGF0YTtcclxuICAgICAgbGV0IHZhbCA9IGlzV2hvbGVOdW0gPyBNYXRoLmFicyhkYXRhKS50b1N0cmluZygpIDogTWF0aC5hYnMoZGF0YSkudG9GaXhlZCgxKTsgXHJcbiAgICAgIHJldHVybiBpc05lZ1ZhbCA/IFwiLSRcIiArIHZhbCA6IFwiJFwiICsgdmFsO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIG5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICBpZiAoZGF0YSA+PSAxMDAwKSB7XHJcbiAgICAgIGNvbnN0IHZhbCA9IChkYXRhIC8gMTAwMCkudG9GaXhlZCgxKSArIFwia1wiO1xyXG4gICAgICByZXR1cm4gdmFsO1xyXG4gICAgfSBlbHNlIGlmIChkYXRhICE9IE1hdGguZmxvb3IoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuIGRhdGEudG9GaXhlZCgxKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcclxuICB9O1xyXG5cclxuICBmaW5kVW5pcXVlRGF0ZXNXaXRoRGF0YShkYXRhOiBhbnlbXSkge1xyXG4gICAgbGV0IHVuaXF1ZURhdGVzID0gdW5pcShkYXRhLm1hcCgodSkgPT4gdVtcImRhdGVcIl0pKTtcclxuICAgIGxldCB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdDogTmdiRGF0ZVR5cGVbXSA9IFtdO1xyXG4gICAgdW5pcXVlRGF0ZXMuZm9yRWFjaCgoZGF0ZTogYW55KSA9PiB7XHJcbiAgICAgIHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0LnB1c2goXHJcbiAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZVN0YW5kYXJkRm9ybWF0KGRheWpzKGRhdGUsIFwiTU0vREQvWVlcIikuZm9ybWF0KFwiTU0vREQvWVlZWVwiKSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgcmVPcmRlckFwcGxpZWRGaWx0ZXJzQXJyYXkoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZDogYm9vbGVhbiwgZGF0ZT86IGFueSkge1xyXG4gICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgaXNGaWx0ZXJlZCA9IHRoaXMuY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQsIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQsIGRhdGUpO1xyXG4gICAgdGhpcy5yZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQ6IGJvb2xlYW4sIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJ1c2VyXCIgJiYgIXRoaXMudG9vbHRpcE1hcC5oYXMoXCJ1c2VyXCIpKSB7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSBjbG9uZURlZXAoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkVuZFRpbWVGb3JGaWx0ZXJcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJ0aW1lXCJcclxuICAgICAgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiZW5kX3RpbWVfZm9yX2ZpbHRlclwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0RW5kVGltZU11bHRpXCIpIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9ICFpc0VxdWFsKFxyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pXHJcbiAgICAgICkgfHwgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8ICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydEVuZFRpbWVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSAhaXNFcXVhbCh0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykpIHx8ICF0aGlzLmluY2x1ZGVaZXJvVGltZSB8fCAhdGhpcy5pbmNsdWRlTXVsdGlUaW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zbGlkZXJTZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9ICFpc0VxdWFsKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSkgJiYgIWlzRXF1YWwodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMuc2xpZGVyRGF0YSk7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJwb3N0ZWRBZHVcIiAmJiB0aGlzLnN1YlJhZGlvQnV0dG9uID09IFwibm90UmVxdWlyZWRcIikge1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydERhdGVcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJlbmREYXRlXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwicGVyaW9kXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiQWlyRGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImRhdGVcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJyZXZpc2lvblN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkdlbmVyYXRlZE9uXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiV2Vla1wiXHJcbiAgICApIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9XHJcbiAgICAgICAgIWlzRXF1YWwodGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pKSAmJlxyXG4gICAgICAgICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLmZsaWdodERhdGVSYW5nZSk7XHJcbiAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdG90YWxPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuKS5sZW5ndGg7XHJcbiAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnNDb3VudCA9IHRoaXMudG9vbHRpcE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKS5maWx0ZXIoKHg6IGFueSkgPT4gIXguaXNIaWRkZW4gJiYgeC5pc1NlbGVjdGVkKS5sZW5ndGg7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSBzZWxlY3RlZE9wdGlvbnNDb3VudCA+IDAgJiYgc2VsZWN0ZWRPcHRpb25zQ291bnQgIT0gdG90YWxPcHRpb25zQ291bnQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICB9XHJcblxyXG4gIHJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZDogYm9vbGVhbikge1xyXG4gICAgbGV0IHNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICBpZiAoaXNGaWx0ZXJlZCAmJiAhc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgIH0gZWxzZSBpZiAoaXNGaWx0ZXJlZCAmJiBzZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgc2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICBzZXQuYWRkKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkgPSBbLi4uc2V0XTtcclxuICB9XHJcblxyXG4gIGZpbHRlckRhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSwga2V5VG9Ta2lwOiBzdHJpbmcpIHtcclxuICAgIGxldCBmaWx0ZXJlZERhdGEgPSBbLi4ub3JpZ2luYWxEYXRhXTtcclxuXHJcbiAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgIGlmIChrZXkgIT0ga2V5VG9Ta2lwKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IG9ialtrZXldID49IHZhbHVlLm1pbiAmJiBvYmpba2V5XSA8PSB2YWx1ZS5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwic3RhcnREYXRlXCIgfHwga2V5ID09PSBcImVuZERhdGVcIiB8fCBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IGtleSA9PSBcImRhdGVcIiB8fCBrZXkgPT0gXCJyZXZpc2lvblN0YXJ0RGF0ZVwiIHx8IGtleSA9PSBcIkdlbmVyYXRlZE9uXCJ8fCAga2V5ID09PSBcIldlZWtcIikge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmlzT2JqZWN0SW5UaGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwZXJpb2RcIiApIHtcclxuICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5nZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fCBrZXkgPT09IFwiRW5kVGltZUZvckZpbHRlclwiXHJcbiAgICAgICAgICB8fCBrZXkgPT09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHwga2V5ID09PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiB8fCBrZXkgPT0gXCJ0aW1lXCIpIHtcclxuICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwic3RhcnRFbmRUaW1lTXVsdGlcIiB8fCBrZXkgPT0gXCJzdGFydEVuZFRpbWVcIiB8fCBrZXkgPT09IFwiVGltZUJhbmRcIikge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigodSkgPT4gdmFsdWUuaW5jbHVkZXModVtrZXldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XHJcbiAgfVxyXG5cclxuICByZXR1cm5PcmRlcnNJblRoZVJhbmdlKG9yZGVyOiBhbnksIHJhbmdlOiBhbnksIGtleTogYW55KSB7XHJcbiAgICBsZXQgaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgPSBkYXlqcyhvcmRlcltrZXldKS5pc0JldHdlZW4ocmFuZ2UubWluU2VsZWN0ZWREYXRlLCByYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgbGV0IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSA9IGRheWpzKG9yZGVyW2tleV0pLmlzU2FtZShyYW5nZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgbGV0IGlzRGF0ZVNhbWVBc1RoZU1heFNlbGVjdGVkRGF0ZSA9IGRheWpzKG9yZGVyW2tleV0pLmlzU2FtZShyYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgcmV0dXJuIGlzRGF0ZUJldHdlZW5UaGVTZWxlY3RlZFJhbmdlIHx8IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSB8fCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGU7XHJcbiAgfVxyXG5cclxuICByZXR1cm5EYXRhRm9yVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSkge1xyXG4gICAgbGV0IGZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuICAgIGxldCBzZWxlY3RlZFN0YXJ0RGF0ZSA9IGRheWpzKHNlbGVjdGVkRGF0YS5zdGFydFRpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRFbmREYXRlID0gZGF5anMoc2VsZWN0ZWREYXRhLmVuZFRpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgc3RhcnRUaW1lID0gZGF5anMob2JqLnN0YXJ0VGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBlbmRUaW1lID0gZGF5anMob2JqLmVuZFRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkU3RhcnREYXRlKTtcclxuICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgIGxldCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGxldCBmb3JtYXQgPSBcIkhIOm1tOnNzXCI7XHJcbiAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZSA9IGRheWpzKHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IGRheWpzKHNlbGVjdGVkRGF0YS50b1RpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgb2JqVGltZSA9IG9ialtrZXldO1xyXG4gICAgXHJcbiAgICBpZiAoW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpUaW1lKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldID09IFwiMFwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT0gXCIwXCIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGxldCBkYXlqc1RpbWUgPSBkYXlqcyhvYmpUaW1lLGZvcm1hdCk7XHJcbiAgICBcclxuICAgIGxldCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lID0gZGF5anNUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgIGxldCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSA9IGRheWpzVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgbGV0IGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lID0gZGF5anNUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRGcm9tVGltZSB8fFxyXG4gICAgICBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSB8fFxyXG4gICAgICBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOmFueSwga2V5OiBzdHJpbmcpIHtcclxuICAgIGxldCBmb3JtYXQgPSBcIkhIOm1tOnNzXCI7XHJcbiAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZSA9IGRheWpzKHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IGRheWpzKHNlbGVjdGVkRGF0YS50b1RpbWUsIGZvcm1hdCk7XHJcbiAgICBcclxuICAgIGlmKHNlbGVjdGVkRGF0YS5pbmNsdWRlTXVsdGkgJiYgb2JqW2tleV1bMF0gPT0gXCI8bXVsdGk+XCIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYoIXNlbGVjdGVkRGF0YS5pbmNsdWRlTXVsdGkgJiYgb2JqW2tleV1bMF0gPT0gXCI8bXVsdGk+XCIpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldWzBdID09IFwiMFwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIXNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XVswXSA9PSBcIjBcIikge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZighc2VsZWN0ZWREYXRhLmluY2x1ZGVUaW1lUmFuZ2UpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGxldCBzdGFydFRpbWUgPSBkYXlqcyhvYmpba2V5XVsxXSwgZm9ybWF0KTtcclxuICAgIGxldCBlbmRUaW1lID0gZGF5anMob2JqW2tleV1bMl0sIGZvcm1hdCk7XHJcblxyXG4gICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgbGV0IGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gc3RhcnRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcbiAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgbGV0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKSB8fFxyXG4gICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKVxyXG4gICAgKTtcclxuXHJcbn1cclxuXHJcbiAgZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iajogYW55LCB2YWx1ZTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgbGV0IHBhcnNpbmdGb3JtYXQ6IHN0cmluZztcclxuICAgIGlmIChrZXkgPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgcGFyc2luZ0Zvcm1hdCA9IFwiWVlZWS1NTS1ERFwiO1xyXG4gICAgICBcclxuICAgICAgbGV0IGRheWpzU3RhcnREYXRlID0gZGF5anMob2JqLnN0YXJ0RGF0ZSk7XHJcbiAgICAgIGxldCBkYXlqc0VuZERhdGUgPSBkYXlqcyhvYmouZW5kRGF0ZSk7XHJcbiAgICAgIFxyXG4gICAgICBsZXQgc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzU3RhcnREYXRlLmlzQmV0d2VlbihcclxuICAgICAgICB2YWx1ZS5mcm9tRGF0ZSxcclxuICAgICAgICB2YWx1ZS50b0RhdGVcclxuICAgICAgKTtcclxuICAgICAgbGV0IGVuZERhdGVJc0JldHdlZW5TZWxEYXRlID0gZGF5anNFbmREYXRlLmlzQmV0d2VlbihcclxuICAgICAgICB2YWx1ZS5mcm9tRGF0ZSxcclxuICAgICAgICB2YWx1ZS50b0RhdGVcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIFxyXG4gICAgICBsZXQgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUoZGF5anNTdGFydERhdGUpO1xyXG4gICAgICBsZXQgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUoZGF5anNFbmREYXRlKTtcclxuXHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgKHN0YXJ0RGF0ZUlzQmV0d2VlblNlbERhdGUgfHwgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUpICYmXHJcbiAgICAgICAgKGVuZERhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGVuZERhdGVJc1NhbWVBc1NlbEVuZERhdGUpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJBaXJEYXRlXCIgfHwga2V5ID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRFbmREYXRlXCIgfHwgIGtleSA9PT0gXCJXZWVrXCIpIHtcclxuICAgICAgcGFyc2luZ0Zvcm1hdCA9IFwiTU0vREQvWVlZWVwiO1xyXG4gICAgICBsZXQgZGF0ZUlzQmV0d2VlblNlbERhdGUgPSBkYXlqcyhvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNCZXR3ZWVuKHZhbHVlLm1pblNlbGVjdGVkRGF0ZSwgdmFsdWUubWF4U2VsZWN0ZWREYXRlKTtcclxuXHJcbiAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSBkYXlqcyhvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNTYW1lKHZhbHVlLm1pblNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5tYXhTZWxlY3RlZERhdGUpO1xyXG5cclxuICAgICAgcmV0dXJuIGRhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGRhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBpbml0aWFsaXplVGltZUZpbHRlckRhdGEoY2xvbmVkRGF0YTogYW55W10sIGtleSA9IFwic3RhcnRFbmRUaW1lXCIpIHtcclxuICAgIGxldCBzdGFydFRpbWVBcnIgPSBtYXAoY2xvbmVkRGF0YSwgXCJzdGFydFRpbWVcIik7XHJcbiAgICBsZXQgZW5kVGltZUFyciA9IG1hcChjbG9uZWREYXRhLCBcImVuZFRpbWVcIik7XHJcbiAgXHJcbiAgICBzdGFydFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAgIH0pO1xyXG4gIFxyXG4gICAgZW5kVGltZUFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lRGVzY2VuZGluZyhhLCBiKTtcclxuICAgIH0pO1xyXG4gIFxyXG4gICAgbGV0IGluaXRpYWxTdGFydEVuZFRpbWUgPSB7XHJcbiAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWVBcnJbMF0sXHJcbiAgICAgICAgZW5kVGltZTogZW5kVGltZUFyclswXSxcclxuICAgIH07XHJcbiAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBpbml0aWFsU3RhcnRFbmRUaW1lKTtcclxuICB9IFxyXG5cclxuICByZXR1cm5Db2x1bW5GaWx0ZXJTdGF0dXMoZGF0YTogYW55W10sIGhlYWRlck5hbWU6IHN0cmluZyB8IG51bWJlcikge1xyXG5cclxuICAgIGlmKGhlYWRlck5hbWUgPT0gXCJzdGFydEVuZFRpbWVcIil7XHJcbiAgICAgIGxldCB0aW1lID0gZGF0YS5tYXAodSA9PiB1W2hlYWRlck5hbWVdWzBdKTtcclxuICAgICAgbGV0IHVuaXFUaW1lID0gdW5pcSh0aW1lKTtcclxuICAgICAgcmV0dXJuIHVuaXFUaW1lLmxlbmd0aCA9PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bmlxKGRhdGEubWFwKCh1KSA9PiB1W2hlYWRlck5hbWVdKSkubGVuZ3RoID4gMSA/IGZhbHNlIDogdHJ1ZTtcclxuICB9XHJcbiAgXHJcbiAgZ2V0RmlsdGVyT3B0aW9uc0RhdGEoZGF0YTogYW55W10sIGNsb25lZERhdGE6IGFueVtdLCBrZXk/OiBzdHJpbmcpe1xyXG4gICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICBrZXkgPSBrZXkgPyBrZXkgOiB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICBpZihhcHBsaWVkRmlsdGVyU2V0LmhhcyhrZXkpKXtcclxuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyRGF0YShjbG9uZWREYXRhLCBrZXkpO1xyXG4gICAgfVxyXG4gICAgZWxzZXtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZU9yZGVyQXBwbGllZEZpbHRlcnNTdGF0ZShjbG9uZWREYXRhOiBhbnlbXSwgdmFsdWU6IGFueSl7XHJcbiAgICBsZXQgaXNGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICBpc0ZpbHRlcmVkID0gdGhpcy5jaGVja0lmRmlsdGVySXNBcHBsaWVkKGNsb25lZERhdGEsdmFsdWUpO1xyXG4gICAgdGhpcy5yZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQpO1xyXG4gICAgcmV0dXJuIGlzRmlsdGVyZWQ7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmRmlsdGVySXNBcHBsaWVkKGNsb25lZERhdGE6IGFueVtdLHZhbHVlOiBhbnkpe1xyXG4gICAgbGV0IGluaXRpYWxWYWx1ZU9mQ29sdW1uID0gc29ydEJ5KGNsb25lZERhdGEubWFwKGl0ZW0gPT4gaXRlbVt0aGlzLnNlbGVjdGVkUmFkaW9dKSk7XHJcbiAgICBsZXQgY3VycmVudFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkodGhpcy5hcHBseUZpbHRlcihjbG9uZWREYXRhLHZhbHVlKS5tYXAoaXRlbSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKTtcclxuICAgIHJldHVybiAhaXNFcXVhbChpbml0aWFsVmFsdWVPZkNvbHVtbiwgY3VycmVudFZhbHVlT2ZDb2x1bW4pO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlGaWx0ZXIoZGF0YTogYW55W10sdmFsdWU6IGFueSl7XHJcbiAgICBsZXQgZmlsdGVyZWREYXRhID0gZGF0YTtcclxuICAgIGxldCBrZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgIGlmICh0aGlzLnNsaWRlclNldC5oYXMoa2V5KSkge1xyXG4gICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV0gPj0gdmFsdWUubWluICYmIG9ialtrZXldIDw9IHZhbHVlLm1heCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoa2V5ID09PSBcInN0YXJ0RGF0ZVwiIHx8IGtleSA9PT0gXCJlbmREYXRlXCIgfHwga2V5ID09PSBcIkFpckRhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHwga2V5ID09PSBcImZsaWdodEVuZERhdGVcIiB8fCBrZXkgPT0gXCJkYXRlXCIgfHwga2V5ID09IFwicmV2aXNpb25TdGFydERhdGVcIiB8fCBrZXkgPT0gXCJHZW5lcmF0ZWRPblwifHwgIGtleSA9PT0gXCJXZWVrXCIpIHtcclxuICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuaXNPYmplY3RJblRoZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwZXJpb2RcIiApIHtcclxuICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fCBrZXkgPT09IFwiRW5kVGltZUZvckZpbHRlclwiXHJcbiAgICAgICAgfHwga2V5ID09PSBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiIHx8IGtleSA9PT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIgfHwga2V5ID09IFwidGltZVwiKSB7XHJcbiAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoa2V5ID09PSBcInN0YXJ0RW5kVGltZU11bHRpXCIgfHwga2V5ID09IFwic3RhcnRFbmRUaW1lXCIgfHwga2V5ID09PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PiB2YWx1ZS5pbmNsdWRlcyh1W2tleV0pKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmlsdGVyZWREYXRhOyAgXHJcbiAgfVxyXG5cclxuICBpc09iamVjdEluVGhlUmFuZ2Uob2JqOiBhbnksIHZhbHVlOiB7ZnJvbURhdGU6IGRheWpzLkRheWpzLCB0b0RhdGU6IGRheWpzLkRheWpzfSxrZXk6c3RyaW5nKXtcclxuICAgIGxldCBvYmpWYWwgPSBvYmpba2V5XTtcclxuICAgIGxldCBkYXlqc0RhdGUgPSBkYXlqcyhvYmpWYWwpO1xyXG4gICAgbGV0IGlzRGF0ZVNhbWVBc1N0YXJ0T2ZUaGVSYW5nZSA9IHZhbHVlLmZyb21EYXRlLmlzU2FtZShvYmpWYWwpO1xyXG4gICAgbGV0IGlzRGF0ZVNhbWVBc0VuZE9mVGhlUmFuZ2UgPSB2YWx1ZS50b0RhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICBsZXQgaXNEYXRlQmV0d2VlblRoZVN0YXJ0QW5kRW5kT2ZSYW5nZSA9IGRheWpzRGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsdmFsdWUudG9EYXRlKTtcclxuICAgIHJldHVybiBpc0RhdGVTYW1lQXNTdGFydE9mVGhlUmFuZ2UgfHwgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSB8fCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU3RhdGVPZlRoZUN1cnJlbnRGaWx0ZXJUYWIoc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KXtcclxuICAgIGxldCBhY3RpdmVLZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICBsZXQga2V5QXJyOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5pc0ZpbHRlclNvcnRBY3RpdmUpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgaWYoa2V5LmluY2x1ZGVzKGFjdGl2ZUtleSkpe1xyXG4gICAgICAgIGtleUFyciA9IGtleS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgdGhpcy5pc0ZpbHRlclNvcnRBY3RpdmVba2V5XSA9ICB0aGlzLmlzVG9vbHRpcEFjdGl2ZShrZXlBcnIsIHNvcnRNYXApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICB1cGRhdGVTdGF0ZU9mQWxsVGhlS2V5cyhzb3J0TWFwOiBNYXA8c3RyaW5nLCBTb3J0VHlwZT4pe1xyXG4gICAgIE9iamVjdC5rZXlzKHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICBsZXQga2V5QXJyID0ga2V5LnNwbGl0KFwiLFwiKTtcclxuICAgICAgIHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlW2tleV0gPSB0aGlzLmlzVG9vbHRpcEFjdGl2ZShrZXlBcnIsc29ydE1hcCk7XHJcbiAgICAgfSkgICAgIFxyXG4gIH1cclxuICAgIFxyXG59XHJcbiJdfQ==