@annalib/anna-core 1.1.0 → 1.2.0

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