ng-virtual-list 18.11.2 → 18.12.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 (274) hide show
  1. package/README.md +115 -111
  2. package/esm2022/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +170 -61
  3. package/esm2022/lib/components/ng-list-item/const/index.mjs +41 -2
  4. package/esm2022/lib/components/ng-list-item/interfaces/template-context.mjs +1 -1
  5. package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +55 -51
  6. package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.module.mjs +5 -5
  7. package/esm2022/lib/components/ng-list-item/utils/create-display-id.mjs +7 -1
  8. package/esm2022/lib/components/ng-list-item/utils/get-element-by-index.mjs +17 -3
  9. package/esm2022/lib/components/ng-list-item/utils/index.mjs +3 -2
  10. package/esm2022/lib/components/ng-list-item/utils/matrix-3d.mjs +18 -0
  11. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +172 -47
  12. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +32 -16
  13. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.mjs +5 -5
  14. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +58 -34
  15. package/esm2022/lib/components/ng-prerender-container/core/prerender-track-box.mjs +37 -7
  16. package/esm2022/lib/components/ng-prerender-container/interfaces/refresh-params.mjs +1 -1
  17. package/esm2022/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +58 -28
  18. package/esm2022/lib/components/ng-scroll-bar/const/index.mjs +8 -1
  19. package/esm2022/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.mjs +1 -1
  20. package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +236 -88
  21. package/esm2022/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +170 -44
  22. package/esm2022/lib/components/ng-scroll-view/const/index.mjs +4 -2
  23. package/esm2022/lib/components/ng-scroll-view/interfaces/scroll-to-params.mjs +1 -1
  24. package/esm2022/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +610 -99
  25. package/esm2022/lib/components/ng-scroll-view/utils/calculate-direction.mjs +7 -1
  26. package/esm2022/lib/components/ng-scroll-view/utils/calculate-velocity.mjs +12 -0
  27. package/esm2022/lib/components/ng-scroll-view/utils/get-dir.mjs +10 -0
  28. package/esm2022/lib/components/ng-scroll-view/utils/index.mjs +4 -2
  29. package/esm2022/lib/components/ng-scroll-view/utils/matrix-3d.mjs +15 -0
  30. package/esm2022/lib/components/ng-scroller/enums/scroller-directions.mjs +1 -1
  31. package/esm2022/lib/components/ng-scroller/ng-scroller.component.mjs +342 -160
  32. package/esm2022/lib/const/index.mjs +50 -10
  33. package/esm2022/lib/core/cache-map.mjs +1 -54
  34. package/esm2022/lib/core/const/index.mjs +3 -0
  35. package/esm2022/lib/core/enums/index.mjs +3 -0
  36. package/esm2022/lib/core/enums/item-display-methods.mjs +14 -0
  37. package/esm2022/lib/core/events/index.mjs +3 -0
  38. package/esm2022/lib/core/events/track-box-events.mjs +12 -0
  39. package/esm2022/lib/core/interfaces/get-item-position-options.mjs +2 -0
  40. package/esm2022/lib/core/interfaces/get-metrics-returns.mjs +2 -0
  41. package/esm2022/lib/core/interfaces/index.mjs +2 -0
  42. package/esm2022/lib/core/interfaces/item.mjs +2 -0
  43. package/esm2022/lib/core/interfaces/metrics.mjs +2 -0
  44. package/esm2022/lib/core/interfaces/recalculate-metrics-options.mjs +2 -0
  45. package/esm2022/lib/core/interfaces/update-collection-options.mjs +2 -0
  46. package/esm2022/lib/core/interfaces/update-collection-returns.mjs +2 -0
  47. package/esm2022/lib/core/track-box.mjs +601 -191
  48. package/esm2022/lib/core/tracker.mjs +14 -8
  49. package/esm2022/lib/core/types/cache-map-events.mjs +2 -0
  50. package/esm2022/lib/core/types/cache-map-listeners.mjs +2 -0
  51. package/esm2022/lib/core/types/cache.mjs +2 -0
  52. package/esm2022/lib/core/types/index.mjs +2 -0
  53. package/esm2022/lib/core/types/on-change-event-listener.mjs +2 -0
  54. package/esm2022/lib/core/types/on-tick-event-listener.mjs +2 -0
  55. package/esm2022/lib/core/utils/get-service-id-prop.mjs +10 -0
  56. package/esm2022/lib/core/utils/index.mjs +3 -0
  57. package/esm2022/lib/directives/index.mjs +3 -3
  58. package/esm2022/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +34 -13
  59. package/esm2022/lib/directives/virtual-click/virtual-click.directive.mjs +67 -0
  60. package/esm2022/lib/directives/virtual-click/virtual-click.module.mjs +19 -0
  61. package/esm2022/lib/enums/alignments.mjs +12 -0
  62. package/esm2022/lib/enums/collapsing-modes.mjs +22 -0
  63. package/esm2022/lib/enums/index.mjs +8 -4
  64. package/esm2022/lib/enums/selecting-modes-types.mjs +22 -0
  65. package/esm2022/lib/enums/selecting-modes.mjs +22 -0
  66. package/esm2022/lib/enums/snap-to-item-aligns.mjs +22 -0
  67. package/esm2022/lib/enums/spreading-modes.mjs +18 -0
  68. package/esm2022/lib/interfaces/animation-params.mjs +1 -1
  69. package/esm2022/lib/interfaces/base-virtual-list-item-component.mjs +2 -9
  70. package/esm2022/lib/interfaces/index.mjs +1 -1
  71. package/esm2022/lib/interfaces/item-transformation.mjs +2 -0
  72. package/esm2022/lib/interfaces/point.mjs +2 -0
  73. package/esm2022/lib/interfaces/scroll-options.mjs +1 -1
  74. package/esm2022/lib/interfaces/scroll-params.mjs +1 -1
  75. package/esm2022/lib/models/item-config-map.model.mjs +1 -1
  76. package/esm2022/lib/models/item.model.mjs +1 -1
  77. package/esm2022/lib/models/render-item-config.model.mjs +1 -1
  78. package/esm2022/lib/models/render-item-measures.model.mjs +1 -1
  79. package/esm2022/lib/ng-virtual-list-public.service.mjs +6 -7
  80. package/esm2022/lib/ng-virtual-list.component.mjs +2033 -903
  81. package/esm2022/lib/ng-virtual-list.service.mjs +91 -30
  82. package/esm2022/lib/transformations/deck-of-cards-3d.mjs +57 -0
  83. package/esm2022/lib/transformations/deck-of-cards.mjs +54 -0
  84. package/esm2022/lib/transformations/event-horizon.mjs +47 -0
  85. package/esm2022/lib/transformations/index.mjs +13 -0
  86. package/esm2022/lib/transformations/linear.mjs +47 -0
  87. package/esm2022/lib/transformations/swipe-3d.mjs +51 -0
  88. package/esm2022/lib/types/alignment.mjs +2 -0
  89. package/esm2022/lib/types/arithmetic-expression.mjs +2 -0
  90. package/esm2022/lib/types/collapsing-mode.mjs +2 -0
  91. package/esm2022/lib/types/collection-mode.mjs +2 -0
  92. package/esm2022/lib/types/color.mjs +2 -0
  93. package/esm2022/lib/types/direction.mjs +2 -0
  94. package/esm2022/lib/types/float-or-persentage-value.mjs +2 -0
  95. package/esm2022/lib/types/focus-item-params.mjs +1 -1
  96. package/esm2022/lib/types/gradient-color-position.mjs +1 -1
  97. package/esm2022/lib/types/index.mjs +1 -1
  98. package/esm2022/lib/types/item-transform.mjs +2 -0
  99. package/esm2022/lib/types/scroll-direction.mjs +1 -1
  100. package/esm2022/lib/types/selecting-mode.mjs +2 -0
  101. package/esm2022/lib/types/snap-to-item-align.mjs +2 -0
  102. package/esm2022/lib/types/snapping-distance.mjs +2 -0
  103. package/esm2022/lib/types/snapping-method.mjs +2 -0
  104. package/esm2022/lib/types/spreading-mode.mjs +2 -0
  105. package/esm2022/lib/types/text-direction.mjs +2 -0
  106. package/esm2022/lib/utils/animator/animator.mjs +28 -8
  107. package/esm2022/lib/utils/animator/const/index.mjs +2 -0
  108. package/esm2022/lib/utils/animator/index.mjs +3 -2
  109. package/esm2022/lib/utils/animator/interfaces/animator-params.mjs +2 -0
  110. package/esm2022/lib/utils/animator/interfaces/animator-update-data.mjs +2 -0
  111. package/esm2022/lib/utils/animator/interfaces/index.mjs +2 -0
  112. package/esm2022/lib/utils/animator/types/easing.mjs +1 -1
  113. package/esm2022/lib/utils/disposable-component.mjs +27 -0
  114. package/esm2022/lib/utils/event-emitter/event-emitter.mjs +1 -1
  115. package/esm2022/lib/utils/get-scroll-state-version.mjs +12 -0
  116. package/esm2022/lib/utils/is-collapse-mode.mjs +18 -0
  117. package/esm2022/lib/utils/is-collection-mode.mjs +1 -1
  118. package/esm2022/lib/utils/is-direction.mjs +1 -1
  119. package/esm2022/lib/utils/is-persentage-value.mjs +14 -0
  120. package/esm2022/lib/utils/is-select-mode.mjs +18 -0
  121. package/esm2022/lib/utils/is-spreading-mode.mjs +15 -0
  122. package/esm2022/lib/utils/list-validators.mjs +1 -1
  123. package/esm2022/lib/utils/normalize-collection.mjs +42 -0
  124. package/esm2022/lib/utils/object.mjs +1 -1
  125. package/esm2022/lib/utils/parse-arithmetic-expression.mjs +53 -0
  126. package/esm2022/lib/utils/parse-float-or-persentage-value.mjs +17 -0
  127. package/esm2022/lib/utils/scrolling-direction.mjs +29 -0
  128. package/esm2022/lib/utils/snapping-method.mjs +1 -1
  129. package/esm2022/public-api.mjs +4 -1
  130. package/fesm2022/ng-virtual-list.mjs +7545 -3904
  131. package/fesm2022/ng-virtual-list.mjs.map +1 -1
  132. package/lib/components/ng-list-item/base/base-virtual-list-item-component.d.ts +40 -16
  133. package/lib/components/ng-list-item/const/index.d.ts +3 -1
  134. package/lib/components/ng-list-item/interfaces/template-context.d.ts +1 -1
  135. package/lib/components/ng-list-item/ng-virtual-list-item.component.d.ts +5 -2
  136. package/lib/components/ng-list-item/ng-virtual-list-item.module.d.ts +2 -2
  137. package/lib/components/ng-list-item/utils/create-display-id.d.ts +6 -0
  138. package/lib/components/ng-list-item/utils/get-element-by-index.d.ts +15 -1
  139. package/lib/components/ng-list-item/utils/index.d.ts +2 -1
  140. package/lib/components/ng-list-item/utils/matrix-3d.d.ts +7 -0
  141. package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.d.ts +69 -26
  142. package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.d.ts +2 -2
  143. package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.d.ts +2 -2
  144. package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.d.ts +33 -12
  145. package/lib/components/ng-prerender-container/interfaces/refresh-params.d.ts +1 -0
  146. package/lib/components/ng-prerender-container/ng-prerender-container.component.d.ts +20 -17
  147. package/lib/components/ng-scroll-bar/const/index.d.ts +2 -0
  148. package/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.d.ts +2 -2
  149. package/lib/components/ng-scroll-bar/ng-scroll-bar.component.d.ts +75 -24
  150. package/lib/components/ng-scroll-view/base/base-scroll-view.component.d.ts +49 -16
  151. package/lib/components/ng-scroll-view/const/index.d.ts +3 -1
  152. package/lib/components/ng-scroll-view/interfaces/scroll-to-params.d.ts +4 -1
  153. package/lib/components/ng-scroll-view/ng-scroll-view.component.d.ts +79 -11
  154. package/lib/components/ng-scroll-view/utils/calculate-direction.d.ts +6 -0
  155. package/lib/components/ng-scroll-view/utils/calculate-velocity.d.ts +7 -0
  156. package/lib/components/ng-scroll-view/utils/get-dir.d.ts +7 -0
  157. package/lib/components/ng-scroll-view/utils/index.d.ts +3 -1
  158. package/lib/components/ng-scroll-view/utils/matrix-3d.d.ts +7 -0
  159. package/lib/components/ng-scroller/enums/scroller-directions.d.ts +2 -1
  160. package/lib/components/ng-scroller/ng-scroller.component.d.ts +111 -47
  161. package/lib/const/index.d.ts +46 -5
  162. package/lib/core/cache-map.d.ts +0 -10
  163. package/lib/core/const/index.d.ts +1 -0
  164. package/lib/core/enums/index.d.ts +2 -0
  165. package/lib/core/enums/item-display-methods.d.ts +12 -0
  166. package/lib/core/events/index.d.ts +2 -0
  167. package/lib/core/events/track-box-events.d.ts +10 -0
  168. package/lib/core/interfaces/get-item-position-options.d.ts +10 -0
  169. package/lib/core/interfaces/get-metrics-returns.d.ts +11 -0
  170. package/lib/core/interfaces/index.d.ts +8 -0
  171. package/lib/core/interfaces/item.d.ts +9 -0
  172. package/lib/core/interfaces/metrics.d.ts +51 -0
  173. package/lib/core/interfaces/recalculate-metrics-options.d.ts +32 -0
  174. package/lib/core/interfaces/update-collection-options.d.ts +10 -0
  175. package/lib/core/interfaces/update-collection-returns.d.ts +14 -0
  176. package/lib/core/track-box.d.ts +25 -95
  177. package/lib/core/tracker.d.ts +1 -1
  178. package/lib/core/types/cache-map-events.d.ts +8 -0
  179. package/lib/core/types/cache-map-listeners.d.ts +9 -0
  180. package/lib/core/types/cache.d.ts +12 -0
  181. package/lib/core/types/index.d.ts +6 -0
  182. package/lib/core/types/on-change-event-listener.d.ts +7 -0
  183. package/lib/core/types/on-tick-event-listener.d.ts +7 -0
  184. package/lib/core/utils/get-service-id-prop.d.ts +7 -0
  185. package/lib/core/utils/index.d.ts +2 -0
  186. package/lib/directives/index.d.ts +2 -2
  187. package/lib/directives/locale-sensitive/locale-sensitive.directive.d.ts +16 -6
  188. package/lib/directives/virtual-click/virtual-click.directive.d.ts +22 -0
  189. package/lib/directives/virtual-click/virtual-click.module.d.ts +8 -0
  190. package/lib/enums/alignments.d.ts +10 -0
  191. package/lib/enums/collapsing-modes.d.ts +20 -0
  192. package/lib/enums/index.d.ts +7 -9
  193. package/lib/enums/{method-for-selecting-types.d.ts → selecting-modes-types.d.ts} +3 -3
  194. package/lib/enums/{methods-for-selecting.d.ts → selecting-modes.d.ts} +3 -3
  195. package/lib/enums/snap-to-item-aligns.d.ts +20 -0
  196. package/lib/enums/spreading-modes.d.ts +16 -0
  197. package/lib/interfaces/animation-params.d.ts +1 -0
  198. package/lib/interfaces/base-virtual-list-item-component.d.ts +13 -13
  199. package/lib/interfaces/index.d.ts +3 -2
  200. package/lib/interfaces/item-transformation.d.ts +22 -0
  201. package/lib/interfaces/point.d.ts +16 -0
  202. package/lib/interfaces/scroll-options.d.ts +4 -0
  203. package/lib/interfaces/scroll-params.d.ts +3 -2
  204. package/lib/models/item-config-map.model.d.ts +5 -0
  205. package/lib/models/item.model.d.ts +7 -0
  206. package/lib/models/render-item-config.model.d.ts +50 -0
  207. package/lib/models/render-item-measures.model.d.ts +71 -0
  208. package/lib/ng-virtual-list-public.service.d.ts +4 -5
  209. package/lib/ng-virtual-list.component.d.ts +462 -135
  210. package/lib/ng-virtual-list.service.d.ts +33 -12
  211. package/lib/transformations/deck-of-cards-3d.d.ts +54 -0
  212. package/lib/transformations/deck-of-cards.d.ts +50 -0
  213. package/lib/transformations/event-horizon.d.ts +26 -0
  214. package/lib/transformations/index.d.ts +7 -0
  215. package/lib/transformations/linear.d.ts +26 -0
  216. package/lib/transformations/swipe-3d.d.ts +38 -0
  217. package/lib/types/alignment.d.ts +8 -0
  218. package/lib/types/arithmetic-expression.d.ts +10 -0
  219. package/lib/types/collapsing-mode.d.ts +8 -0
  220. package/lib/{enums → types}/collection-mode.d.ts +1 -1
  221. package/lib/types/color.d.ts +4 -0
  222. package/lib/{enums → types}/direction.d.ts +1 -1
  223. package/lib/types/float-or-persentage-value.d.ts +7 -0
  224. package/lib/types/focus-item-params.d.ts +6 -0
  225. package/lib/types/gradient-color-position.d.ts +1 -1
  226. package/lib/types/index.d.ts +15 -1
  227. package/lib/types/item-transform.d.ts +9 -0
  228. package/lib/types/scroll-direction.d.ts +2 -0
  229. package/lib/types/selecting-mode.d.ts +8 -0
  230. package/lib/types/snap-to-item-align.d.ts +8 -0
  231. package/lib/types/snapping-distance.d.ts +8 -0
  232. package/lib/{enums → types}/snapping-method.d.ts +1 -1
  233. package/lib/types/spreading-mode.d.ts +8 -0
  234. package/lib/{enums → types}/text-direction.d.ts +1 -1
  235. package/lib/utils/animator/animator.d.ts +10 -17
  236. package/lib/utils/animator/const/index.d.ts +1 -0
  237. package/lib/utils/animator/index.d.ts +2 -1
  238. package/lib/utils/animator/interfaces/animator-params.d.ts +18 -0
  239. package/lib/utils/animator/interfaces/animator-update-data.d.ts +13 -0
  240. package/lib/utils/animator/interfaces/index.d.ts +3 -0
  241. package/lib/utils/animator/types/easing.d.ts +6 -0
  242. package/lib/utils/disposable-component.d.ts +15 -0
  243. package/lib/utils/get-scroll-state-version.d.ts +1 -0
  244. package/lib/utils/is-collapse-mode.d.ts +8 -0
  245. package/lib/utils/is-collection-mode.d.ts +1 -1
  246. package/lib/utils/is-direction.d.ts +1 -1
  247. package/lib/utils/is-persentage-value.d.ts +7 -0
  248. package/lib/utils/is-select-mode.d.ts +8 -0
  249. package/lib/utils/is-spreading-mode.d.ts +8 -0
  250. package/lib/utils/list-validators.d.ts +1 -1
  251. package/lib/utils/normalize-collection.d.ts +8 -0
  252. package/lib/utils/object.d.ts +1 -1
  253. package/lib/utils/parse-arithmetic-expression.d.ts +8 -0
  254. package/lib/utils/parse-float-or-persentage-value.d.ts +7 -0
  255. package/lib/utils/scrolling-direction.d.ts +17 -0
  256. package/lib/utils/snapping-method.d.ts +1 -1
  257. package/package.json +1 -1
  258. package/public-api.d.ts +3 -0
  259. package/esm2022/lib/components/ng-scroller/const/index.mjs +0 -2
  260. package/esm2022/lib/directives/item-click/item-click.directive.mjs +0 -59
  261. package/esm2022/lib/directives/item-click/item-click.module.mjs +0 -19
  262. package/esm2022/lib/enums/collection-mode.mjs +0 -2
  263. package/esm2022/lib/enums/direction.mjs +0 -2
  264. package/esm2022/lib/enums/method-for-selecting-types.mjs +0 -22
  265. package/esm2022/lib/enums/method-for-selecting.mjs +0 -2
  266. package/esm2022/lib/enums/methods-for-selecting.mjs +0 -22
  267. package/esm2022/lib/enums/snapping-method.mjs +0 -2
  268. package/esm2022/lib/enums/text-direction.mjs +0 -2
  269. package/esm2022/lib/utils/is-method-for-selecting.mjs +0 -18
  270. package/lib/components/ng-scroller/const/index.d.ts +0 -1
  271. package/lib/directives/item-click/item-click.directive.d.ts +0 -19
  272. package/lib/directives/item-click/item-click.module.d.ts +0 -8
  273. package/lib/enums/method-for-selecting.d.ts +0 -8
  274. package/lib/utils/is-method-for-selecting.d.ts +0 -8
@@ -1,13 +1,13 @@
1
- import { Component, computed, effect, ElementRef, inject, input, output, signal, viewChild } from '@angular/core';
2
- import { combineLatest, filter, fromEvent, of, startWith, Subject, switchMap, tap } from 'rxjs';
3
- import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
1
+ import { Component, ElementRef, EventEmitter, inject, Input, Output, TemplateRef, ViewChild } from '@angular/core';
2
+ import { BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, filter, fromEvent, of, startWith, Subject, switchMap, takeUntil, tap } from 'rxjs';
4
3
  import { NgScrollView, SCROLL_VIEW_INVERSION } from '../ng-scroll-view';
5
- import { DEFAULT_SCROLLBAR_INTERACTIVE } from '../../const';
6
- import { DEFAULT_SIZE, DEFAULT_THICKNESS, HEIGHT, NONE, OPACITY, OPACITY_0, OPACITY_1, PX, TRANSITION, TRANSITION_FADE_IN, WIDTH, } from './const';
7
- import { SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO } from '../ng-scroll-view/const';
4
+ import { DEFAULT_LANG_TEXT_DIR, DEFAULT_OVERLAPPING_SCROLLBAR, DEFAULT_SCROLLBAR_INTERACTIVE, LEFT, POSITION, POSITION_ABSOLUTE, POSITION_RELATIVE, RIGHT, SIZE_100_PERSENT, SIZE_AUTO, UNSET, } from '../../const';
5
+ import { DEFAULT_SCROLLBAR_TEMPLATE_CONTEXT, DEFAULT_SIZE, DEFAULT_THICKNESS, HEIGHT, NONE, OPACITY, OPACITY_0, OPACITY_1, PX, TRANSITION, TRANSITION_FADE_IN, WIDTH, } from './const';
6
+ import { SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, SCROLL_VIEW_OVERSCROLL_ENABLED } from '../ng-scroll-view/const';
8
7
  import { NgScrollBarService } from './ng-scroll-bar.service';
9
8
  import { NgScrollBarPublicService } from './ng-scroll-bar-public.service';
10
9
  import { ScrollbarStates } from './enums';
10
+ import { TextDirections } from '../../enums';
11
11
  import * as i0 from "@angular/core";
12
12
  import * as i1 from "@angular/common";
13
13
  /**
@@ -19,123 +19,238 @@ import * as i1 from "@angular/common";
19
19
  * @email djonnyx@gmail.com
20
20
  */
21
21
  export class NgScrollBarComponent extends NgScrollView {
22
- _defaultRenderer = viewChild('defaultRenderer');
23
- _service = inject(NgScrollBarService);
22
+ _defaultRenderer = undefined;
23
+ _scrollBarService = inject(NgScrollBarService);
24
24
  _apiService = inject(NgScrollBarPublicService);
25
- loading = input(false);
26
- onDrag = output();
27
- onDragEnd = output();
28
- thumbGradientPositions = input([0, 0]);
29
- size = input(DEFAULT_SIZE);
30
- thickness = input(DEFAULT_THICKNESS);
31
- scrollbarMinSize = input(0);
32
- prepared = input(false);
33
- interactive = input(DEFAULT_SCROLLBAR_INTERACTIVE);
34
- show = input(false);
35
- params = input({});
36
- renderer = input(null);
37
- thumbRenderer = signal(this._defaultRenderer() ?? null);
38
- hoverState = signal(false);
39
- pressedState = signal(false);
40
- templateContext;
41
- styles;
42
- thumbWidth;
43
- thumbHeight;
25
+ _$loading = new BehaviorSubject(false);
26
+ $loading = this._$loading.asObservable();
27
+ set loading(v) {
28
+ this._$loading.next(v);
29
+ }
30
+ get loading() { return this._$loading.getValue(); }
31
+ onDrag = new EventEmitter();
32
+ onDragEnd = new EventEmitter();
33
+ _$thumbGradientPositions = new BehaviorSubject([0, 0]);
34
+ $thumbGradientPositions = this._$thumbGradientPositions.asObservable();
35
+ set thumbGradientPositions(v) {
36
+ if (this._$thumbGradientPositions.getValue() !== v) {
37
+ this._$thumbGradientPositions.next(v);
38
+ }
39
+ }
40
+ get thumbGradientPositions() { return this._$thumbGradientPositions.getValue(); }
41
+ _$size = new BehaviorSubject(DEFAULT_SIZE);
42
+ $size = this._$size.asObservable();
43
+ set size(v) {
44
+ if (this._$size.getValue() !== v) {
45
+ this._$size.next(v);
46
+ }
47
+ }
48
+ get size() { return this._$size.getValue(); }
49
+ _$thickness = new BehaviorSubject(DEFAULT_THICKNESS);
50
+ $thickness = this._$thickness.asObservable();
51
+ set thickness(v) {
52
+ if (this._$thickness.getValue() !== v) {
53
+ this._$thickness.next(v);
54
+ }
55
+ }
56
+ get thickness() { return this._$thickness.getValue(); }
57
+ _$scrollbarMinSize = new BehaviorSubject(0);
58
+ $scrollbarMinSize = this._$scrollbarMinSize.asObservable();
59
+ set scrollbarMinSize(v) {
60
+ if (this._$scrollbarMinSize.getValue() !== v) {
61
+ this._$scrollbarMinSize.next(v);
62
+ }
63
+ }
64
+ get scrollbarMinSize() { return this._$endOffset.getValue(); }
65
+ _$prepared = new BehaviorSubject(false);
66
+ $prepared = this._$prepared.asObservable();
67
+ set prepared(v) {
68
+ if (this._$prepared.getValue() !== v) {
69
+ this._$prepared.next(v);
70
+ }
71
+ }
72
+ get prepared() { return this._$prepared.getValue(); }
73
+ _$langTextDir = new BehaviorSubject(DEFAULT_LANG_TEXT_DIR);
74
+ $langTextDir = this._$langTextDir.asObservable();
75
+ set langTextDir(v) {
76
+ if (this._$langTextDir.getValue() !== v) {
77
+ this._$langTextDir.next(v);
78
+ }
79
+ }
80
+ get langTextDir() { return this._$langTextDir.getValue(); }
81
+ _$interactive = new BehaviorSubject(DEFAULT_SCROLLBAR_INTERACTIVE);
82
+ $interactive = this._$interactive.asObservable();
83
+ set interactive(v) {
84
+ if (this._$interactive.getValue() !== v) {
85
+ this._$interactive.next(v);
86
+ }
87
+ }
88
+ get interactive() { return this._$interactive.getValue(); }
89
+ _$overlapping = new BehaviorSubject(DEFAULT_OVERLAPPING_SCROLLBAR);
90
+ $overlapping = this._$overlapping.asObservable();
91
+ set overlapping(v) {
92
+ if (this._$overlapping.getValue() !== v) {
93
+ this._$overlapping.next(v);
94
+ }
95
+ }
96
+ get overlapping() { return this._$overlapping.getValue(); }
97
+ _$show = new BehaviorSubject(false);
98
+ $show = this._$show.asObservable();
99
+ set show(v) {
100
+ if (this._$show.getValue() !== v) {
101
+ this._$show.next(v);
102
+ }
103
+ }
104
+ get show() { return this._$show.getValue(); }
105
+ _$params = new BehaviorSubject({});
106
+ $params = this._$params.asObservable();
107
+ set params(v) {
108
+ if (this._$params.getValue() !== v) {
109
+ this._$params.next(v);
110
+ }
111
+ }
112
+ get params() { return this._$params.getValue(); }
113
+ _$renderer = new BehaviorSubject(null);
114
+ $renderer = this._$renderer.asObservable();
115
+ set renderer(v) {
116
+ if (this._$renderer.getValue() !== v) {
117
+ this._$renderer.next(v);
118
+ }
119
+ }
120
+ get renderer() { return this._$renderer.getValue(); }
121
+ _$thumbRenderer = new BehaviorSubject(this._defaultRenderer ?? null);
122
+ $thumbRenderer = this._$thumbRenderer.asObservable();
123
+ _$hoverState = new BehaviorSubject(false);
124
+ $hoverState = this._$hoverState.asObservable();
125
+ _$pressedState = new BehaviorSubject(false);
126
+ $pressedState = this._$pressedState.asObservable();
127
+ _$templateContext = new BehaviorSubject(DEFAULT_SCROLLBAR_TEMPLATE_CONTEXT);
128
+ $templateContext = this._$templateContext.asObservable();
129
+ _$styles = new BehaviorSubject({});
130
+ $styles = this._$styles.asObservable();
131
+ _$thumbWidth = new BehaviorSubject(0);
132
+ $thumbWidth = this._$thumbWidth.asObservable();
133
+ _$thumbHeight = new BehaviorSubject(0);
134
+ $thumbHeight = this._$thumbHeight.asObservable();
44
135
  _$scrollingCancel = new Subject();
45
136
  $scrollingCancel = this._$scrollingCancel.asObservable();
46
137
  _elementRef = inject(ElementRef);
47
138
  constructor() {
48
139
  super();
49
- this.templateContext = computed(() => {
140
+ const $thumbWidth = this.$thumbWidth, $thumbHeight = this.$thumbHeight, $thumbGradientPositions = this.$thumbGradientPositions, $params = this.$params;
141
+ combineLatest([$thumbWidth, $thumbHeight, $thumbGradientPositions, $params]).pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(([thumbWidth, thumbHeight, thumbGradientPositions, params]) => {
50
142
  const context = {
51
143
  api: this._apiService,
52
- width: this.thumbWidth(),
53
- height: this.thumbHeight(),
54
- fillPositions: this.thumbGradientPositions(),
55
- params: this.params() ?? {},
144
+ width: thumbWidth,
145
+ height: thumbHeight,
146
+ fillPositions: thumbGradientPositions,
147
+ params: params ?? {},
56
148
  };
57
- return context;
58
- });
59
- const $renderer = toObservable(this.renderer).pipe(startWith(null)), $defaultRenderer = toObservable(this._defaultRenderer);
60
- combineLatest([$renderer, $defaultRenderer]).pipe(takeUntilDestroyed(), switchMap(([renderer, defaultRenderer]) => {
149
+ this._$templateContext.next(context);
150
+ })).subscribe();
151
+ const $renderer = this.$renderer.pipe(startWith(null)), $defaultRenderer = of(this._defaultRenderer);
152
+ combineLatest([$renderer, $defaultRenderer]).pipe(takeUntil(this._$unsubscribe), switchMap(([renderer, defaultRenderer]) => {
61
153
  return of((renderer ?? defaultRenderer) ?? null);
62
- }), tap(v => {
63
- this.thumbRenderer.set(v);
154
+ }), debounceTime(0), tap(v => {
155
+ this._$thumbRenderer.next(v);
64
156
  })).subscribe();
65
- const $prepared = toObservable(this.prepared);
66
- $prepared.pipe(takeUntilDestroyed(), filter(v => !!v), tap(() => {
157
+ const $prepared = this.$prepared;
158
+ $prepared.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), tap(() => {
67
159
  this.scrollLimits();
68
- this.refreshX(this._x);
69
- this.refreshY(this._y);
160
+ this.refreshCoordinate(this._x, this._y);
70
161
  this.fireScrollEvent(false);
71
162
  })).subscribe();
72
- this.thumbWidth = computed(() => {
73
- return this.isVertical() ? this.thickness() : this.size();
74
- });
75
- this.thumbHeight = computed(() => {
76
- return this.isVertical() ? this.size() : this.thickness();
77
- });
78
- const $pointerDown = fromEvent(this._elementRef.nativeElement, 'pointerdown').pipe(takeUntilDestroyed()), $pointerUp = fromEvent(this._elementRef.nativeElement, 'pointerup').pipe(takeUntilDestroyed()), $docPointerUp = fromEvent(document, 'pointerup').pipe(takeUntilDestroyed()), $pointerEnter = fromEvent(this._elementRef.nativeElement, 'pointerenter').pipe(takeUntilDestroyed()), $pointerLeave = fromEvent(this._elementRef.nativeElement, 'pointerleave').pipe(takeUntilDestroyed());
79
- $pointerDown.pipe(takeUntilDestroyed(), tap(e => {
80
- this.pressedState.set(this.thumbHit(e.clientX, e.clientY));
163
+ combineLatest([this.$isVertical, this.$thickness, this.$size]).pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(([isVertical, thickness, size]) => {
164
+ this._$thumbWidth.next(isVertical ? thickness : size);
165
+ this._$thumbHeight.next(isVertical ? size : thickness);
166
+ })).subscribe();
167
+ }
168
+ ngAfterViewInit() {
169
+ super.ngAfterViewInit();
170
+ const $wheel = this.$wheel;
171
+ $wheel.pipe(takeUntil(this._$unsubscribe), debounceTime(100), tap(() => {
172
+ const event = this.createDragEvent(true);
173
+ if (!!event) {
174
+ this.onDragEnd.emit(event);
175
+ }
81
176
  })).subscribe();
82
- combineLatest([$docPointerUp, $pointerUp]).pipe(takeUntilDestroyed(), tap(() => {
83
- this.pressedState.set(false);
177
+ const $pointerDown = fromEvent(this._elementRef.nativeElement, 'pointerdown').pipe(takeUntil(this._$unsubscribe)), $pointerUp = fromEvent(this._elementRef.nativeElement, 'pointerup').pipe(takeUntil(this._$unsubscribe)), $docPointerUp = fromEvent(document, 'pointerup').pipe(takeUntil(this._$unsubscribe)), $pointerEnter = fromEvent(this._elementRef.nativeElement, 'pointerenter').pipe(takeUntil(this._$unsubscribe)), $pointerLeave = fromEvent(this._elementRef.nativeElement, 'pointerleave').pipe(takeUntil(this._$unsubscribe));
178
+ $pointerDown.pipe(takeUntil(this._$unsubscribe), tap(e => {
179
+ this._$pressedState.next(this.thumbHit(e.clientX, e.clientY));
84
180
  })).subscribe();
85
- $pointerEnter.pipe(takeUntilDestroyed(), tap(() => {
86
- this.hoverState.set(true);
181
+ combineLatest([$docPointerUp, $pointerUp]).pipe(takeUntil(this._$unsubscribe), tap(() => {
182
+ this._$pressedState.next(false);
87
183
  })).subscribe();
88
- $pointerLeave.pipe(takeUntilDestroyed(), tap(() => {
89
- this.hoverState.set(false);
184
+ $pointerEnter.pipe(takeUntil(this._$unsubscribe), tap(() => {
185
+ this._$hoverState.next(true);
90
186
  })).subscribe();
91
- effect(() => {
92
- const pressed = this.pressedState(), hover = this.hoverState();
187
+ $pointerLeave.pipe(takeUntil(this._$unsubscribe), tap(() => {
188
+ this._$hoverState.next(false);
189
+ })).subscribe();
190
+ const $pressedState = this.$pressedState.pipe(takeUntil(this._$unsubscribe)), $hoverState = this.$hoverState.pipe(takeUntil(this._$unsubscribe));
191
+ combineLatest([
192
+ $pressedState, $hoverState,
193
+ ]).pipe(takeUntil(this._$unsubscribe), debounceTime(0), distinctUntilChanged(), tap(([pressed, hover]) => {
93
194
  if (pressed) {
94
- this._service.state = ScrollbarStates.PRESSED;
195
+ this._scrollBarService.state = ScrollbarStates.PRESSED;
95
196
  return;
96
197
  }
97
198
  else if (hover) {
98
- this._service.state = ScrollbarStates.HOVER;
199
+ this._scrollBarService.state = ScrollbarStates.HOVER;
99
200
  return;
100
201
  }
101
- this._service.state = ScrollbarStates.NORMAL;
202
+ this._scrollBarService.state = ScrollbarStates.NORMAL;
102
203
  return;
103
- }, { allowSignalWrites: true });
104
- effect(() => {
105
- this.totalSize = this.size();
106
- });
107
- effect(() => {
108
- this._interactive = this.interactive();
109
- });
110
- this.styles = computed(() => {
111
- const show = this.show(), sizePropName = this.isVertical() ? WIDTH : HEIGHT;
112
- return {
113
- [sizePropName]: `${show ? this.thickness() : 0}${PX}`,
204
+ })).subscribe();
205
+ this.$size.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
206
+ this.totalSize = v;
207
+ })).subscribe();
208
+ this.$interactive.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
209
+ this.interactive = v;
210
+ })).subscribe();
211
+ combineLatest([this.$show, this.$isVertical, this.$thickness]).pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(([show, isVertical, thickness]) => {
212
+ const sizePropName = isVertical ? WIDTH : HEIGHT;
213
+ this._$styles.next({
214
+ [sizePropName]: `${show ? thickness : 0}${PX}`,
114
215
  [OPACITY]: show ? OPACITY_1 : OPACITY_0, [TRANSITION]: show ? TRANSITION_FADE_IN : NONE,
115
- };
116
- });
117
- this.$scroll.pipe(takeUntilDestroyed(), tap(v => {
216
+ });
217
+ })).subscribe();
218
+ const $overlapping = this.$overlapping, $langTextDir = this.$langTextDir;
219
+ combineLatest([$overlapping, $langTextDir]).pipe(takeUntil(this._$unsubscribe), tap(([overlapping, langTextDir]) => {
220
+ const el = this._elementRef.nativeElement;
221
+ if (!!el) {
222
+ el.style[POSITION] = overlapping ? POSITION_ABSOLUTE : POSITION_RELATIVE;
223
+ el.style[LEFT] = overlapping && langTextDir === TextDirections.RTL ? '0' : UNSET;
224
+ el.style[RIGHT] = overlapping && langTextDir === TextDirections.LTR ? '0' : UNSET;
225
+ el.style[WIDTH] = overlapping ? SIZE_AUTO : SIZE_100_PERSENT;
226
+ }
227
+ })).subscribe();
228
+ this.$scroll.pipe(takeUntil(this._$unsubscribe), tap(v => {
118
229
  const event = this.createDragEvent(v);
119
230
  if (!!event) {
120
231
  this.onDrag.emit(event);
121
232
  }
122
233
  })).subscribe();
123
234
  const $scrollEnd = this.$scrollEnd;
124
- $scrollEnd.pipe(takeUntilDestroyed(), tap(() => {
125
- const event = this.createDragEvent(false);
235
+ $scrollEnd.pipe(takeUntil(this._$unsubscribe), tap(userAction => {
236
+ const event = this.createDragEvent(userAction);
126
237
  if (!!event) {
127
238
  this.onDragEnd.emit(event);
128
239
  }
129
240
  })).subscribe();
241
+ const $renderer = this.$renderer, $defaultRenderer = of(this._defaultRenderer);
242
+ combineLatest([$renderer, $defaultRenderer]).pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(([renderer, defaultRenderer]) => {
243
+ this._$thumbRenderer.next(renderer || defaultRenderer || null);
244
+ })).subscribe();
130
245
  }
131
246
  createDragEvent(userAction) {
132
- const isVertical = this.isVertical(), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, scrollContent = this.scrollContent()?.nativeElement, scrollViewport = this.scrollViewport()?.nativeElement;
247
+ const isVertical = this._$isVertical.getValue(), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, scrollContent = this.scrollContent?.nativeElement, scrollViewport = this.scrollViewport?.nativeElement;
133
248
  if (!!scrollViewport && !!scrollContent) {
134
249
  const contentSize = isVertical ? scrollContent.offsetHeight : scrollContent.offsetWidth, viewportSize = isVertical ? scrollViewport.offsetHeight : scrollViewport.offsetWidth;
135
250
  const event = {
136
251
  position: scrollSize !== 0 ? ((isVertical ? this._y : this._x) / scrollSize) : 0,
137
- min: scrollSize !== 0 ? (this.startOffset() / scrollSize) : 0,
138
- max: scrollSize !== 0 ? ((viewportSize - this.endOffset() - contentSize) / scrollSize) : 0,
252
+ min: scrollSize !== 0 ? (this.startOffset / scrollSize) : 0,
253
+ max: scrollSize !== 0 ? ((viewportSize - this.endOffset - contentSize) / scrollSize) : 0,
139
254
  animation: !this._isMoving,
140
255
  userAction,
141
256
  };
@@ -144,7 +259,7 @@ export class NgScrollBarComponent extends NgScrollView {
144
259
  return null;
145
260
  }
146
261
  thumbHit(x, y) {
147
- const thumb = this.scrollContent()?.nativeElement;
262
+ const thumb = this.scrollContent?.nativeElement;
148
263
  if (!!thumb) {
149
264
  const { x: tX, y: tY, width: tWidth, height: tHeight } = thumb.getBoundingClientRect();
150
265
  if ((x >= tX && x <= tX + tWidth) && (y >= tY && y <= tY + tHeight)) {
@@ -154,23 +269,56 @@ export class NgScrollBarComponent extends NgScrollView {
154
269
  return false;
155
270
  }
156
271
  click(event) {
157
- this._service.click(event);
272
+ this._scrollBarService.click(event);
158
273
  }
159
274
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgScrollBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
160
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: NgScrollBarComponent, selector: "ng-scroll-bar", inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, thumbGradientPositions: { classPropertyName: "thumbGradientPositions", publicName: "thumbGradientPositions", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, thickness: { classPropertyName: "thickness", publicName: "thickness", isSignal: true, isRequired: false, transformFunction: null }, scrollbarMinSize: { classPropertyName: "scrollbarMinSize", publicName: "scrollbarMinSize", isSignal: true, isRequired: false, transformFunction: null }, prepared: { classPropertyName: "prepared", publicName: "prepared", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, show: { classPropertyName: "show", publicName: "show", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, renderer: { classPropertyName: "renderer", publicName: "renderer", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onDrag: "onDrag", onDragEnd: "onDragEnd" }, providers: [
275
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: NgScrollBarComponent, selector: "ng-scroll-bar", inputs: { loading: "loading", thumbGradientPositions: "thumbGradientPositions", size: "size", thickness: "thickness", scrollbarMinSize: "scrollbarMinSize", prepared: "prepared", langTextDir: "langTextDir", interactive: "interactive", overlapping: "overlapping", show: "show", params: "params", renderer: "renderer" }, outputs: { onDrag: "onDrag", onDragEnd: "onDragEnd" }, providers: [
161
276
  { provide: SCROLL_VIEW_INVERSION, useValue: true },
162
277
  { provide: SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, useValue: false },
278
+ { provide: SCROLL_VIEW_OVERSCROLL_ENABLED, useValue: false },
163
279
  NgScrollBarService,
164
280
  NgScrollBarPublicService,
165
- ], viewQueries: [{ propertyName: "_defaultRenderer", first: true, predicate: ["defaultRenderer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div #scrollViewport class=\"track\" part=\"scrollbar-track\" [ngStyle]=\"styles()\" [ngClass]=\"{grabbing: grabbing()}\">\r\n <div #scrollContent class=\"thumb\" part=\"scrollbar-thumb\" [class.horizontal]=\"!isVertical()\"\r\n (pointerdown)=\"click($event)\">\r\n <ng-container [ngTemplateOutlet]=\"thumbRenderer()\" [ngTemplateOutletContext]=\"templateContext()\" />\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultRenderer let-api=\"api\" let-width=\"width\" let-height=\"height\" let-fillPositions=\"fillPositions\"\r\n let-params=\"params\">\r\n <div class=\"shape\" part=\"scrollbar-thumb__shape\" [style.width.px]=\"width\" [style.height.px]=\"height\"></div>\r\n</ng-template>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none;width:100%;height:100%}.track{position:relative;overflow:hidden;width:100%;height:100%;cursor:grab}.track.grabbing{cursor:grabbing}.track .thumb{display:block;position:absolute;list-style:none;padding:0;margin:0;overflow:hidden}.track .thumb.prepared{overflow:hidden}.track .thumb.horizontal{top:0}.track .thumb .shape{box-sizing:border-box;pointer-events:none;background-color:#818181;border-radius:0;overflow:hidden}.track.grabbing .thumb{cursor:grabbing}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
281
+ ], viewQueries: [{ propertyName: "_defaultRenderer", first: true, predicate: ["defaultRenderer"], descendants: true, read: (TemplateRef) }], usesInheritance: true, ngImport: i0, template: "<div #scrollViewport class=\"track\" part=\"scrollbar-track\" [ngStyle]=\"$styles | async\"\r\n [ngClass]=\"{grabbing: $grabbing | async}\">\r\n <div #scrollContent class=\"thumb\" part=\"scrollbar-thumb\" [class.horizontal]=\"($isVertical | async)! == false\"\r\n (pointerdown)=\"click($event)\">\r\n <ng-container [ngTemplateOutlet]=\"($thumbRenderer | async)!\"\r\n [ngTemplateOutletContext]=\"($templateContext | async)!\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultRenderer let-api=\"api\" let-width=\"width\" let-height=\"height\" let-fillPositions=\"fillPositions\"\r\n let-params=\"params\">\r\n <div class=\"shape\" part=\"scrollbar-thumb__shape\" [style.width.px]=\"width\" [style.height.px]=\"height\"></div>\r\n</ng-template>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none;width:100%;height:100%}.track{position:relative;overflow:hidden;width:100%;height:100%;cursor:grab}.track.grabbing{cursor:grabbing}.track .thumb{display:block;position:absolute;list-style:none;padding:0;margin:0;overflow:hidden}.track .thumb.prepared{overflow:hidden}.track .thumb.horizontal{top:0}.track .thumb .shape{box-sizing:border-box;pointer-events:none;background-color:#818181;border-radius:0;overflow:hidden}.track.grabbing .thumb{cursor:grabbing}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
166
282
  }
167
283
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgScrollBarComponent, decorators: [{
168
284
  type: Component,
169
285
  args: [{ selector: 'ng-scroll-bar', providers: [
170
286
  { provide: SCROLL_VIEW_INVERSION, useValue: true },
171
287
  { provide: SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, useValue: false },
288
+ { provide: SCROLL_VIEW_OVERSCROLL_ENABLED, useValue: false },
172
289
  NgScrollBarService,
173
290
  NgScrollBarPublicService,
174
- ], standalone: false, template: "<div #scrollViewport class=\"track\" part=\"scrollbar-track\" [ngStyle]=\"styles()\" [ngClass]=\"{grabbing: grabbing()}\">\r\n <div #scrollContent class=\"thumb\" part=\"scrollbar-thumb\" [class.horizontal]=\"!isVertical()\"\r\n (pointerdown)=\"click($event)\">\r\n <ng-container [ngTemplateOutlet]=\"thumbRenderer()\" [ngTemplateOutletContext]=\"templateContext()\" />\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultRenderer let-api=\"api\" let-width=\"width\" let-height=\"height\" let-fillPositions=\"fillPositions\"\r\n let-params=\"params\">\r\n <div class=\"shape\" part=\"scrollbar-thumb__shape\" [style.width.px]=\"width\" [style.height.px]=\"height\"></div>\r\n</ng-template>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none;width:100%;height:100%}.track{position:relative;overflow:hidden;width:100%;height:100%;cursor:grab}.track.grabbing{cursor:grabbing}.track .thumb{display:block;position:absolute;list-style:none;padding:0;margin:0;overflow:hidden}.track .thumb.prepared{overflow:hidden}.track .thumb.horizontal{top:0}.track .thumb .shape{box-sizing:border-box;pointer-events:none;background-color:#818181;border-radius:0;overflow:hidden}.track.grabbing .thumb{cursor:grabbing}\n"] }]
175
- }], ctorParameters: () => [] });
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9jb21wb25lbnRzL25nLXNjcm9sbC1iYXIvbmctc2Nyb2xsLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9jb21wb25lbnRzL25nLXNjcm9sbC1iYXIvbmctc2Nyb2xsLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFVLE1BQU0sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkksT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTlFLE9BQU8sRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV4RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUQsT0FBTyxFQUNMLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxHQUN4SCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRixPQUFPLEVB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RUFBRSxJQUFJLEVBQUU7WUFDbEQsRUFBRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUNuRSxrQkFBa0I7WUFDbEIsd0JBQXdCO1NBQ3pCLHNMQzlCSCwwc0JBVWM7OzRGRHlCRCxvQkFBb0I7a0JBWmhDLFNBQVM7K0JBQ0UsZUFBZSxhQUNkO3dCQUNULEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7d0JBQ2xELEVBQUUsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7d0JBQ25FLGtCQUFrQjt3QkFDbEIsd0JBQXdCO3FCQUN6QixjQUNXLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgU2lnbmFsLCBzaWduYWwsIFRlbXBsYXRlUmVmLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBmcm9tRXZlbnQsIG9mLCBzdGFydFdpdGgsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBHcmFkaWVudENvbG9yUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvZ3JhZGllbnQtY29sb3ItcG9zaXRpb25zJztcclxuaW1wb3J0IHsgTmdTY3JvbGxWaWV3LCBTQ1JPTExfVklFV19JTlZFUlNJT04gfSBmcm9tICcuLi9uZy1zY3JvbGwtdmlldyc7XHJcbmltcG9ydCB7IElTY3JvbGxCYXJEcmFnRXZlbnQsIElTY3JvbGxCYXJUZW1wbGF0ZUNvbnRleHQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBERUZBVUxUX1NDUk9MTEJBUl9JTlRFUkFDVElWRSB9IGZyb20gJy4uLy4uL2NvbnN0JztcclxuaW1wb3J0IHtcclxuICBERUZBVUxUX1NJWkUsIERFRkFVTFRfVEhJQ0tORVNTLCBIRUlHSFQsIE5PTkUsIE9QQUNJVFksIE9QQUNJVFlfMCwgT1BBQ0lUWV8xLCBQWCwgVFJBTlNJVElPTiwgVFJBTlNJVElPTl9GQURFX0lOLCBXSURUSCxcclxufSBmcm9tICcuL2NvbnN0JztcclxuaW1wb3J0IHsgU0NST0xMX1ZJRVdfTk9STUFMSVpFX1ZBTFVFX0ZST01fWkVSTyB9IGZyb20gJy4uL25nLXNjcm9sbC12aWV3L2NvbnN0JztcclxuaW1wb3J0IHsgTmdTY3JvbGxCYXJTZXJ2aWNlIH0gZnJvbSAnLi9uZy1zY3JvbGwtYmFyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ1Njcm9sbEJhclB1YmxpY1NlcnZpY2UgfSBmcm9tICcuL25nLXNjcm9sbC1iYXItcHVibGljLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTY3JvbGxiYXJTdGF0ZXMgfSBmcm9tICcuL2VudW1zJztcclxuXHJcbi8qKlxyXG4gKiBTY3JvbGxCYXIgY29tcG9uZW50LlxyXG4gKiBNYXhpbXVtIHBlcmZvcm1hbmNlIGZvciBleHRyZW1lbHkgbGFyZ2UgbGlzdHMuXHJcbiAqIEl0IGlzIGJhc2VkIG9uIGFsZ29yaXRobXMgZm9yIHZpcnR1YWxpemF0aW9uIG9mIHNjcmVlbiBvYmplY3RzLlxyXG4gKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vRGpvbm55WC9uZy12aXJ0dWFsLWxpc3QvYmxvYi8xOC54L3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL2NvbXBvbmVudHMvbmctc2Nyb2xsLWJhci9uZy1zY3JvbGwtYmFyLmNvbXBvbmVudC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgQWxleGFuZHJvdmljaCBHcmViZW5uaWtvdlxyXG4gKiBAZW1haWwgZGpvbm55eEBnbWFpbC5jb21cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmctc2Nyb2xsLWJhcicsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7IHByb3ZpZGU6IFNDUk9MTF9WSUVXX0lOVkVSU0lPTiwgdXNlVmFsdWU6IHRydWUgfSxcclxuICAgIHsgcHJvdmlkZTogU0NST0xMX1ZJRVdfTk9STUFMSVpFX1ZBTFVFX0ZST01fWkVSTywgdXNlVmFsdWU6IGZhbHNlIH0sXHJcbiAgICBOZ1Njcm9sbEJhclNlcnZpY2UsXHJcbiAgICBOZ1Njcm9sbEJhclB1YmxpY1NlcnZpY2UsXHJcbiAgXSxcclxuICBzdGFuZGFsb25lOiBmYWxzZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmctc2Nyb2xsLWJhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL25nLXNjcm9sbC1iYXIuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ1Njcm9sbEJhckNvbXBvbmVudCBleHRlbmRzIE5nU2Nyb2xsVmlldyB7XHJcbiAgcHJvdGVjdGVkIF9kZWZhdWx0UmVuZGVyZXIgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8YW55Pj4oJ2RlZmF1bHRSZW5kZXJlcicpO1xyXG5cclxuICBwcm90ZWN0ZWQgX3NlcnZpY2UgPSBpbmplY3QoTmdTY3JvbGxCYXJTZXJ2aWNlKTtcclxuXHJcbiAgcHJpdmF0ZSBfYXBpU2VydmljZSA9IGluamVjdChOZ1Njcm9sbEJhclB1YmxpY1NlcnZpY2UpO1xyXG5cclxuICByZWFkb25seSBsb2FkaW5nID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICByZWFkb25seSBvbkRyYWcgPSBvdXRwdXQ8SVNjcm9sbEJhckRyYWdFdmVudD4oKTtcclxuXHJcbiAgcmVhZG9ubHkgb25EcmFnRW5kID0gb3V0cHV0PElTY3JvbGxCYXJEcmFnRXZlbnQ+KCk7XHJcblxyXG4gIHJlYWRvbmx5IHRodW1iR3JhZGllbnRQb3NpdGlvbnMgPSBpbnB1dDxHcmFkaWVudENvbG9yUG9zaXRpb25zPihbMCwgMF0pO1xyXG5cclxuICByZWFkb25seSBzaXplID0gaW5wdXQ8bnVtYmVyPihERUZBVUxUX1NJWkUpO1xyXG5cclxuICByZWFkb25seSB0aGlja25lc3MgPSBpbnB1dDxudW1iZXI+KERFRkFVTFRfVEhJQ0tORVNTKTtcclxuXHJcbiAgcmVhZG9ubHkgc2Nyb2xsYmFyTWluU2l6ZSA9IGlucHV0PG51bWJlcj4oMCk7XHJcblxyXG4gIHJlYWRvbmx5IHByZXBhcmVkID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICByZWFkb25seSBpbnRlcmFjdGl2ZSA9IGlucHV0PGJvb2xlYW4+KERFRkFVTFRfU0NST0xMQkFSX0lOVEVSQUNUSVZFKTtcclxuXHJcbiAgcmVhZG9ubHkgc2hvdyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgcmVhZG9ubHkgcGFyYW1zID0gaW5wdXQ8eyBbcHJvcE5hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbD4oe30pO1xyXG5cclxuICByZWFkb25seSByZW5kZXJlciA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPihudWxsKTtcclxuXHJcbiAgcmVhZG9ubHkgdGh1bWJSZW5kZXJlciA9IHNpZ25hbDxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4odGhpcy5fZGVmYXVsdFJlbmRlcmVyKCkgPz8gbnVsbCk7XHJcblxyXG4gIHByb3RlY3RlZCByZWFkb25seSBob3ZlclN0YXRlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXNzZWRTdGF0ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wbGF0ZUNvbnRleHQhOiBTaWduYWw8SVNjcm9sbEJhclRlbXBsYXRlQ29udGV4dD47XHJcblxyXG4gIHByb3RlY3RlZCByZWFkb25seSBzdHlsZXM6IFNpZ25hbDx7IFtzTmFtZTogc3RyaW5nXTogYW55IH0+O1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGh1bWJXaWR0aDogU2lnbmFsPG51bWJlcj47XHJcblxyXG4gIHByb3RlY3RlZCByZWFkb25seSB0aHVtYkhlaWdodDogU2lnbmFsPG51bWJlcj47XHJcblxyXG4gIHByaXZhdGUgXyRzY3JvbGxpbmdDYW5jZWwgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc2Nyb2xsaW5nQ2FuY2VsID0gdGhpcy5fJHNjcm9sbGluZ0NhbmNlbC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMudGVtcGxhdGVDb250ZXh0ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb250ZXh0OiBJU2Nyb2xsQmFyVGVtcGxhdGVDb250ZXh0ID0ge1xyXG4gICAgICAgIGFwaTogdGhpcy5fYXBpU2VydmljZSxcclxuICAgICAgICB3aWR0aDogdGhpcy50aHVtYldpZHRoKCksXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLnRodW1iSGVpZ2h0KCksXHJcbiAgICAgICAgZmlsbFBvc2l0aW9uczogdGhpcy50aHVtYkdyYWRpZW50UG9zaXRpb25zKCksXHJcbiAgICAgICAgcGFyYW1zOiB0aGlzLnBhcmFtcygpID8/IHt9LFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gY29udGV4dDtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0ICRyZW5kZXJlciA9IHRvT2JzZXJ2YWJsZSh0aGlzLnJlbmRlcmVyKS5waXBlKFxyXG4gICAgICAgIHN0YXJ0V2l0aChudWxsKSxcclxuICAgICAgKSxcclxuICAgICAgJGRlZmF1bHRSZW5kZXJlciA9IHRvT2JzZXJ2YWJsZSh0aGlzLl9kZWZhdWx0UmVuZGVyZXIpO1xyXG5cclxuICAgIGNvbWJpbmVMYXRlc3QoWyRyZW5kZXJlciwgJGRlZmF1bHRSZW5kZXJlcl0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxyXG4gICAgICBzd2l0Y2hNYXAoKFtyZW5kZXJlciwgZGVmYXVsdFJlbmRlcmVyXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBvZigocmVuZGVyZXIgPz8gZGVmYXVsdFJlbmRlcmVyKSA/PyBudWxsKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLnRodW1iUmVuZGVyZXIuc2V0KHYpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJHByZXBhcmVkID0gdG9PYnNlcnZhYmxlKHRoaXMucHJlcGFyZWQpO1xyXG4gICAgJHByZXBhcmVkLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxyXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsTGltaXRzKCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoWCh0aGlzLl94KTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hZKHRoaXMuX3kpO1xyXG4gICAgICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KGZhbHNlKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMudGh1bWJXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaXNWZXJ0aWNhbCgpID8gdGhpcy50aGlja25lc3MoKSA6IHRoaXMuc2l6ZSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy50aHVtYkhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaXNWZXJ0aWNhbCgpID8gdGhpcy5zaXplKCkgOiB0aGlzLnRoaWNrbmVzcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgJHBvaW50ZXJEb3duID0gZnJvbUV2ZW50PFBvaW50ZXJFdmVudD4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAncG9pbnRlcmRvd24nKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICksICRwb2ludGVyVXAgPSBmcm9tRXZlbnQ8UG9pbnRlckV2ZW50Pih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdwb2ludGVydXAnKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICksICRkb2NQb2ludGVyVXAgPSBmcm9tRXZlbnQ8UG9pbnRlckV2ZW50Pihkb2N1bWVudCwgJ3BvaW50ZXJ1cCcpLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXHJcbiAgICApLCAkcG9pbnRlckVudGVyID0gZnJvbUV2ZW50PFBvaW50ZXJFdmVudD4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAncG9pbnRlcmVudGVyJykucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICApLCAkcG9pbnRlckxlYXZlID0gZnJvbUV2ZW50PFBvaW50ZXJFdmVudD4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAncG9pbnRlcmxlYXZlJykucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICApO1xyXG5cclxuICAgICRwb2ludGVyRG93bi5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgIHRoaXMucHJlc3NlZFN0YXRlLnNldCh0aGlzLnRodW1iSGl0KGUuY2xpZW50WCwgZS5jbGllbnRZKSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFskZG9jUG9pbnRlclVwLCAkcG9pbnRlclVwXSkucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wcmVzc2VkU3RhdGUuc2V0KGZhbHNlKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICRwb2ludGVyRW50ZXIucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ob3ZlclN0YXRlLnNldCh0cnVlKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICRwb2ludGVyTGVhdmUucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ob3ZlclN0YXRlLnNldChmYWxzZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICBjb25zdCBwcmVzc2VkID0gdGhpcy5wcmVzc2VkU3RhdGUoKSwgaG92ZXIgPSB0aGlzLmhvdmVyU3RhdGUoKTtcclxuICAgICAgaWYgKHByZXNzZWQpIHtcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLnN0YXRlID0gU2Nyb2xsYmFyU3RhdGVzLlBSRVNTRUQ7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKGhvdmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5zdGF0ZSA9IFNjcm9sbGJhclN0YXRlcy5IT1ZFUjtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fc2VydmljZS5zdGF0ZSA9IFNjcm9sbGJhclN0YXRlcy5OT1JNQUw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XHJcblxyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgdGhpcy50b3RhbFNpemUgPSB0aGlzLnNpemUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2ludGVyYWN0aXZlID0gdGhpcy5pbnRlcmFjdGl2ZSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdHlsZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNob3cgPSB0aGlzLnNob3coKSwgc2l6ZVByb3BOYW1lID0gdGhpcy5pc1ZlcnRpY2FsKCkgPyBXSURUSCA6IEhFSUdIVDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbc2l6ZVByb3BOYW1lXTogYCR7c2hvdyA/IHRoaXMudGhpY2tuZXNzKCkgOiAwfSR7UFh9YCxcclxuICAgICAgICBbT1BBQ0lUWV06IHNob3cgPyBPUEFDSVRZXzEgOiBPUEFDSVRZXzAsIFtUUkFOU0lUSU9OXTogc2hvdyA/IFRSQU5TSVRJT05fRkFERV9JTiA6IE5PTkUsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLiRzY3JvbGwucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuY3JlYXRlRHJhZ0V2ZW50KHYpO1xyXG4gICAgICAgIGlmICghIWV2ZW50KSB7XHJcbiAgICAgICAgICB0aGlzLm9uRHJhZy5lbWl0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkc2Nyb2xsRW5kID0gdGhpcy4kc2Nyb2xsRW5kO1xyXG4gICAgJHNjcm9sbEVuZC5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuY3JlYXRlRHJhZ0V2ZW50KGZhbHNlKTtcclxuICAgICAgICBpZiAoISFldmVudCkge1xyXG4gICAgICAgICAgdGhpcy5vbkRyYWdFbmQuZW1pdChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURyYWdFdmVudCh1c2VyQWN0aW9uOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5pc1ZlcnRpY2FsKCksIHNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICBzY3JvbGxDb250ZW50ID0gdGhpcy5zY3JvbGxDb250ZW50KCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsXHJcbiAgICAgIHNjcm9sbFZpZXdwb3J0ID0gdGhpcy5zY3JvbGxWaWV3cG9ydCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50O1xyXG4gICAgaWYgKCEhc2Nyb2xsVmlld3BvcnQgJiYgISFzY3JvbGxDb250ZW50KSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnRTaXplID0gaXNWZXJ0aWNhbCA/IHNjcm9sbENvbnRlbnQub2Zmc2V0SGVpZ2h0IDogc2Nyb2xsQ29udGVudC5vZmZzZXRXaWR0aCxcclxuICAgICAgICB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gc2Nyb2xsVmlld3BvcnQub2Zmc2V0SGVpZ2h0IDogc2Nyb2xsVmlld3BvcnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGNvbnN0IGV2ZW50OiBJU2Nyb2xsQmFyRHJhZ0V2ZW50ID0ge1xyXG4gICAgICAgIHBvc2l0aW9uOiBzY3JvbGxTaXplICE9PSAwID8gKChpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3gpIC8gc2Nyb2xsU2l6ZSkgOiAwLFxyXG4gICAgICAgIG1pbjogc2Nyb2xsU2l6ZSAhPT0gMCA/ICh0aGlzLnN0YXJ0T2Zmc2V0KCkgLyBzY3JvbGxTaXplKSA6IDAsXHJcbiAgICAgICAgbWF4OiBzY3JvbGxTaXplICE9PSAwID8gKCh2aWV3cG9ydFNpemUgLSB0aGlzLmVuZE9mZnNldCgpIC0gY29udGVudFNpemUpIC8gc2Nyb2xsU2l6ZSkgOiAwLFxyXG4gICAgICAgIGFuaW1hdGlvbjogIXRoaXMuX2lzTW92aW5nLFxyXG4gICAgICAgIHVzZXJBY3Rpb24sXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBldmVudDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0aHVtYkhpdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdGh1bWIgPSB0aGlzLnNjcm9sbENvbnRlbnQoKT8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICghIXRodW1iKSB7XHJcbiAgICAgIGNvbnN0IHsgeDogdFgsIHk6IHRZLCB3aWR0aDogdFdpZHRoLCBoZWlnaHQ6IHRIZWlnaHQgfSA9IHRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcbiAgICAgIGlmICgoeCA+PSB0WCAmJiB4IDw9IHRYICsgdFdpZHRoKSAmJiAoeSA+PSB0WSAmJiB5IDw9IHRZICsgdEhlaWdodCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgY2xpY2soZXZlbnQ6IFBvaW50ZXJFdmVudCB8IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuX3NlcnZpY2UuY2xpY2soZXZlbnQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICNzY3JvbGxWaWV3cG9ydCBjbGFzcz1cInRyYWNrXCIgcGFydD1cInNjcm9sbGJhci10cmFja1wiIFtuZ1N0eWxlXT1cInN0eWxlcygpXCIgW25nQ2xhc3NdPVwie2dyYWJiaW5nOiBncmFiYmluZygpfVwiPlxyXG4gICAgPGRpdiAjc2Nyb2xsQ29udGVudCBjbGFzcz1cInRodW1iXCIgcGFydD1cInNjcm9sbGJhci10aHVtYlwiIFtjbGFzcy5ob3Jpem9udGFsXT1cIiFpc1ZlcnRpY2FsKClcIlxyXG4gICAgICAgIChwb2ludGVyZG93bik9XCJjbGljaygkZXZlbnQpXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aHVtYlJlbmRlcmVyKClcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwidGVtcGxhdGVDb250ZXh0KClcIiAvPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0UmVuZGVyZXIgbGV0LWFwaT1cImFwaVwiIGxldC13aWR0aD1cIndpZHRoXCIgbGV0LWhlaWdodD1cImhlaWdodFwiIGxldC1maWxsUG9zaXRpb25zPVwiZmlsbFBvc2l0aW9uc1wiXHJcbiAgICBsZXQtcGFyYW1zPVwicGFyYW1zXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hhcGVcIiBwYXJ0PVwic2Nyb2xsYmFyLXRodW1iX19zaGFwZVwiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0XCI+PC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
291
+ ], standalone: false, template: "<div #scrollViewport class=\"track\" part=\"scrollbar-track\" [ngStyle]=\"$styles | async\"\r\n [ngClass]=\"{grabbing: $grabbing | async}\">\r\n <div #scrollContent class=\"thumb\" part=\"scrollbar-thumb\" [class.horizontal]=\"($isVertical | async)! == false\"\r\n (pointerdown)=\"click($event)\">\r\n <ng-container [ngTemplateOutlet]=\"($thumbRenderer | async)!\"\r\n [ngTemplateOutletContext]=\"($templateContext | async)!\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultRenderer let-api=\"api\" let-width=\"width\" let-height=\"height\" let-fillPositions=\"fillPositions\"\r\n let-params=\"params\">\r\n <div class=\"shape\" part=\"scrollbar-thumb__shape\" [style.width.px]=\"width\" [style.height.px]=\"height\"></div>\r\n</ng-template>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none;width:100%;height:100%}.track{position:relative;overflow:hidden;width:100%;height:100%;cursor:grab}.track.grabbing{cursor:grabbing}.track .thumb{display:block;position:absolute;list-style:none;padding:0;margin:0;overflow:hidden}.track .thumb.prepared{overflow:hidden}.track .thumb.horizontal{top:0}.track .thumb .shape{box-sizing:border-box;pointer-events:none;background-color:#818181;border-radius:0;overflow:hidden}.track.grabbing .thumb{cursor:grabbing}\n"] }]
292
+ }], ctorParameters: () => [], propDecorators: { _defaultRenderer: [{
293
+ type: ViewChild,
294
+ args: ['defaultRenderer', { read: (TemplateRef) }]
295
+ }], loading: [{
296
+ type: Input
297
+ }], onDrag: [{
298
+ type: Output
299
+ }], onDragEnd: [{
300
+ type: Output
301
+ }], thumbGradientPositions: [{
302
+ type: Input
303
+ }], size: [{
304
+ type: Input
305
+ }], thickness: [{
306
+ type: Input
307
+ }], scrollbarMinSize: [{
308
+ type: Input
309
+ }], prepared: [{
310
+ type: Input
311
+ }], langTextDir: [{
312
+ type: Input
313
+ }], interactive: [{
314
+ type: Input
315
+ }], overlapping: [{
316
+ type: Input
317
+ }], show: [{
318
+ type: Input
319
+ }], params: [{
320
+ type: Input
321
+ }], renderer: [{
322
+ type: Input
323
+ }] } });
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9jb21wb25lbnRzL25nLXNjcm9sbC1iYXIvbmctc2Nyb2xsLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9jb21wb25lbnRzL25nLXNjcm9sbC1iYXIvbmctc2Nyb2xsLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoSyxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFeEUsT0FBTyxFQUNMLHFCQUFxQixFQUFFLDZCQUE2QixFQUFFLDZCQUE2QixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQ3RILGlCQUFpQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsS0FBSyxHQUM3RCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsa0NBQWtDLEVBQ2xDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxVQUFV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QUFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO3dCQUM1RCxrQkFBa0I7d0JBQ2xCLHdCQUF3QjtxQkFDekIsY0FDVyxLQUFLO3dEQU1QLGdCQUFnQjtzQkFEekIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFBLFdBQWdCLENBQUEsRUFBRTtnQkFXcEQsT0FBTztzQkFEVixLQUFLO2dCQU9OLE1BQU07c0JBREwsTUFBTTtnQkFJUCxTQUFTO3NCQURSLE1BQU07Z0JBT0gsc0JBQXNCO3NCQUR6QixLQUFLO2dCQVlGLElBQUk7c0JBRFAsS0FBSztnQkFZRixTQUFTO3NCQURaLEtBQUs7Z0JBWUYsZ0JBQWdCO3NCQURuQixLQUFLO2dCQVlGLFFBQVE7c0JBRFgsS0FBSztnQkFZRixXQUFXO3NCQURkLEtBQUs7Z0JBWUYsV0FBVztzQkFEZCxLQUFLO2dCQVlGLFdBQVc7c0JBRGQsS0FBSztnQkFZRixJQUFJO3NCQURQLEtBQUs7Z0JBWUYsTUFBTTtzQkFEVCxLQUFLO2dCQVlGLFFBQVE7c0JBRFgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIGZyb21FdmVudCwgb2YsIHN0YXJ0V2l0aCwgU3ViamVjdCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBHcmFkaWVudENvbG9yUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvZ3JhZGllbnQtY29sb3ItcG9zaXRpb25zJztcclxuaW1wb3J0IHsgTmdTY3JvbGxWaWV3LCBTQ1JPTExfVklFV19JTlZFUlNJT04gfSBmcm9tICcuLi9uZy1zY3JvbGwtdmlldyc7XHJcbmltcG9ydCB7IElTY3JvbGxCYXJEcmFnRXZlbnQsIElTY3JvbGxCYXJUZW1wbGF0ZUNvbnRleHQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQge1xyXG4gIERFRkFVTFRfTEFOR19URVhUX0RJUiwgREVGQVVMVF9PVkVSTEFQUElOR19TQ1JPTExCQVIsIERFRkFVTFRfU0NST0xMQkFSX0lOVEVSQUNUSVZFLCBMRUZULCBQT1NJVElPTiwgUE9TSVRJT05fQUJTT0xVVEUsXHJcbiAgUE9TSVRJT05fUkVMQVRJVkUsIFJJR0hULCBTSVpFXzEwMF9QRVJTRU5ULCBTSVpFX0FVVE8sIFVOU0VULFxyXG59IGZyb20gJy4uLy4uL2NvbnN0JztcclxuaW1wb3J0IHtcclxuICBERUZBVUxUX1NDUk9MTEJBUl9URU1QTEFURV9DT05URVhULFxyXG4gIERFRkFVTFRfU0laRSwgREVGQVVMVF9USElDS05FU1MsIEhFSUdIVCwgTk9ORSwgT1BBQ0lUWSwgT1BBQ0lUWV8wLCBPUEFDSVRZXzEsIFBYLCBUUkFOU0lUSU9OLCBUUkFOU0lUSU9OX0ZBREVfSU4sIFdJRFRILFxyXG59IGZyb20gJy4vY29uc3QnO1xyXG5pbXBvcnQgeyBTQ1JPTExfVklFV19OT1JNQUxJWkVfVkFMVUVfRlJPTV9aRVJPLCBTQ1JPTExfVklFV19PVkVSU0NST0xMX0VOQUJMRUQgfSBmcm9tICcuLi9uZy1zY3JvbGwtdmlldy9jb25zdCc7XHJcbmltcG9ydCB7IE5nU2Nyb2xsQmFyU2VydmljZSB9IGZyb20gJy4vbmctc2Nyb2xsLWJhci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmdTY3JvbGxCYXJQdWJsaWNTZXJ2aWNlIH0gZnJvbSAnLi9uZy1zY3JvbGwtYmFyLXB1YmxpYy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2Nyb2xsYmFyU3RhdGVzIH0gZnJvbSAnLi9lbnVtcyc7XHJcbmltcG9ydCB7IFRleHREaXJlY3Rpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XHJcbmltcG9ydCB7IFRleHREaXJlY3Rpb25zIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xyXG5cclxuLyoqXHJcbiAqIFNjcm9sbEJhciBjb21wb25lbnQuXHJcbiAqIE1heGltdW0gcGVyZm9ybWFuY2UgZm9yIGV4dHJlbWVseSBsYXJnZSBsaXN0cy5cclxuICogSXQgaXMgYmFzZWQgb24gYWxnb3JpdGhtcyBmb3IgdmlydHVhbGl6YXRpb24gb2Ygc2NyZWVuIG9iamVjdHMuXHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iLzE4LngvcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtYmFyL25nLXNjcm9sbC1iYXIuY29tcG9uZW50LnRzXHJcbiAqIEBhdXRob3IgRXZnZW5paSBBbGV4YW5kcm92aWNoIEdyZWJlbm5pa292XHJcbiAqIEBlbWFpbCBkam9ubnl4QGdtYWlsLmNvbVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZy1zY3JvbGwtYmFyJyxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHsgcHJvdmlkZTogU0NST0xMX1ZJRVdfSU5WRVJTSU9OLCB1c2VWYWx1ZTogdHJ1ZSB9LFxyXG4gICAgeyBwcm92aWRlOiBTQ1JPTExfVklFV19OT1JNQUxJWkVfVkFMVUVfRlJPTV9aRVJPLCB1c2VWYWx1ZTogZmFsc2UgfSxcclxuICAgIHsgcHJvdmlkZTogU0NST0xMX1ZJRVdfT1ZFUlNDUk9MTF9FTkFCTEVELCB1c2VWYWx1ZTogZmFsc2UgfSxcclxuICAgIE5nU2Nyb2xsQmFyU2VydmljZSxcclxuICAgIE5nU2Nyb2xsQmFyUHVibGljU2VydmljZSxcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1zY3JvbGwtYmFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uZy1zY3JvbGwtYmFyLmNvbXBvbmVudC5zY3NzJyxdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ1Njcm9sbEJhckNvbXBvbmVudCBleHRlbmRzIE5nU2Nyb2xsVmlldyB7XHJcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdFJlbmRlcmVyJywgeyByZWFkOiBUZW1wbGF0ZVJlZjxhbnk+IH0pXHJcbiAgcHJvdGVjdGVkIF9kZWZhdWx0UmVuZGVyZXI6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBfc2Nyb2xsQmFyU2VydmljZSA9IGluamVjdChOZ1Njcm9sbEJhclNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIF9hcGlTZXJ2aWNlID0gaW5qZWN0KE5nU2Nyb2xsQmFyUHVibGljU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgXyRsb2FkaW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgcmVhZG9ubHkgJGxvYWRpbmcgPSB0aGlzLl8kbG9hZGluZy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgbG9hZGluZyh2OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl8kbG9hZGluZy5uZXh0KHYpO1xyXG4gIH1cclxuICBnZXQgbG9hZGluZygpIHsgcmV0dXJuIHRoaXMuXyRsb2FkaW5nLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgb25EcmFnID0gbmV3IEV2ZW50RW1pdHRlcjxJU2Nyb2xsQmFyRHJhZ0V2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBvbkRyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElTY3JvbGxCYXJEcmFnRXZlbnQ+KCk7XHJcblxyXG4gIHByaXZhdGUgXyR0aHVtYkdyYWRpZW50UG9zaXRpb25zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxHcmFkaWVudENvbG9yUG9zaXRpb25zPihbMCwgMF0pO1xyXG4gIHJlYWRvbmx5ICR0aHVtYkdyYWRpZW50UG9zaXRpb25zID0gdGhpcy5fJHRodW1iR3JhZGllbnRQb3NpdGlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHRodW1iR3JhZGllbnRQb3NpdGlvbnModjogR3JhZGllbnRDb2xvclBvc2l0aW9ucykge1xyXG4gICAgaWYgKHRoaXMuXyR0aHVtYkdyYWRpZW50UG9zaXRpb25zLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgdGhpcy5fJHRodW1iR3JhZGllbnRQb3NpdGlvbnMubmV4dCh2KTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IHRodW1iR3JhZGllbnRQb3NpdGlvbnMoKSB7IHJldHVybiB0aGlzLl8kdGh1bWJHcmFkaWVudFBvc2l0aW9ucy5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRzaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KERFRkFVTFRfU0laRSk7XHJcbiAgcmVhZG9ubHkgJHNpemUgPSB0aGlzLl8kc2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc2l6ZSh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kc2l6ZS5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRzaXplLm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzaXplKCkgeyByZXR1cm4gdGhpcy5fJHNpemUuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kdGhpY2tuZXNzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KERFRkFVTFRfVEhJQ0tORVNTKTtcclxuICByZWFkb25seSAkdGhpY2tuZXNzID0gdGhpcy5fJHRoaWNrbmVzcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgdGhpY2tuZXNzKHY6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuXyR0aGlja25lc3MuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICB0aGlzLl8kdGhpY2tuZXNzLm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCB0aGlja25lc3MoKSB7IHJldHVybiB0aGlzLl8kdGhpY2tuZXNzLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbGJhck1pblNpemUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcbiAgcmVhZG9ubHkgJHNjcm9sbGJhck1pblNpemUgPSB0aGlzLl8kc2Nyb2xsYmFyTWluU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsYmFyTWluU2l6ZSh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kc2Nyb2xsYmFyTWluU2l6ZS5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRzY3JvbGxiYXJNaW5TaXplLm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzY3JvbGxiYXJNaW5TaXplKCkgeyByZXR1cm4gdGhpcy5fJGVuZE9mZnNldC5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRwcmVwYXJlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHJlYWRvbmx5ICRwcmVwYXJlZCA9IHRoaXMuXyRwcmVwYXJlZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgcHJlcGFyZWQodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRwcmVwYXJlZC5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRwcmVwYXJlZC5uZXh0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgcHJlcGFyZWQoKSB7IHJldHVybiB0aGlzLl8kcHJlcGFyZWQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kbGFuZ1RleHREaXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRleHREaXJlY3Rpb24+KERFRkFVTFRfTEFOR19URVhUX0RJUik7XHJcbiAgcmVhZG9ubHkgJGxhbmdUZXh0RGlyID0gdGhpcy5fJGxhbmdUZXh0RGlyLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBsYW5nVGV4dERpcih2OiBUZXh0RGlyZWN0aW9uKSB7XHJcbiAgICBpZiAodGhpcy5fJGxhbmdUZXh0RGlyLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgdGhpcy5fJGxhbmdUZXh0RGlyLm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBsYW5nVGV4dERpcigpIHsgcmV0dXJuIHRoaXMuXyRsYW5nVGV4dERpci5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRpbnRlcmFjdGl2ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9TQ1JPTExCQVJfSU5URVJBQ1RJVkUpO1xyXG4gIHJlYWRvbmx5ICRpbnRlcmFjdGl2ZSA9IHRoaXMuXyRpbnRlcmFjdGl2ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgaW50ZXJhY3RpdmUodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRpbnRlcmFjdGl2ZS5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRpbnRlcmFjdGl2ZS5uZXh0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgaW50ZXJhY3RpdmUoKSB7IHJldHVybiB0aGlzLl8kaW50ZXJhY3RpdmUuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kb3ZlcmxhcHBpbmcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfT1ZFUkxBUFBJTkdfU0NST0xMQkFSKTtcclxuICByZWFkb25seSAkb3ZlcmxhcHBpbmcgPSB0aGlzLl8kb3ZlcmxhcHBpbmcuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG92ZXJsYXBwaW5nKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kb3ZlcmxhcHBpbmcuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICB0aGlzLl8kb3ZlcmxhcHBpbmcubmV4dCh2KTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IG92ZXJsYXBwaW5nKCkgeyByZXR1cm4gdGhpcy5fJG92ZXJsYXBwaW5nLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNob3cgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICByZWFkb25seSAkc2hvdyA9IHRoaXMuXyRzaG93LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBzaG93KHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kc2hvdy5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRzaG93Lm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzaG93KCkgeyByZXR1cm4gdGhpcy5fJHNob3cuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kcGFyYW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtwcm9wTmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsPih7fSk7XHJcbiAgcmVhZG9ubHkgJHBhcmFtcyA9IHRoaXMuXyRwYXJhbXMuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHBhcmFtcyh2OiB7IFtwcm9wTmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsKSB7XHJcbiAgICBpZiAodGhpcy5fJHBhcmFtcy5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRwYXJhbXMubmV4dCh2KTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IHBhcmFtcygpIHsgcmV0dXJuIHRoaXMuXyRwYXJhbXMuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kcmVuZGVyZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPihudWxsKTtcclxuICByZWFkb25seSAkcmVuZGVyZXIgPSB0aGlzLl8kcmVuZGVyZXIuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHJlbmRlcmVyKHY6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsKSB7XHJcbiAgICBpZiAodGhpcy5fJHJlbmRlcmVyLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgdGhpcy5fJHJlbmRlcmVyLm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCByZW5kZXJlcigpIHsgcmV0dXJuIHRoaXMuXyRyZW5kZXJlci5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyR0aHVtYlJlbmRlcmVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4odGhpcy5fZGVmYXVsdFJlbmRlcmVyID8/IG51bGwpO1xyXG4gIHJlYWRvbmx5ICR0aHVtYlJlbmRlcmVyID0gdGhpcy5fJHRodW1iUmVuZGVyZXIuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRob3ZlclN0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgcmVhZG9ubHkgJGhvdmVyU3RhdGUgPSB0aGlzLl8kaG92ZXJTdGF0ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJHByZXNzZWRTdGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHJlYWRvbmx5ICRwcmVzc2VkU3RhdGUgPSB0aGlzLl8kcHJlc3NlZFN0YXRlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kdGVtcGxhdGVDb250ZXh0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJU2Nyb2xsQmFyVGVtcGxhdGVDb250ZXh0PihERUZBVUxUX1NDUk9MTEJBUl9URU1QTEFURV9DT05URVhUKTtcclxuICByZWFkb25seSAkdGVtcGxhdGVDb250ZXh0ID0gdGhpcy5fJHRlbXBsYXRlQ29udGV4dC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJHN0eWxlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBbc3R5bGVOYW1lOiBzdHJpbmddOiBhbnkgfT4oe30pO1xyXG4gIHJlYWRvbmx5ICRzdHlsZXMgPSB0aGlzLl8kc3R5bGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kdGh1bWJXaWR0aCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuICByZWFkb25seSAkdGh1bWJXaWR0aCA9IHRoaXMuXyR0aHVtYldpZHRoLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kdGh1bWJIZWlnaHQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcbiAgcmVhZG9ubHkgJHRodW1iSGVpZ2h0ID0gdGhpcy5fJHRodW1iSGVpZ2h0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsaW5nQ2FuY2VsID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHNjcm9sbGluZ0NhbmNlbCA9IHRoaXMuXyRzY3JvbGxpbmdDYW5jZWwuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2VsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICBjb25zdCAkdGh1bWJXaWR0aCA9IHRoaXMuJHRodW1iV2lkdGgsXHJcbiAgICAgICR0aHVtYkhlaWdodCA9IHRoaXMuJHRodW1iSGVpZ2h0LFxyXG4gICAgICAkdGh1bWJHcmFkaWVudFBvc2l0aW9ucyA9IHRoaXMuJHRodW1iR3JhZGllbnRQb3NpdGlvbnMsXHJcbiAgICAgICRwYXJhbXMgPSB0aGlzLiRwYXJhbXM7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbJHRodW1iV2lkdGgsICR0aHVtYkhlaWdodCwgJHRodW1iR3JhZGllbnRQb3NpdGlvbnMsICRwYXJhbXNdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDApLFxyXG4gICAgICB0YXAoKFt0aHVtYldpZHRoLCB0aHVtYkhlaWdodCwgdGh1bWJHcmFkaWVudFBvc2l0aW9ucywgcGFyYW1zXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IElTY3JvbGxCYXJUZW1wbGF0ZUNvbnRleHQgPSB7XHJcbiAgICAgICAgICBhcGk6IHRoaXMuX2FwaVNlcnZpY2UsXHJcbiAgICAgICAgICB3aWR0aDogdGh1bWJXaWR0aCxcclxuICAgICAgICAgIGhlaWdodDogdGh1bWJIZWlnaHQsXHJcbiAgICAgICAgICBmaWxsUG9zaXRpb25zOiB0aHVtYkdyYWRpZW50UG9zaXRpb25zLFxyXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMgPz8ge30sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl8kdGVtcGxhdGVDb250ZXh0Lm5leHQoY29udGV4dCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkcmVuZGVyZXIgPSB0aGlzLiRyZW5kZXJlci5waXBlKFxyXG4gICAgICBzdGFydFdpdGgobnVsbCksXHJcbiAgICApLFxyXG4gICAgICAkZGVmYXVsdFJlbmRlcmVyID0gb2YodGhpcy5fZGVmYXVsdFJlbmRlcmVyKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFskcmVuZGVyZXIsICRkZWZhdWx0UmVuZGVyZXJdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgc3dpdGNoTWFwKChbcmVuZGVyZXIsIGRlZmF1bHRSZW5kZXJlcl0pID0+IHtcclxuICAgICAgICByZXR1cm4gb2YoKHJlbmRlcmVyID8/IGRlZmF1bHRSZW5kZXJlcikgPz8gbnVsbCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMCksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl8kdGh1bWJSZW5kZXJlci5uZXh0KHYpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJHByZXBhcmVkID0gdGhpcy4kcHJlcGFyZWQ7XHJcbiAgICAkcHJlcGFyZWQucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxMaW1pdHMoKTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHRoaXMuX3gsIHRoaXMuX3kpO1xyXG4gICAgICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KGZhbHNlKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuJGlzVmVydGljYWwsIHRoaXMuJHRoaWNrbmVzcywgdGhpcy4kc2l6ZV0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YXAoKFtpc1ZlcnRpY2FsLCB0aGlja25lc3MsIHNpemVdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fJHRodW1iV2lkdGgubmV4dChpc1ZlcnRpY2FsID8gdGhpY2tuZXNzIDogc2l6ZSk7XHJcbiAgICAgICAgdGhpcy5fJHRodW1iSGVpZ2h0Lm5leHQoaXNWZXJ0aWNhbCA/IHNpemUgOiB0aGlja25lc3MpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcclxuXHJcbiAgICBjb25zdCAkd2hlZWwgPSB0aGlzLiR3aGVlbDtcclxuICAgICR3aGVlbC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmNyZWF0ZURyYWdFdmVudCh0cnVlKTtcclxuICAgICAgICBpZiAoISFldmVudCkge1xyXG4gICAgICAgICAgdGhpcy5vbkRyYWdFbmQuZW1pdChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJHBvaW50ZXJEb3duID0gZnJvbUV2ZW50PFBvaW50ZXJFdmVudD4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAncG9pbnRlcmRvd24nKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICksICRwb2ludGVyVXAgPSBmcm9tRXZlbnQ8UG9pbnRlckV2ZW50Pih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdwb2ludGVydXAnKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICksICRkb2NQb2ludGVyVXAgPSBmcm9tRXZlbnQ8UG9pbnRlckV2ZW50Pihkb2N1bWVudCwgJ3BvaW50ZXJ1cCcpLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgKSwgJHBvaW50ZXJFbnRlciA9IGZyb21FdmVudDxQb2ludGVyRXZlbnQ+KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3BvaW50ZXJlbnRlcicpLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgKSwgJHBvaW50ZXJMZWF2ZSA9IGZyb21FdmVudDxQb2ludGVyRXZlbnQ+KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3BvaW50ZXJsZWF2ZScpLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgKTtcclxuXHJcbiAgICAkcG9pbnRlckRvd24ucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcChlID0+IHtcclxuICAgICAgICB0aGlzLl8kcHJlc3NlZFN0YXRlLm5leHQodGhpcy50aHVtYkhpdChlLmNsaWVudFgsIGUuY2xpZW50WSkpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbJGRvY1BvaW50ZXJVcCwgJHBvaW50ZXJVcF0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRwcmVzc2VkU3RhdGUubmV4dChmYWxzZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkcG9pbnRlckVudGVyLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRob3ZlclN0YXRlLm5leHQodHJ1ZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkcG9pbnRlckxlYXZlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRob3ZlclN0YXRlLm5leHQoZmFsc2UpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJHByZXNzZWRTdGF0ZSA9IHRoaXMuJHByZXNzZWRTdGF0ZS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICksICRob3ZlclN0YXRlID0gdGhpcy4kaG92ZXJTdGF0ZS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbXHJcbiAgICAgICRwcmVzc2VkU3RhdGUsICRob3ZlclN0YXRlLFxyXG4gICAgXSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgdGFwKChbcHJlc3NlZCwgaG92ZXJdKSA9PiB7XHJcbiAgICAgICAgaWYgKHByZXNzZWQpIHtcclxuICAgICAgICAgIHRoaXMuX3Njcm9sbEJhclNlcnZpY2Uuc3RhdGUgPSBTY3JvbGxiYXJTdGF0ZXMuUFJFU1NFRDtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2UgaWYgKGhvdmVyKSB7XHJcbiAgICAgICAgICB0aGlzLl9zY3JvbGxCYXJTZXJ2aWNlLnN0YXRlID0gU2Nyb2xsYmFyU3RhdGVzLkhPVkVSO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9zY3JvbGxCYXJTZXJ2aWNlLnN0YXRlID0gU2Nyb2xsYmFyU3RhdGVzLk5PUk1BTDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLiRzaXplLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy50b3RhbFNpemUgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy4kaW50ZXJhY3RpdmUucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLmludGVyYWN0aXZlID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuJHNob3csIHRoaXMuJGlzVmVydGljYWwsIHRoaXMuJHRoaWNrbmVzc10pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YXAoKFtzaG93LCBpc1ZlcnRpY2FsLCB0aGlja25lc3NdKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZVByb3BOYW1lID0gaXNWZXJ0aWNhbCA/IFdJRFRIIDogSEVJR0hUO1xyXG4gICAgICAgIHRoaXMuXyRzdHlsZXMubmV4dCh7XHJcbiAgICAgICAgICBbc2l6ZVByb3BOYW1lXTogYCR7c2hvdyA/IHRoaWNrbmVzcyA6IDB9JHtQWH1gLFxyXG4gICAgICAgICAgW09QQUNJVFldOiBzaG93ID8gT1BBQ0lUWV8xIDogT1BBQ0lUWV8wLCBbVFJBTlNJVElPTl06IHNob3cgPyBUUkFOU0lUSU9OX0ZBREVfSU4gOiBOT05FLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJG92ZXJsYXBwaW5nID0gdGhpcy4kb3ZlcmxhcHBpbmcsICRsYW5nVGV4dERpciA9IHRoaXMuJGxhbmdUZXh0RGlyO1xyXG4gICAgY29tYmluZUxhdGVzdChbJG92ZXJsYXBwaW5nLCAkbGFuZ1RleHREaXJdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKChbb3ZlcmxhcHBpbmcsIGxhbmdUZXh0RGlyXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGlmICghIWVsKSB7XHJcbiAgICAgICAgICBlbC5zdHlsZVtQT1NJVElPTl0gPSBvdmVybGFwcGluZyA/IFBPU0lUSU9OX0FCU09MVVRFIDogUE9TSVRJT05fUkVMQVRJVkU7XHJcbiAgICAgICAgICBlbC5zdHlsZVtMRUZUXSA9IG92ZXJsYXBwaW5nICYmIGxhbmdUZXh0RGlyID09PSBUZXh0RGlyZWN0aW9ucy5SVEwgPyAnMCcgOiBVTlNFVDtcclxuICAgICAgICAgIGVsLnN0eWxlW1JJR0hUXSA9IG92ZXJsYXBwaW5nICYmIGxhbmdUZXh0RGlyID09PSBUZXh0RGlyZWN0aW9ucy5MVFIgPyAnMCcgOiBVTlNFVDtcclxuICAgICAgICAgIGVsLnN0eWxlW1dJRFRIXSA9IG92ZXJsYXBwaW5nID8gU0laRV9BVVRPIDogU0laRV8xMDBfUEVSU0VOVDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLiRzY3JvbGwucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuY3JlYXRlRHJhZ0V2ZW50KHYpO1xyXG4gICAgICAgIGlmICghIWV2ZW50KSB7XHJcbiAgICAgICAgICB0aGlzLm9uRHJhZy5lbWl0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkc2Nyb2xsRW5kID0gdGhpcy4kc2Nyb2xsRW5kO1xyXG4gICAgJHNjcm9sbEVuZC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHVzZXJBY3Rpb24gPT4ge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5jcmVhdGVEcmFnRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICAgICAgaWYgKCEhZXZlbnQpIHtcclxuICAgICAgICAgIHRoaXMub25EcmFnRW5kLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbnN0ICRyZW5kZXJlciA9IHRoaXMuJHJlbmRlcmVyLCAkZGVmYXVsdFJlbmRlcmVyID0gb2YodGhpcy5fZGVmYXVsdFJlbmRlcmVyKTtcclxuICAgIGNvbWJpbmVMYXRlc3QoWyRyZW5kZXJlciwgJGRlZmF1bHRSZW5kZXJlcl0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMCksXHJcbiAgICAgIHRhcCgoW3JlbmRlcmVyLCBkZWZhdWx0UmVuZGVyZXJdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fJHRodW1iUmVuZGVyZXIubmV4dChyZW5kZXJlciB8fCBkZWZhdWx0UmVuZGVyZXIgfHwgbnVsbCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRHJhZ0V2ZW50KHVzZXJBY3Rpb246IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLCBzY3JvbGxTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgc2Nyb2xsQ29udGVudCA9IHRoaXMuc2Nyb2xsQ29udGVudD8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCxcclxuICAgICAgc2Nyb2xsVmlld3BvcnQgPSB0aGlzLnNjcm9sbFZpZXdwb3J0Py5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50O1xyXG4gICAgaWYgKCEhc2Nyb2xsVmlld3BvcnQgJiYgISFzY3JvbGxDb250ZW50KSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnRTaXplID0gaXNWZXJ0aWNhbCA/IHNjcm9sbENvbnRlbnQub2Zmc2V0SGVpZ2h0IDogc2Nyb2xsQ29udGVudC5vZmZzZXRXaWR0aCxcclxuICAgICAgICB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gc2Nyb2xsVmlld3BvcnQub2Zmc2V0SGVpZ2h0IDogc2Nyb2xsVmlld3BvcnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGNvbnN0IGV2ZW50OiBJU2Nyb2xsQmFyRHJhZ0V2ZW50ID0ge1xyXG4gICAgICAgIHBvc2l0aW9uOiBzY3JvbGxTaXplICE9PSAwID8gKChpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3gpIC8gc2Nyb2xsU2l6ZSkgOiAwLFxyXG4gICAgICAgIG1pbjogc2Nyb2xsU2l6ZSAhPT0gMCA/ICh0aGlzLnN0YXJ0T2Zmc2V0IC8gc2Nyb2xsU2l6ZSkgOiAwLFxyXG4gICAgICAgIG1heDogc2Nyb2xsU2l6ZSAhPT0gMCA/ICgodmlld3BvcnRTaXplIC0gdGhpcy5lbmRPZmZzZXQgLSBjb250ZW50U2l6ZSkgLyBzY3JvbGxTaXplKSA6IDAsXHJcbiAgICAgICAgYW5pbWF0aW9uOiAhdGhpcy5faXNNb3ZpbmcsXHJcbiAgICAgICAgdXNlckFjdGlvbixcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIGV2ZW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRodW1iSGl0KHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0aHVtYiA9IHRoaXMuc2Nyb2xsQ29udGVudD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICghIXRodW1iKSB7XHJcbiAgICAgIGNvbnN0IHsgeDogdFgsIHk6IHRZLCB3aWR0aDogdFdpZHRoLCBoZWlnaHQ6IHRIZWlnaHQgfSA9IHRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBpZiAoKHggPj0gdFggJiYgeCA8PSB0WCArIHRXaWR0aCkgJiYgKHkgPj0gdFkgJiYgeSA8PSB0WSArIHRIZWlnaHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNsaWNrKGV2ZW50OiBQb2ludGVyRXZlbnQgfCBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLl9zY3JvbGxCYXJTZXJ2aWNlLmNsaWNrKGV2ZW50KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiAjc2Nyb2xsVmlld3BvcnQgY2xhc3M9XCJ0cmFja1wiIHBhcnQ9XCJzY3JvbGxiYXItdHJhY2tcIiBbbmdTdHlsZV09XCIkc3R5bGVzIHwgYXN5bmNcIlxyXG4gICAgW25nQ2xhc3NdPVwie2dyYWJiaW5nOiAkZ3JhYmJpbmcgfCBhc3luY31cIj5cclxuICAgIDxkaXYgI3Njcm9sbENvbnRlbnQgY2xhc3M9XCJ0aHVtYlwiIHBhcnQ9XCJzY3JvbGxiYXItdGh1bWJcIiBbY2xhc3MuaG9yaXpvbnRhbF09XCIoJGlzVmVydGljYWwgfCBhc3luYykhID09IGZhbHNlXCJcclxuICAgICAgICAocG9pbnRlcmRvd24pPVwiY2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiKCR0aHVtYlJlbmRlcmVyIHwgYXN5bmMpIVwiXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCIoJHRlbXBsYXRlQ29udGV4dCB8IGFzeW5jKSFcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJlbmRlcmVyIGxldC1hcGk9XCJhcGlcIiBsZXQtd2lkdGg9XCJ3aWR0aFwiIGxldC1oZWlnaHQ9XCJoZWlnaHRcIiBsZXQtZmlsbFBvc2l0aW9ucz1cImZpbGxQb3NpdGlvbnNcIlxyXG4gICAgbGV0LXBhcmFtcz1cInBhcmFtc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNoYXBlXCIgcGFydD1cInNjcm9sbGJhci10aHVtYl9fc2hhcGVcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cImhlaWdodFwiPjwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==