ngx-bootstrap 10.3.0 → 11.0.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 (616) hide show
  1. package/README.md +3 -5
  2. package/accordion/accordion-group.component.d.ts +1 -1
  3. package/accordion/accordion.component.d.ts +1 -1
  4. package/accordion/esm2022/accordion-group.component.mjs +84 -0
  5. package/accordion/{esm2020 → esm2022}/accordion.component.mjs +4 -4
  6. package/accordion/{esm2020 → esm2022}/accordion.config.mjs +4 -4
  7. package/accordion/{esm2020 → esm2022}/accordion.module.mjs +5 -5
  8. package/accordion/{fesm2020 → fesm2022}/ngx-bootstrap-accordion.mjs +29 -29
  9. package/accordion/fesm2022/ngx-bootstrap-accordion.mjs.map +1 -0
  10. package/accordion/package.json +8 -14
  11. package/alert/alert.component.d.ts +1 -1
  12. package/alert/esm2022/alert.component.mjs +77 -0
  13. package/alert/{esm2020 → esm2022}/alert.config.mjs +4 -4
  14. package/alert/{esm2020 → esm2022}/alert.module.mjs +5 -5
  15. package/alert/{fesm2015 → fesm2022}/ngx-bootstrap-alert.mjs +10 -10
  16. package/alert/fesm2022/ngx-bootstrap-alert.mjs.map +1 -0
  17. package/alert/package.json +8 -14
  18. package/buttons/button-checkbox.directive.d.ts +2 -2
  19. package/buttons/button-radio.directive.d.ts +1 -1
  20. package/buttons/{esm2020 → esm2022}/button-checkbox.directive.mjs +4 -4
  21. package/buttons/{esm2020 → esm2022}/button-radio-group.directive.mjs +4 -4
  22. package/buttons/esm2022/button-radio.directive.mjs +188 -0
  23. package/buttons/{esm2020 → esm2022}/buttons.module.mjs +5 -5
  24. package/buttons/{fesm2020 → fesm2022}/ngx-bootstrap-buttons.mjs +26 -26
  25. package/buttons/fesm2022/ngx-bootstrap-buttons.mjs.map +1 -0
  26. package/buttons/package.json +7 -13
  27. package/carousel/carousel.component.d.ts +1 -1
  28. package/carousel/esm2022/carousel.component.mjs +713 -0
  29. package/carousel/{esm2020 → esm2022}/carousel.config.mjs +4 -4
  30. package/carousel/{esm2020 → esm2022}/carousel.module.mjs +5 -5
  31. package/carousel/{esm2020 → esm2022}/slide.component.mjs +6 -6
  32. package/carousel/{fesm2020 → fesm2022}/ngx-bootstrap-carousel.mjs +65 -56
  33. package/carousel/fesm2022/ngx-bootstrap-carousel.mjs.map +1 -0
  34. package/carousel/package.json +8 -14
  35. package/carousel/slide.component.d.ts +1 -1
  36. package/chronos/duration/create.d.ts +1 -1
  37. package/chronos/{fesm2020 → fesm2022}/ngx-bootstrap-chronos.mjs +4 -0
  38. package/chronos/fesm2022/ngx-bootstrap-chronos.mjs.map +1 -0
  39. package/chronos/locale/locale.class.d.ts +3 -3
  40. package/chronos/moment/calendar.d.ts +1 -1
  41. package/chronos/package.json +5 -11
  42. package/chronos/parse/regex.d.ts +1 -1
  43. package/chronos/testing/chain.d.ts +3 -3
  44. package/chronos/types.d.ts +4 -4
  45. package/chronos/units/aliases.d.ts +1 -1
  46. package/collapse/collapse.directive.d.ts +1 -1
  47. package/collapse/esm2022/collapse.directive.mjs +168 -0
  48. package/collapse/{esm2020 → esm2022}/collapse.module.mjs +5 -5
  49. package/collapse/{fesm2020 → fesm2022}/ngx-bootstrap-collapse.mjs +26 -26
  50. package/collapse/fesm2022/ngx-bootstrap-collapse.mjs.map +1 -0
  51. package/collapse/package.json +8 -14
  52. package/component-loader/{esm2020 → esm2022}/component-loader.factory.mjs +4 -4
  53. package/component-loader/{fesm2020 → fesm2022}/ngx-bootstrap-component-loader.mjs +5 -3
  54. package/component-loader/fesm2022/ngx-bootstrap-component-loader.mjs.map +1 -0
  55. package/component-loader/listen-options.model.d.ts +1 -1
  56. package/component-loader/package.json +7 -13
  57. package/datepicker/bs-datepicker-inline.component.d.ts +1 -1
  58. package/datepicker/bs-datepicker.component.d.ts +1 -1
  59. package/datepicker/bs-daterangepicker-inline.component.d.ts +1 -1
  60. package/datepicker/bs-daterangepicker.component.d.ts +1 -1
  61. package/datepicker/{esm2020 → esm2022}/bs-datepicker-inline.component.mjs +4 -4
  62. package/datepicker/{esm2020 → esm2022}/bs-datepicker-inline.config.mjs +4 -4
  63. package/datepicker/{esm2020 → esm2022}/bs-datepicker-input.directive.mjs +4 -4
  64. package/datepicker/esm2022/bs-datepicker.component.mjs +303 -0
  65. package/datepicker/{esm2020 → esm2022}/bs-datepicker.config.mjs +4 -4
  66. package/datepicker/{esm2020 → esm2022}/bs-datepicker.module.mjs +32 -32
  67. package/datepicker/esm2022/bs-daterangepicker-inline.component.mjs +163 -0
  68. package/datepicker/{esm2020 → esm2022}/bs-daterangepicker-inline.config.mjs +4 -4
  69. package/datepicker/{esm2020 → esm2022}/bs-daterangepicker-input.directive.mjs +4 -4
  70. package/datepicker/esm2022/bs-daterangepicker.component.mjs +296 -0
  71. package/datepicker/{esm2020 → esm2022}/bs-daterangepicker.config.mjs +4 -4
  72. package/datepicker/{esm2020 → esm2022}/bs-locale.service.mjs +4 -4
  73. package/datepicker/esm2022/reducer/bs-datepicker.actions.mjs +143 -0
  74. package/datepicker/{esm2020 → esm2022}/reducer/bs-datepicker.effects.mjs +4 -4
  75. package/datepicker/{esm2020 → esm2022}/reducer/bs-datepicker.store.mjs +4 -4
  76. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-calendar-layout.component.mjs +6 -6
  77. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-current-date-view.component.mjs +4 -4
  78. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-custom-dates-view.component.mjs +6 -6
  79. package/datepicker/esm2022/themes/bs/bs-datepicker-container.component.mjs +192 -0
  80. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-datepicker-day-decorator.directive.mjs +4 -4
  81. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-datepicker-inline-container.component.mjs +9 -9
  82. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-datepicker-navigation-view.component.mjs +6 -6
  83. package/datepicker/esm2022/themes/bs/bs-daterangepicker-container.component.mjs +261 -0
  84. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-daterangepicker-inline-container.component.mjs +9 -9
  85. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-days-calendar-view.component.mjs +6 -6
  86. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-months-calendar-view.component.mjs +6 -6
  87. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-timepicker-view.component.mjs +6 -6
  88. package/datepicker/{esm2020 → esm2022}/themes/bs/bs-years-calendar-view.component.mjs +6 -6
  89. package/datepicker/{fesm2020 → fesm2022}/ngx-bootstrap-datepicker.mjs +226 -226
  90. package/datepicker/fesm2022/ngx-bootstrap-datepicker.mjs.map +1 -0
  91. package/datepicker/models/index.d.ts +1 -1
  92. package/datepicker/package.json +13 -19
  93. package/datepicker/themes/bs/bs-current-date-view.component.d.ts +1 -1
  94. package/datepicker/themes/bs/bs-custom-dates-view.component.d.ts +1 -1
  95. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.d.ts +1 -1
  96. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.d.ts +1 -1
  97. package/datepicker/themes/bs/bs-days-calendar-view.component.d.ts +1 -1
  98. package/datepicker/themes/bs/bs-months-calendar-view.component.d.ts +1 -1
  99. package/datepicker/themes/bs/bs-years-calendar-view.component.d.ts +1 -1
  100. package/datepicker/utils/matrix-utils.d.ts +1 -1
  101. package/dropdown/bs-dropdown.directive.d.ts +1 -1
  102. package/dropdown/esm2022/bs-dropdown-container.component.mjs +79 -0
  103. package/dropdown/{esm2020 → esm2022}/bs-dropdown-menu.directive.mjs +4 -4
  104. package/dropdown/{esm2020 → esm2022}/bs-dropdown-toggle.directive.mjs +4 -4
  105. package/dropdown/{esm2020 → esm2022}/bs-dropdown.config.mjs +4 -4
  106. package/dropdown/esm2022/bs-dropdown.directive.mjs +340 -0
  107. package/dropdown/{esm2020 → esm2022}/bs-dropdown.module.mjs +10 -10
  108. package/dropdown/{esm2020 → esm2022}/bs-dropdown.state.mjs +4 -4
  109. package/dropdown/{fesm2020 → fesm2022}/ngx-bootstrap-dropdown.mjs +62 -62
  110. package/dropdown/fesm2022/ngx-bootstrap-dropdown.mjs.map +1 -0
  111. package/dropdown/package.json +10 -16
  112. package/fesm2022/ngx-bootstrap.mjs.map +1 -0
  113. package/focus-trap/boolean-property.d.ts +1 -1
  114. package/focus-trap/{esm2020 → esm2022}/focus-trap-manager.mjs +4 -4
  115. package/focus-trap/esm2022/focus-trap.mjs +399 -0
  116. package/focus-trap/{esm2020 → esm2022}/focus-trap.module.mjs +5 -5
  117. package/focus-trap/{esm2020 → esm2022}/interactivity-checker.mjs +4 -4
  118. package/focus-trap/{esm2020 → esm2022}/platform.mjs +4 -4
  119. package/focus-trap/{fesm2020 → fesm2022}/ngx-bootstrap-focus-trap.mjs +43 -39
  120. package/focus-trap/fesm2022/ngx-bootstrap-focus-trap.mjs.map +1 -0
  121. package/focus-trap/focus-trap.d.ts +1 -1
  122. package/focus-trap/package.json +8 -14
  123. package/locale/fesm2022/ngx-bootstrap-locale.mjs.map +1 -0
  124. package/locale/package.json +6 -12
  125. package/mini-ngrx/fesm2022/ngx-bootstrap-mini-ngrx.mjs.map +1 -0
  126. package/mini-ngrx/package.json +6 -12
  127. package/mini-ngrx/public_api.d.ts +1 -1
  128. package/modal/{esm2020 → esm2022}/bs-modal-ref.service.mjs +4 -4
  129. package/modal/{esm2020 → esm2022}/bs-modal.service.mjs +4 -4
  130. package/modal/esm2022/modal-backdrop.component.mjs +50 -0
  131. package/modal/{esm2020 → esm2022}/modal-container.component.mjs +6 -6
  132. package/modal/{esm2020 → esm2022}/modal-options.class.mjs +4 -4
  133. package/modal/esm2022/modal.directive.mjs +364 -0
  134. package/modal/{esm2020 → esm2022}/modal.module.mjs +7 -7
  135. package/modal/{fesm2020 → fesm2022}/ngx-bootstrap-modal.mjs +44 -42
  136. package/modal/fesm2022/ngx-bootstrap-modal.mjs.map +1 -0
  137. package/modal/modal.directive.d.ts +1 -1
  138. package/modal/models/index.d.ts +1 -1
  139. package/modal/package.json +8 -14
  140. package/package.json +9 -15
  141. package/pagination/{esm2020 → esm2022}/pager.component.mjs +4 -4
  142. package/pagination/{esm2020 → esm2022}/pagination.component.mjs +4 -4
  143. package/pagination/{esm2020 → esm2022}/pagination.config.mjs +4 -4
  144. package/pagination/{esm2020 → esm2022}/pagination.module.mjs +5 -5
  145. package/pagination/{fesm2020 → fesm2022}/ngx-bootstrap-pagination.mjs +13 -13
  146. package/pagination/fesm2022/ngx-bootstrap-pagination.mjs.map +1 -0
  147. package/pagination/package.json +8 -14
  148. package/pagination/pager.component.d.ts +1 -1
  149. package/pagination/pagination.component.d.ts +1 -1
  150. package/popover/esm2022/popover-container.component.mjs +46 -0
  151. package/popover/{esm2020 → esm2022}/popover.config.mjs +4 -4
  152. package/popover/esm2022/popover.directive.mjs +241 -0
  153. package/popover/{esm2020 → esm2022}/popover.module.mjs +5 -5
  154. package/popover/{fesm2020 → fesm2022}/ngx-bootstrap-popover.mjs +31 -31
  155. package/popover/fesm2022/ngx-bootstrap-popover.mjs.map +1 -0
  156. package/popover/package.json +9 -15
  157. package/popover/popover-container.component.d.ts +1 -1
  158. package/popover/popover.directive.d.ts +1 -1
  159. package/positioning/{esm2020 → esm2022}/positioning.service.mjs +4 -4
  160. package/positioning/{fesm2020 → fesm2022}/ngx-bootstrap-positioning.mjs +3 -3
  161. package/positioning/fesm2022/ngx-bootstrap-positioning.mjs.map +1 -0
  162. package/positioning/models/index.d.ts +1 -1
  163. package/positioning/package.json +10 -16
  164. package/progressbar/bar.component.d.ts +1 -1
  165. package/progressbar/{esm2020 → esm2022}/bar.component.mjs +4 -4
  166. package/progressbar/esm2022/progressbar.component.mjs +53 -0
  167. package/progressbar/{esm2020 → esm2022}/progressbar.config.mjs +4 -4
  168. package/progressbar/{esm2020 → esm2022}/progressbar.module.mjs +5 -5
  169. package/progressbar/{fesm2020 → fesm2022}/ngx-bootstrap-progressbar.mjs +24 -24
  170. package/progressbar/fesm2022/ngx-bootstrap-progressbar.mjs.map +1 -0
  171. package/progressbar/package.json +7 -13
  172. package/progressbar/progressbar-type.interface.d.ts +1 -1
  173. package/progressbar/progressbar.component.d.ts +1 -1
  174. package/rating/{esm2020 → esm2022}/rating.component.mjs +4 -4
  175. package/rating/{esm2020 → esm2022}/rating.config.mjs +4 -4
  176. package/rating/{esm2020 → esm2022}/rating.module.mjs +5 -5
  177. package/rating/{fesm2015 → fesm2022}/ngx-bootstrap-rating.mjs +10 -10
  178. package/rating/fesm2022/ngx-bootstrap-rating.mjs.map +1 -0
  179. package/rating/package.json +8 -14
  180. package/rating/rating.component.d.ts +1 -1
  181. package/schematics/collection.json +1 -1
  182. package/schematics/package.json +7 -7
  183. package/schematics/utils/current_dependency_versions.json +1 -1
  184. package/schematics/utils/index.d.ts +0 -2
  185. package/schematics/utils/index.js +1 -13
  186. package/schematics/utils/index.js.map +1 -1
  187. package/sortable/{esm2020 → esm2022}/draggable-item.service.mjs +4 -4
  188. package/sortable/esm2022/sortable.component.mjs +266 -0
  189. package/sortable/{esm2020 → esm2022}/sortable.module.mjs +5 -5
  190. package/sortable/{fesm2020 → fesm2022}/ngx-bootstrap-sortable.mjs +28 -28
  191. package/sortable/fesm2022/ngx-bootstrap-sortable.mjs.map +1 -0
  192. package/sortable/package.json +10 -16
  193. package/sortable/sortable.component.d.ts +1 -1
  194. package/tabs/esm2022/ng-transclude.directive.mjs +28 -0
  195. package/tabs/{esm2020 → esm2022}/tab-heading.directive.mjs +4 -4
  196. package/tabs/esm2022/tab.directive.mjs +115 -0
  197. package/tabs/{esm2020 → esm2022}/tabs.module.mjs +11 -11
  198. package/tabs/esm2022/tabset.component.mjs +216 -0
  199. package/tabs/{esm2020 → esm2022}/tabset.config.mjs +4 -4
  200. package/tabs/{fesm2015 → fesm2022}/ngx-bootstrap-tabs.mjs +63 -63
  201. package/tabs/fesm2022/ngx-bootstrap-tabs.mjs.map +1 -0
  202. package/tabs/ng-transclude.directive.d.ts +1 -1
  203. package/tabs/package.json +7 -13
  204. package/tabs/tab.directive.d.ts +1 -1
  205. package/tabs/tabset.component.d.ts +1 -1
  206. package/timepicker/esm2022/reducer/timepicker.actions.mjs +53 -0
  207. package/timepicker/{esm2020 → esm2022}/reducer/timepicker.store.mjs +4 -4
  208. package/timepicker/{esm2020 → esm2022}/timepicker.component.mjs +4 -4
  209. package/timepicker/{esm2020 → esm2022}/timepicker.config.mjs +4 -4
  210. package/timepicker/{esm2020 → esm2022}/timepicker.module.mjs +5 -5
  211. package/timepicker/{fesm2020 → fesm2022}/ngx-bootstrap-timepicker.mjs +22 -22
  212. package/timepicker/fesm2022/ngx-bootstrap-timepicker.mjs.map +1 -0
  213. package/timepicker/package.json +10 -16
  214. package/timepicker/reducer/timepicker.reducer.d.ts +1 -3
  215. package/timepicker/timepicker.component.d.ts +1 -1
  216. package/timepicker/timepicker.models.d.ts +1 -1
  217. package/tooltip/{esm2020 → esm2022}/tooltip-container.component.mjs +9 -9
  218. package/tooltip/{esm2020 → esm2022}/tooltip.config.mjs +4 -4
  219. package/tooltip/esm2022/tooltip.directive.mjs +342 -0
  220. package/tooltip/{esm2020 → esm2022}/tooltip.module.mjs +5 -5
  221. package/tooltip/{fesm2020 → fesm2022}/ngx-bootstrap-tooltip.mjs +61 -61
  222. package/tooltip/fesm2022/ngx-bootstrap-tooltip.mjs.map +1 -0
  223. package/tooltip/package.json +10 -16
  224. package/tooltip/tooltip.directive.d.ts +1 -1
  225. package/typeahead/esm2022/typeahead-container.component.mjs +311 -0
  226. package/typeahead/{esm2020 → esm2022}/typeahead.config.mjs +4 -4
  227. package/typeahead/{esm2020 → esm2022}/typeahead.directive.mjs +4 -4
  228. package/typeahead/{esm2020 → esm2022}/typeahead.module.mjs +5 -5
  229. package/typeahead/{fesm2020 → fesm2022}/ngx-bootstrap-typeahead.mjs +20 -20
  230. package/typeahead/fesm2022/ngx-bootstrap-typeahead.mjs.map +1 -0
  231. package/typeahead/package.json +12 -18
  232. package/typeahead/typeahead.directive.d.ts +3 -3
  233. package/utils/fesm2022/ngx-bootstrap-utils.mjs.map +1 -0
  234. package/utils/package.json +6 -12
  235. package/utils/theme-provider.d.ts +1 -1
  236. package/utils/triggers.d.ts +1 -1
  237. package/accordion/esm2020/accordion-group.component.mjs +0 -84
  238. package/accordion/fesm2015/ngx-bootstrap-accordion.mjs +0 -182
  239. package/accordion/fesm2015/ngx-bootstrap-accordion.mjs.map +0 -1
  240. package/accordion/fesm2020/ngx-bootstrap-accordion.mjs.map +0 -1
  241. package/alert/esm2020/alert.component.mjs +0 -77
  242. package/alert/fesm2015/ngx-bootstrap-alert.mjs.map +0 -1
  243. package/alert/fesm2020/ngx-bootstrap-alert.mjs +0 -119
  244. package/alert/fesm2020/ngx-bootstrap-alert.mjs.map +0 -1
  245. package/buttons/esm2020/button-radio.directive.mjs +0 -188
  246. package/buttons/fesm2015/ngx-bootstrap-buttons.mjs +0 -448
  247. package/buttons/fesm2015/ngx-bootstrap-buttons.mjs.map +0 -1
  248. package/buttons/fesm2020/ngx-bootstrap-buttons.mjs.map +0 -1
  249. package/carousel/esm2020/carousel.component.mjs +0 -713
  250. package/carousel/fesm2015/ngx-bootstrap-carousel.mjs +0 -851
  251. package/carousel/fesm2015/ngx-bootstrap-carousel.mjs.map +0 -1
  252. package/carousel/fesm2020/ngx-bootstrap-carousel.mjs.map +0 -1
  253. package/chronos/fesm2015/ngx-bootstrap-chronos.mjs +0 -7384
  254. package/chronos/fesm2015/ngx-bootstrap-chronos.mjs.map +0 -1
  255. package/chronos/fesm2020/ngx-bootstrap-chronos.mjs.map +0 -1
  256. package/collapse/esm2020/collapse.directive.mjs +0 -168
  257. package/collapse/fesm2015/ngx-bootstrap-collapse.mjs +0 -200
  258. package/collapse/fesm2015/ngx-bootstrap-collapse.mjs.map +0 -1
  259. package/collapse/fesm2020/ngx-bootstrap-collapse.mjs.map +0 -1
  260. package/component-loader/fesm2015/ngx-bootstrap-component-loader.mjs +0 -345
  261. package/component-loader/fesm2015/ngx-bootstrap-component-loader.mjs.map +0 -1
  262. package/component-loader/fesm2020/ngx-bootstrap-component-loader.mjs.map +0 -1
  263. package/datepicker/esm2020/bs-datepicker.component.mjs +0 -303
  264. package/datepicker/esm2020/bs-daterangepicker-inline.component.mjs +0 -163
  265. package/datepicker/esm2020/bs-daterangepicker.component.mjs +0 -296
  266. package/datepicker/esm2020/reducer/bs-datepicker.actions.mjs +0 -143
  267. package/datepicker/esm2020/themes/bs/bs-datepicker-container.component.mjs +0 -192
  268. package/datepicker/esm2020/themes/bs/bs-daterangepicker-container.component.mjs +0 -261
  269. package/datepicker/fesm2015/ngx-bootstrap-datepicker.mjs +0 -3971
  270. package/datepicker/fesm2015/ngx-bootstrap-datepicker.mjs.map +0 -1
  271. package/datepicker/fesm2020/ngx-bootstrap-datepicker.mjs.map +0 -1
  272. package/dropdown/esm2020/bs-dropdown-container.component.mjs +0 -79
  273. package/dropdown/esm2020/bs-dropdown.directive.mjs +0 -340
  274. package/dropdown/fesm2015/ngx-bootstrap-dropdown.mjs +0 -603
  275. package/dropdown/fesm2015/ngx-bootstrap-dropdown.mjs.map +0 -1
  276. package/dropdown/fesm2020/ngx-bootstrap-dropdown.mjs.map +0 -1
  277. package/fesm2015/ngx-bootstrap.mjs.map +0 -1
  278. package/fesm2020/ngx-bootstrap.mjs +0 -6
  279. package/fesm2020/ngx-bootstrap.mjs.map +0 -1
  280. package/focus-trap/esm2020/focus-trap.mjs +0 -399
  281. package/focus-trap/fesm2015/ngx-bootstrap-focus-trap.mjs +0 -800
  282. package/focus-trap/fesm2015/ngx-bootstrap-focus-trap.mjs.map +0 -1
  283. package/focus-trap/fesm2020/ngx-bootstrap-focus-trap.mjs.map +0 -1
  284. package/locale/fesm2015/ngx-bootstrap-locale.mjs.map +0 -1
  285. package/locale/fesm2020/ngx-bootstrap-locale.mjs +0 -6
  286. package/locale/fesm2020/ngx-bootstrap-locale.mjs.map +0 -1
  287. package/mini-ngrx/fesm2015/ngx-bootstrap-mini-ngrx.mjs +0 -64
  288. package/mini-ngrx/fesm2015/ngx-bootstrap-mini-ngrx.mjs.map +0 -1
  289. package/mini-ngrx/fesm2020/ngx-bootstrap-mini-ngrx.mjs.map +0 -1
  290. package/modal/esm2020/modal-backdrop.component.mjs +0 -50
  291. package/modal/esm2020/modal.directive.mjs +0 -364
  292. package/modal/fesm2015/ngx-bootstrap-modal.mjs +0 -888
  293. package/modal/fesm2015/ngx-bootstrap-modal.mjs.map +0 -1
  294. package/modal/fesm2020/ngx-bootstrap-modal.mjs.map +0 -1
  295. package/pagination/fesm2015/ngx-bootstrap-pagination.mjs +0 -565
  296. package/pagination/fesm2015/ngx-bootstrap-pagination.mjs.map +0 -1
  297. package/pagination/fesm2020/ngx-bootstrap-pagination.mjs.map +0 -1
  298. package/popover/esm2020/popover-container.component.mjs +0 -46
  299. package/popover/esm2020/popover.directive.mjs +0 -241
  300. package/popover/fesm2015/ngx-bootstrap-popover.mjs +0 -339
  301. package/popover/fesm2015/ngx-bootstrap-popover.mjs.map +0 -1
  302. package/popover/fesm2020/ngx-bootstrap-popover.mjs.map +0 -1
  303. package/positioning/fesm2015/ngx-bootstrap-positioning.mjs +0 -1018
  304. package/positioning/fesm2015/ngx-bootstrap-positioning.mjs.map +0 -1
  305. package/positioning/fesm2020/ngx-bootstrap-positioning.mjs.map +0 -1
  306. package/progressbar/esm2020/progressbar.component.mjs +0 -53
  307. package/progressbar/fesm2015/ngx-bootstrap-progressbar.mjs +0 -163
  308. package/progressbar/fesm2015/ngx-bootstrap-progressbar.mjs.map +0 -1
  309. package/progressbar/fesm2020/ngx-bootstrap-progressbar.mjs.map +0 -1
  310. package/rating/fesm2015/ngx-bootstrap-rating.mjs.map +0 -1
  311. package/rating/fesm2020/ngx-bootstrap-rating.mjs +0 -163
  312. package/rating/fesm2020/ngx-bootstrap-rating.mjs.map +0 -1
  313. package/sortable/esm2020/sortable.component.mjs +0 -266
  314. package/sortable/fesm2015/ngx-bootstrap-sortable.mjs +0 -324
  315. package/sortable/fesm2015/ngx-bootstrap-sortable.mjs.map +0 -1
  316. package/sortable/fesm2020/ngx-bootstrap-sortable.mjs.map +0 -1
  317. package/tabs/esm2020/ng-transclude.directive.mjs +0 -28
  318. package/tabs/esm2020/tab.directive.mjs +0 -115
  319. package/tabs/esm2020/tabset.component.mjs +0 -216
  320. package/tabs/fesm2015/ngx-bootstrap-tabs.mjs.map +0 -1
  321. package/tabs/fesm2020/ngx-bootstrap-tabs.mjs +0 -427
  322. package/tabs/fesm2020/ngx-bootstrap-tabs.mjs.map +0 -1
  323. package/timepicker/esm2020/reducer/timepicker.actions.mjs +0 -53
  324. package/timepicker/fesm2015/ngx-bootstrap-timepicker.mjs +0 -830
  325. package/timepicker/fesm2015/ngx-bootstrap-timepicker.mjs.map +0 -1
  326. package/timepicker/fesm2020/ngx-bootstrap-timepicker.mjs.map +0 -1
  327. package/tooltip/esm2020/tooltip.directive.mjs +0 -342
  328. package/tooltip/fesm2015/ngx-bootstrap-tooltip.mjs +0 -431
  329. package/tooltip/fesm2015/ngx-bootstrap-tooltip.mjs.map +0 -1
  330. package/tooltip/fesm2020/ngx-bootstrap-tooltip.mjs.map +0 -1
  331. package/typeahead/esm2020/typeahead-container.component.mjs +0 -311
  332. package/typeahead/fesm2015/ngx-bootstrap-typeahead.mjs +0 -1890
  333. package/typeahead/fesm2015/ngx-bootstrap-typeahead.mjs.map +0 -1
  334. package/typeahead/fesm2020/ngx-bootstrap-typeahead.mjs.map +0 -1
  335. package/utils/fesm2015/ngx-bootstrap-utils.mjs +0 -523
  336. package/utils/fesm2015/ngx-bootstrap-utils.mjs.map +0 -1
  337. package/utils/fesm2020/ngx-bootstrap-utils.mjs.map +0 -1
  338. /package/accordion/{esm2020 → esm2022}/index.mjs +0 -0
  339. /package/accordion/{esm2020 → esm2022}/ngx-bootstrap-accordion.mjs +0 -0
  340. /package/accordion/{esm2020 → esm2022}/public_api.mjs +0 -0
  341. /package/alert/{esm2020 → esm2022}/index.mjs +0 -0
  342. /package/alert/{esm2020 → esm2022}/ngx-bootstrap-alert.mjs +0 -0
  343. /package/alert/{esm2020 → esm2022}/public_api.mjs +0 -0
  344. /package/buttons/{esm2020 → esm2022}/index.mjs +0 -0
  345. /package/buttons/{esm2020 → esm2022}/ngx-bootstrap-buttons.mjs +0 -0
  346. /package/buttons/{esm2020 → esm2022}/public_api.mjs +0 -0
  347. /package/carousel/{esm2020 → esm2022}/index.mjs +0 -0
  348. /package/carousel/{esm2020 → esm2022}/models/index.mjs +0 -0
  349. /package/carousel/{esm2020 → esm2022}/ngx-bootstrap-carousel.mjs +0 -0
  350. /package/carousel/{esm2020 → esm2022}/public_api.mjs +0 -0
  351. /package/carousel/{esm2020 → esm2022}/utils.mjs +0 -0
  352. /package/chronos/{esm2020 → esm2022}/create/check-overflow.mjs +0 -0
  353. /package/chronos/{esm2020 → esm2022}/create/clone.mjs +0 -0
  354. /package/chronos/{esm2020 → esm2022}/create/date-from-array.mjs +0 -0
  355. /package/chronos/{esm2020 → esm2022}/create/from-anything.mjs +0 -0
  356. /package/chronos/{esm2020 → esm2022}/create/from-array.mjs +0 -0
  357. /package/chronos/{esm2020 → esm2022}/create/from-object.mjs +0 -0
  358. /package/chronos/{esm2020 → esm2022}/create/from-string-and-array.mjs +0 -0
  359. /package/chronos/{esm2020 → esm2022}/create/from-string-and-format.mjs +0 -0
  360. /package/chronos/{esm2020 → esm2022}/create/from-string.mjs +0 -0
  361. /package/chronos/{esm2020 → esm2022}/create/local.mjs +0 -0
  362. /package/chronos/{esm2020 → esm2022}/create/parsing-flags.mjs +0 -0
  363. /package/chronos/{esm2020 → esm2022}/create/parsing.types.mjs +0 -0
  364. /package/chronos/{esm2020 → esm2022}/create/valid.mjs +0 -0
  365. /package/chronos/{esm2020 → esm2022}/duration/bubble.mjs +0 -0
  366. /package/chronos/{esm2020 → esm2022}/duration/constructor.mjs +0 -0
  367. /package/chronos/{esm2020 → esm2022}/duration/create.mjs +0 -0
  368. /package/chronos/{esm2020 → esm2022}/duration/humanize.mjs +0 -0
  369. /package/chronos/{esm2020 → esm2022}/duration/valid.mjs +0 -0
  370. /package/chronos/{esm2020 → esm2022}/format/format.mjs +0 -0
  371. /package/chronos/{esm2020 → esm2022}/format.mjs +0 -0
  372. /package/chronos/{esm2020 → esm2022}/i18n/ar.mjs +0 -0
  373. /package/chronos/{esm2020 → esm2022}/i18n/bg.mjs +0 -0
  374. /package/chronos/{esm2020 → esm2022}/i18n/ca.mjs +0 -0
  375. /package/chronos/{esm2020 → esm2022}/i18n/cs.mjs +0 -0
  376. /package/chronos/{esm2020 → esm2022}/i18n/da.mjs +0 -0
  377. /package/chronos/{esm2020 → esm2022}/i18n/de.mjs +0 -0
  378. /package/chronos/{esm2020 → esm2022}/i18n/en-gb.mjs +0 -0
  379. /package/chronos/{esm2020 → esm2022}/i18n/es-do.mjs +0 -0
  380. /package/chronos/{esm2020 → esm2022}/i18n/es-pr.mjs +0 -0
  381. /package/chronos/{esm2020 → esm2022}/i18n/es-us.mjs +0 -0
  382. /package/chronos/{esm2020 → esm2022}/i18n/es.mjs +0 -0
  383. /package/chronos/{esm2020 → esm2022}/i18n/et.mjs +0 -0
  384. /package/chronos/{esm2020 → esm2022}/i18n/fi.mjs +0 -0
  385. /package/chronos/{esm2020 → esm2022}/i18n/fr.mjs +0 -0
  386. /package/chronos/{esm2020 → esm2022}/i18n/gl.mjs +0 -0
  387. /package/chronos/{esm2020 → esm2022}/i18n/he.mjs +0 -0
  388. /package/chronos/{esm2020 → esm2022}/i18n/hi.mjs +0 -0
  389. /package/chronos/{esm2020 → esm2022}/i18n/hr.mjs +0 -0
  390. /package/chronos/{esm2020 → esm2022}/i18n/hu.mjs +0 -0
  391. /package/chronos/{esm2020 → esm2022}/i18n/id.mjs +0 -0
  392. /package/chronos/{esm2020 → esm2022}/i18n/it.mjs +0 -0
  393. /package/chronos/{esm2020 → esm2022}/i18n/ja.mjs +0 -0
  394. /package/chronos/{esm2020 → esm2022}/i18n/ka.mjs +0 -0
  395. /package/chronos/{esm2020 → esm2022}/i18n/kk.mjs +0 -0
  396. /package/chronos/{esm2020 → esm2022}/i18n/ko.mjs +0 -0
  397. /package/chronos/{esm2020 → esm2022}/i18n/lt.mjs +0 -0
  398. /package/chronos/{esm2020 → esm2022}/i18n/lv.mjs +0 -0
  399. /package/chronos/{esm2020 → esm2022}/i18n/mn.mjs +0 -0
  400. /package/chronos/{esm2020 → esm2022}/i18n/nb.mjs +0 -0
  401. /package/chronos/{esm2020 → esm2022}/i18n/nl-be.mjs +0 -0
  402. /package/chronos/{esm2020 → esm2022}/i18n/nl.mjs +0 -0
  403. /package/chronos/{esm2020 → esm2022}/i18n/pl.mjs +0 -0
  404. /package/chronos/{esm2020 → esm2022}/i18n/pt-br.mjs +0 -0
  405. /package/chronos/{esm2020 → esm2022}/i18n/ro.mjs +0 -0
  406. /package/chronos/{esm2020 → esm2022}/i18n/ru.mjs +0 -0
  407. /package/chronos/{esm2020 → esm2022}/i18n/sk.mjs +0 -0
  408. /package/chronos/{esm2020 → esm2022}/i18n/sl.mjs +0 -0
  409. /package/chronos/{esm2020 → esm2022}/i18n/sq.mjs +0 -0
  410. /package/chronos/{esm2020 → esm2022}/i18n/sv.mjs +0 -0
  411. /package/chronos/{esm2020 → esm2022}/i18n/th-be.mjs +0 -0
  412. /package/chronos/{esm2020 → esm2022}/i18n/th.mjs +0 -0
  413. /package/chronos/{esm2020 → esm2022}/i18n/tr.mjs +0 -0
  414. /package/chronos/{esm2020 → esm2022}/i18n/uk.mjs +0 -0
  415. /package/chronos/{esm2020 → esm2022}/i18n/vi.mjs +0 -0
  416. /package/chronos/{esm2020 → esm2022}/i18n/zh-cn.mjs +0 -0
  417. /package/chronos/{esm2020 → esm2022}/index.mjs +0 -0
  418. /package/chronos/{esm2020 → esm2022}/locale/calendar.mjs +0 -0
  419. /package/chronos/{esm2020 → esm2022}/locale/locale.class.mjs +0 -0
  420. /package/chronos/{esm2020 → esm2022}/locale/locale.defaults.mjs +0 -0
  421. /package/chronos/{esm2020 → esm2022}/locale/locales.mjs +0 -0
  422. /package/chronos/{esm2020 → esm2022}/moment/add-subtract.mjs +0 -0
  423. /package/chronos/{esm2020 → esm2022}/moment/calendar.mjs +0 -0
  424. /package/chronos/{esm2020 → esm2022}/moment/diff.mjs +0 -0
  425. /package/chronos/{esm2020 → esm2022}/moment/min-max.mjs +0 -0
  426. /package/chronos/{esm2020 → esm2022}/ngx-bootstrap-chronos.mjs +0 -0
  427. /package/chronos/{esm2020 → esm2022}/parse/regex.mjs +0 -0
  428. /package/chronos/{esm2020 → esm2022}/parse/token.mjs +0 -0
  429. /package/chronos/{esm2020 → esm2022}/public_api.mjs +0 -0
  430. /package/chronos/{esm2020 → esm2022}/testing/chain.mjs +0 -0
  431. /package/chronos/{esm2020 → esm2022}/types.mjs +0 -0
  432. /package/chronos/{esm2020 → esm2022}/units/aliases.mjs +0 -0
  433. /package/chronos/{esm2020 → esm2022}/units/constants.mjs +0 -0
  434. /package/chronos/{esm2020 → esm2022}/units/day-of-month.mjs +0 -0
  435. /package/chronos/{esm2020 → esm2022}/units/day-of-week.mjs +0 -0
  436. /package/chronos/{esm2020 → esm2022}/units/day-of-year.mjs +0 -0
  437. /package/chronos/{esm2020 → esm2022}/units/hour.mjs +0 -0
  438. /package/chronos/{esm2020 → esm2022}/units/index.mjs +0 -0
  439. /package/chronos/{esm2020 → esm2022}/units/millisecond.mjs +0 -0
  440. /package/chronos/{esm2020 → esm2022}/units/minute.mjs +0 -0
  441. /package/chronos/{esm2020 → esm2022}/units/month.mjs +0 -0
  442. /package/chronos/{esm2020 → esm2022}/units/offset.mjs +0 -0
  443. /package/chronos/{esm2020 → esm2022}/units/priorities.mjs +0 -0
  444. /package/chronos/{esm2020 → esm2022}/units/quarter.mjs +0 -0
  445. /package/chronos/{esm2020 → esm2022}/units/second.mjs +0 -0
  446. /package/chronos/{esm2020 → esm2022}/units/timestamp.mjs +0 -0
  447. /package/chronos/{esm2020 → esm2022}/units/timezone.mjs +0 -0
  448. /package/chronos/{esm2020 → esm2022}/units/week-calendar-utils.mjs +0 -0
  449. /package/chronos/{esm2020 → esm2022}/units/week-year.mjs +0 -0
  450. /package/chronos/{esm2020 → esm2022}/units/week.mjs +0 -0
  451. /package/chronos/{esm2020 → esm2022}/units/year.mjs +0 -0
  452. /package/chronos/{esm2020 → esm2022}/utils/abs-ceil.mjs +0 -0
  453. /package/chronos/{esm2020 → esm2022}/utils/abs-round.mjs +0 -0
  454. /package/chronos/{esm2020 → esm2022}/utils/compare-arrays.mjs +0 -0
  455. /package/chronos/{esm2020 → esm2022}/utils/date-compare.mjs +0 -0
  456. /package/chronos/{esm2020 → esm2022}/utils/date-getters.mjs +0 -0
  457. /package/chronos/{esm2020 → esm2022}/utils/date-setters.mjs +0 -0
  458. /package/chronos/{esm2020 → esm2022}/utils/defaults.mjs +0 -0
  459. /package/chronos/{esm2020 → esm2022}/utils/start-end-of.mjs +0 -0
  460. /package/chronos/{esm2020 → esm2022}/utils/type-checks.mjs +0 -0
  461. /package/chronos/{esm2020 → esm2022}/utils/zero-fill.mjs +0 -0
  462. /package/chronos/{esm2020 → esm2022}/utils.mjs +0 -0
  463. /package/collapse/{esm2020 → esm2022}/collapse-animations.mjs +0 -0
  464. /package/collapse/{esm2020 → esm2022}/index.mjs +0 -0
  465. /package/collapse/{esm2020 → esm2022}/ngx-bootstrap-collapse.mjs +0 -0
  466. /package/collapse/{esm2020 → esm2022}/public_api.mjs +0 -0
  467. /package/component-loader/{esm2020 → esm2022}/bs-component-ref.class.mjs +0 -0
  468. /package/component-loader/{esm2020 → esm2022}/component-loader.class.mjs +0 -0
  469. /package/component-loader/{esm2020 → esm2022}/content-ref.class.mjs +0 -0
  470. /package/component-loader/{esm2020 → esm2022}/index.mjs +0 -0
  471. /package/component-loader/{esm2020 → esm2022}/listen-options.model.mjs +0 -0
  472. /package/component-loader/{esm2020 → esm2022}/ngx-bootstrap-component-loader.mjs +0 -0
  473. /package/component-loader/{esm2020 → esm2022}/public_api.mjs +0 -0
  474. /package/datepicker/{esm2020 → esm2022}/base/bs-datepicker-container.mjs +0 -0
  475. /package/datepicker/{esm2020 → esm2022}/datepicker-animations.mjs +0 -0
  476. /package/datepicker/{esm2020 → esm2022}/engine/calc-days-calendar.mjs +0 -0
  477. /package/datepicker/{esm2020 → esm2022}/engine/flag-days-calendar.mjs +0 -0
  478. /package/datepicker/{esm2020 → esm2022}/engine/flag-months-calendar.mjs +0 -0
  479. /package/datepicker/{esm2020 → esm2022}/engine/flag-years-calendar.mjs +0 -0
  480. /package/datepicker/{esm2020 → esm2022}/engine/format-days-calendar.mjs +0 -0
  481. /package/datepicker/{esm2020 → esm2022}/engine/format-months-calendar.mjs +0 -0
  482. /package/datepicker/{esm2020 → esm2022}/engine/format-years-calendar.mjs +0 -0
  483. /package/datepicker/{esm2020 → esm2022}/engine/view-mode.mjs +0 -0
  484. /package/datepicker/{esm2020 → esm2022}/index.mjs +0 -0
  485. /package/datepicker/{esm2020 → esm2022}/models/index.mjs +0 -0
  486. /package/datepicker/{esm2020 → esm2022}/ngx-bootstrap-datepicker.mjs +0 -0
  487. /package/datepicker/{esm2020 → esm2022}/public_api.mjs +0 -0
  488. /package/datepicker/{esm2020 → esm2022}/reducer/_defaults.mjs +0 -0
  489. /package/datepicker/{esm2020 → esm2022}/reducer/bs-datepicker.reducer.mjs +0 -0
  490. /package/datepicker/{esm2020 → esm2022}/reducer/bs-datepicker.state.mjs +0 -0
  491. /package/datepicker/{esm2020 → esm2022}/utils/bs-calendar-utils.mjs +0 -0
  492. /package/datepicker/{esm2020 → esm2022}/utils/copy-time-utils.mjs +0 -0
  493. /package/datepicker/{esm2020 → esm2022}/utils/matrix-utils.mjs +0 -0
  494. /package/dropdown/{esm2020 → esm2022}/dropdown-animations.mjs +0 -0
  495. /package/dropdown/{esm2020 → esm2022}/index.mjs +0 -0
  496. /package/dropdown/{esm2020 → esm2022}/ngx-bootstrap-dropdown.mjs +0 -0
  497. /package/dropdown/{esm2020 → esm2022}/public_api.mjs +0 -0
  498. /package/{esm2020 → esm2022}/index.mjs +0 -0
  499. /package/{esm2020 → esm2022}/ngx-bootstrap.mjs +0 -0
  500. /package/{fesm2015 → fesm2022}/ngx-bootstrap.mjs +0 -0
  501. /package/focus-trap/{esm2020 → esm2022}/boolean-property.mjs +0 -0
  502. /package/focus-trap/{esm2020 → esm2022}/index.mjs +0 -0
  503. /package/focus-trap/{esm2020 → esm2022}/ngx-bootstrap-focus-trap.mjs +0 -0
  504. /package/focus-trap/{esm2020 → esm2022}/public_api.mjs +0 -0
  505. /package/locale/{esm2020 → esm2022}/index.mjs +0 -0
  506. /package/locale/{esm2020 → esm2022}/ngx-bootstrap-locale.mjs +0 -0
  507. /package/locale/{esm2020 → esm2022}/public_api.mjs +0 -0
  508. /package/locale/{fesm2015 → fesm2022}/ngx-bootstrap-locale.mjs +0 -0
  509. /package/mini-ngrx/{esm2020 → esm2022}/index.mjs +0 -0
  510. /package/mini-ngrx/{esm2020 → esm2022}/ngx-bootstrap-mini-ngrx.mjs +0 -0
  511. /package/mini-ngrx/{esm2020 → esm2022}/public_api.mjs +0 -0
  512. /package/mini-ngrx/{esm2020 → esm2022}/state.class.mjs +0 -0
  513. /package/mini-ngrx/{esm2020 → esm2022}/store.class.mjs +0 -0
  514. /package/mini-ngrx/{fesm2020 → fesm2022}/ngx-bootstrap-mini-ngrx.mjs +0 -0
  515. /package/modal/{esm2020 → esm2022}/index.mjs +0 -0
  516. /package/modal/{esm2020 → esm2022}/modal-backdrop.options.mjs +0 -0
  517. /package/modal/{esm2020 → esm2022}/models/index.mjs +0 -0
  518. /package/modal/{esm2020 → esm2022}/ngx-bootstrap-modal.mjs +0 -0
  519. /package/modal/{esm2020 → esm2022}/public_api.mjs +0 -0
  520. /package/pagination/{esm2020 → esm2022}/index.mjs +0 -0
  521. /package/pagination/{esm2020 → esm2022}/models/index.mjs +0 -0
  522. /package/pagination/{esm2020 → esm2022}/ngx-bootstrap-pagination.mjs +0 -0
  523. /package/pagination/{esm2020 → esm2022}/public_api.mjs +0 -0
  524. /package/popover/{esm2020 → esm2022}/index.mjs +0 -0
  525. /package/popover/{esm2020 → esm2022}/ngx-bootstrap-popover.mjs +0 -0
  526. /package/popover/{esm2020 → esm2022}/public_api.mjs +0 -0
  527. /package/positioning/{esm2020 → esm2022}/index.mjs +0 -0
  528. /package/positioning/{esm2020 → esm2022}/models/index.mjs +0 -0
  529. /package/positioning/{esm2020 → esm2022}/modifiers/arrow.mjs +0 -0
  530. /package/positioning/{esm2020 → esm2022}/modifiers/flip.mjs +0 -0
  531. /package/positioning/{esm2020 → esm2022}/modifiers/index.mjs +0 -0
  532. /package/positioning/{esm2020 → esm2022}/modifiers/initData.mjs +0 -0
  533. /package/positioning/{esm2020 → esm2022}/modifiers/preventOverflow.mjs +0 -0
  534. /package/positioning/{esm2020 → esm2022}/modifiers/shift.mjs +0 -0
  535. /package/positioning/{esm2020 → esm2022}/ng-positioning.mjs +0 -0
  536. /package/positioning/{esm2020 → esm2022}/ngx-bootstrap-positioning.mjs +0 -0
  537. /package/positioning/{esm2020 → esm2022}/public_api.mjs +0 -0
  538. /package/positioning/{esm2020 → esm2022}/utils/checkMargin.mjs +0 -0
  539. /package/positioning/{esm2020 → esm2022}/utils/computeAutoPlacement.mjs +0 -0
  540. /package/positioning/{esm2020 → esm2022}/utils/findCommonOffsetParent.mjs +0 -0
  541. /package/positioning/{esm2020 → esm2022}/utils/getBordersSize.mjs +0 -0
  542. /package/positioning/{esm2020 → esm2022}/utils/getBoundaries.mjs +0 -0
  543. /package/positioning/{esm2020 → esm2022}/utils/getBoundingClientRect.mjs +0 -0
  544. /package/positioning/{esm2020 → esm2022}/utils/getClientRect.mjs +0 -0
  545. /package/positioning/{esm2020 → esm2022}/utils/getFixedPositionOffsetParent.mjs +0 -0
  546. /package/positioning/{esm2020 → esm2022}/utils/getOffsetParent.mjs +0 -0
  547. /package/positioning/{esm2020 → esm2022}/utils/getOffsetRectRelativeToArbitraryNode.mjs +0 -0
  548. /package/positioning/{esm2020 → esm2022}/utils/getOffsets.mjs +0 -0
  549. /package/positioning/{esm2020 → esm2022}/utils/getOppositePlacement.mjs +0 -0
  550. /package/positioning/{esm2020 → esm2022}/utils/getOppositeVariation.mjs +0 -0
  551. /package/positioning/{esm2020 → esm2022}/utils/getOuterSizes.mjs +0 -0
  552. /package/positioning/{esm2020 → esm2022}/utils/getParentNode.mjs +0 -0
  553. /package/positioning/{esm2020 → esm2022}/utils/getReferenceOffsets.mjs +0 -0
  554. /package/positioning/{esm2020 → esm2022}/utils/getRoot.mjs +0 -0
  555. /package/positioning/{esm2020 → esm2022}/utils/getScroll.mjs +0 -0
  556. /package/positioning/{esm2020 → esm2022}/utils/getScrollParent.mjs +0 -0
  557. /package/positioning/{esm2020 → esm2022}/utils/getStyleComputedProperty.mjs +0 -0
  558. /package/positioning/{esm2020 → esm2022}/utils/getTargetOffsets.mjs +0 -0
  559. /package/positioning/{esm2020 → esm2022}/utils/getViewportOffsetRectRelativeToArtbitraryNode.mjs +0 -0
  560. /package/positioning/{esm2020 → esm2022}/utils/getWindowSizes.mjs +0 -0
  561. /package/positioning/{esm2020 → esm2022}/utils/includeScroll.mjs +0 -0
  562. /package/positioning/{esm2020 → esm2022}/utils/index.mjs +0 -0
  563. /package/positioning/{esm2020 → esm2022}/utils/isFixed.mjs +0 -0
  564. /package/positioning/{esm2020 → esm2022}/utils/isModifierEnabled.mjs +0 -0
  565. /package/positioning/{esm2020 → esm2022}/utils/isNumeric.mjs +0 -0
  566. /package/positioning/{esm2020 → esm2022}/utils/isOffsetContainer.mjs +0 -0
  567. /package/positioning/{esm2020 → esm2022}/utils/setStyles.mjs +0 -0
  568. /package/positioning/{esm2020 → esm2022}/utils/updateContainerClass.mjs +0 -0
  569. /package/progressbar/{esm2020 → esm2022}/index.mjs +0 -0
  570. /package/progressbar/{esm2020 → esm2022}/ngx-bootstrap-progressbar.mjs +0 -0
  571. /package/progressbar/{esm2020 → esm2022}/progressbar-type.interface.mjs +0 -0
  572. /package/progressbar/{esm2020 → esm2022}/public_api.mjs +0 -0
  573. /package/rating/{esm2020 → esm2022}/index.mjs +0 -0
  574. /package/rating/{esm2020 → esm2022}/models/index.mjs +0 -0
  575. /package/rating/{esm2020 → esm2022}/ngx-bootstrap-rating.mjs +0 -0
  576. /package/rating/{esm2020 → esm2022}/public_api.mjs +0 -0
  577. /package/sortable/{esm2020 → esm2022}/draggable-item.mjs +0 -0
  578. /package/sortable/{esm2020 → esm2022}/index.mjs +0 -0
  579. /package/sortable/{esm2020 → esm2022}/ngx-bootstrap-sortable.mjs +0 -0
  580. /package/sortable/{esm2020 → esm2022}/public_api.mjs +0 -0
  581. /package/tabs/{esm2020 → esm2022}/index.mjs +0 -0
  582. /package/tabs/{esm2020 → esm2022}/ngx-bootstrap-tabs.mjs +0 -0
  583. /package/tabs/{esm2020 → esm2022}/public_api.mjs +0 -0
  584. /package/timepicker/{esm2020 → esm2022}/index.mjs +0 -0
  585. /package/timepicker/{esm2020 → esm2022}/models/index.mjs +0 -0
  586. /package/timepicker/{esm2020 → esm2022}/ngx-bootstrap-timepicker.mjs +0 -0
  587. /package/timepicker/{esm2020 → esm2022}/public_api.mjs +0 -0
  588. /package/timepicker/{esm2020 → esm2022}/reducer/timepicker.reducer.mjs +0 -0
  589. /package/timepicker/{esm2020 → esm2022}/timepicker-controls.util.mjs +0 -0
  590. /package/timepicker/{esm2020 → esm2022}/timepicker.models.mjs +0 -0
  591. /package/timepicker/{esm2020 → esm2022}/timepicker.utils.mjs +0 -0
  592. /package/tooltip/{esm2020 → esm2022}/index.mjs +0 -0
  593. /package/tooltip/{esm2020 → esm2022}/ngx-bootstrap-tooltip.mjs +0 -0
  594. /package/tooltip/{esm2020 → esm2022}/public_api.mjs +0 -0
  595. /package/typeahead/{esm2020 → esm2022}/index.mjs +0 -0
  596. /package/typeahead/{esm2020 → esm2022}/latin-map.mjs +0 -0
  597. /package/typeahead/{esm2020 → esm2022}/models/index.mjs +0 -0
  598. /package/typeahead/{esm2020 → esm2022}/ngx-bootstrap-typeahead.mjs +0 -0
  599. /package/typeahead/{esm2020 → esm2022}/public_api.mjs +0 -0
  600. /package/typeahead/{esm2020 → esm2022}/typeahead-animations.mjs +0 -0
  601. /package/typeahead/{esm2020 → esm2022}/typeahead-match.class.mjs +0 -0
  602. /package/typeahead/{esm2020 → esm2022}/typeahead-options.class.mjs +0 -0
  603. /package/typeahead/{esm2020 → esm2022}/typeahead-order.class.mjs +0 -0
  604. /package/typeahead/{esm2020 → esm2022}/typeahead-utils.mjs +0 -0
  605. /package/utils/{esm2020 → esm2022}/decorators.mjs +0 -0
  606. /package/utils/{esm2020 → esm2022}/facade/browser.mjs +0 -0
  607. /package/utils/{esm2020 → esm2022}/index.mjs +0 -0
  608. /package/utils/{esm2020 → esm2022}/linked-list.class.mjs +0 -0
  609. /package/utils/{esm2020 → esm2022}/ngx-bootstrap-utils.mjs +0 -0
  610. /package/utils/{esm2020 → esm2022}/public_api.mjs +0 -0
  611. /package/utils/{esm2020 → esm2022}/theme-provider.mjs +0 -0
  612. /package/utils/{esm2020 → esm2022}/trigger.class.mjs +0 -0
  613. /package/utils/{esm2020 → esm2022}/triggers.mjs +0 -0
  614. /package/utils/{esm2020 → esm2022}/utils.class.mjs +0 -0
  615. /package/utils/{esm2020 → esm2022}/warn-once.mjs +0 -0
  616. /package/utils/{fesm2020 → fesm2022}/ngx-bootstrap-utils.mjs +0 -0
@@ -0,0 +1,713 @@
1
+ /***
2
+ * pause (not yet supported) (?string='hover') - event group name which pauses
3
+ * the cycling of the carousel, if hover pauses on mouseenter and resumes on
4
+ * mouseleave keyboard (not yet supported) (?boolean=true) - if false
5
+ * carousel will not react to keyboard events
6
+ * note: swiping not yet supported
7
+ */
8
+ /****
9
+ * Problems:
10
+ * 1) if we set an active slide via model changes, .active class remains on a
11
+ * current slide.
12
+ * 2) if we have only one slide, we shouldn't show prev/next nav buttons
13
+ * 3) if first or last slide is active and noWrap is true, there should be
14
+ * "disabled" class on the nav buttons.
15
+ * 4) default interval should be equal 5000
16
+ */
17
+ import { Component, EventEmitter, Input, NgZone, Output, Inject, PLATFORM_ID } from '@angular/core';
18
+ import { isPlatformBrowser } from '@angular/common';
19
+ import { LinkedList, getBsVer } from 'ngx-bootstrap/utils';
20
+ import { CarouselConfig } from './carousel.config';
21
+ import { findLastIndex, chunkByNumber, isNumber } from './utils';
22
+ import * as i0 from "@angular/core";
23
+ import * as i1 from "./carousel.config";
24
+ import * as i2 from "@angular/common";
25
+ export var Direction;
26
+ (function (Direction) {
27
+ Direction[Direction["UNKNOWN"] = 0] = "UNKNOWN";
28
+ Direction[Direction["NEXT"] = 1] = "NEXT";
29
+ Direction[Direction["PREV"] = 2] = "PREV";
30
+ })(Direction || (Direction = {}));
31
+ let _currentId = 1;
32
+ /**
33
+ * Base element to create carousel
34
+ */
35
+ export class CarouselComponent {
36
+ /** Index of currently displayed slide(started for 0) */
37
+ set activeSlide(index) {
38
+ if (this.multilist) {
39
+ return;
40
+ }
41
+ if (isNumber(index)) {
42
+ this.customActiveSlide = index;
43
+ }
44
+ if (this._slides.length && index !== this._currentActiveSlide) {
45
+ this._select(index);
46
+ }
47
+ }
48
+ get activeSlide() {
49
+ return this._currentActiveSlide || 0;
50
+ }
51
+ /**
52
+ * Delay of item cycling in milliseconds. If false, carousel won't cycle
53
+ * automatically.
54
+ */
55
+ get interval() {
56
+ return this._interval;
57
+ }
58
+ set interval(value) {
59
+ this._interval = value;
60
+ this.restartTimer();
61
+ }
62
+ get slides() {
63
+ return this._slides.toArray();
64
+ }
65
+ get isFirstSlideVisible() {
66
+ const indexes = this.getVisibleIndexes();
67
+ if (!indexes || (indexes instanceof Array && !indexes.length)) {
68
+ return false;
69
+ }
70
+ return indexes.includes(0);
71
+ }
72
+ get isLastSlideVisible() {
73
+ const indexes = this.getVisibleIndexes();
74
+ if (!indexes || (indexes instanceof Array && !indexes.length)) {
75
+ return false;
76
+ }
77
+ return indexes.includes(this._slides.length - 1);
78
+ }
79
+ get _bsVer() {
80
+ return getBsVer();
81
+ }
82
+ constructor(config, ngZone, platformId) {
83
+ this.ngZone = ngZone;
84
+ this.platformId = platformId;
85
+ /* If `true` — carousel will not cycle continuously and will have hard stops (prevent looping) */
86
+ this.noWrap = false;
87
+ /* If `true` — will disable pausing on carousel mouse hover */
88
+ this.noPause = false;
89
+ /* If `true` — carousel-indicators are visible */
90
+ this.showIndicators = true;
91
+ /* If `true` - autoplay will be stopped on focus */
92
+ this.pauseOnFocus = false;
93
+ /* If `true` - carousel indicators indicate slides chunks
94
+ works ONLY if singleSlideOffset = FALSE */
95
+ this.indicatorsByChunk = false;
96
+ /* If value more then 1 — carousel works in multilist mode */
97
+ this.itemsPerSlide = 1;
98
+ /* If `true` — carousel shifts by one element. By default carousel shifts by number
99
+ of visible elements (itemsPerSlide field) */
100
+ this.singleSlideOffset = false;
101
+ /** Turn on/off animation. Animation doesn't work for multilist carousel */
102
+ this.isAnimated = false;
103
+ /** Will be emitted when active slide has been changed. Part of two-way-bindable [(activeSlide)] property */
104
+ this.activeSlideChange = new EventEmitter(false);
105
+ /** Will be emitted when active slides has been changed in multilist mode */
106
+ this.slideRangeChange = new EventEmitter();
107
+ /* Index to start display slides from it */
108
+ this.startFromIndex = 0;
109
+ this._interval = 5000;
110
+ this._slides = new LinkedList();
111
+ this._currentVisibleSlidesIndex = 0;
112
+ this.isPlaying = false;
113
+ this.destroyed = false;
114
+ this.currentId = 0;
115
+ this.getActive = (slide) => slide.active;
116
+ this.makeSlidesConsistent = (slides) => {
117
+ slides.forEach((slide, index) => slide.item.order = index);
118
+ };
119
+ Object.assign(this, config);
120
+ this.currentId = _currentId++;
121
+ }
122
+ ngAfterViewInit() {
123
+ setTimeout(() => {
124
+ if (this.singleSlideOffset) {
125
+ this.indicatorsByChunk = false;
126
+ }
127
+ if (this.multilist) {
128
+ this._chunkedSlides = chunkByNumber(this.mapSlidesAndIndexes(), this.itemsPerSlide);
129
+ this.selectInitialSlides();
130
+ }
131
+ if (this.customActiveSlide && !this.multilist) {
132
+ this._select(this.customActiveSlide);
133
+ }
134
+ }, 0);
135
+ }
136
+ ngOnDestroy() {
137
+ this.destroyed = true;
138
+ }
139
+ /**
140
+ * Adds new slide. If this slide is first in collection - set it as active
141
+ * and starts auto changing
142
+ * @param slide
143
+ */
144
+ addSlide(slide) {
145
+ this._slides.add(slide);
146
+ if (this.multilist && this._slides.length <= this.itemsPerSlide) {
147
+ slide.active = true;
148
+ }
149
+ if (!this.multilist && this.isAnimated) {
150
+ slide.isAnimated = true;
151
+ }
152
+ if (!this.multilist && this._slides.length === 1) {
153
+ this._currentActiveSlide = undefined;
154
+ if (!this.customActiveSlide) {
155
+ this.activeSlide = 0;
156
+ }
157
+ this.play();
158
+ }
159
+ if (this.multilist && this._slides.length > this.itemsPerSlide) {
160
+ this.play();
161
+ }
162
+ }
163
+ /**
164
+ * Removes specified slide. If this slide is active - will roll to another
165
+ * slide
166
+ * @param slide
167
+ */
168
+ removeSlide(slide) {
169
+ const remIndex = this._slides.indexOf(slide);
170
+ if (this._currentActiveSlide === remIndex) {
171
+ // removing of active slide
172
+ let nextSlideIndex;
173
+ if (this._slides.length > 1) {
174
+ // if this slide last - will roll to first slide, if noWrap flag is
175
+ // FALSE or to previous, if noWrap is TRUE in case, if this slide in
176
+ // middle of collection, index of next slide is same to removed
177
+ nextSlideIndex = !this.isLast(remIndex)
178
+ ? remIndex
179
+ : this.noWrap ? remIndex - 1 : 0;
180
+ }
181
+ this._slides.remove(remIndex);
182
+ // prevents exception with changing some value after checking
183
+ setTimeout(() => {
184
+ this._select(nextSlideIndex);
185
+ }, 0);
186
+ }
187
+ else {
188
+ this._slides.remove(remIndex);
189
+ const currentSlideIndex = this.getCurrentSlideIndex();
190
+ setTimeout(() => {
191
+ // after removing, need to actualize index of current active slide
192
+ this._currentActiveSlide = currentSlideIndex;
193
+ this.activeSlideChange.emit(this._currentActiveSlide);
194
+ }, 0);
195
+ }
196
+ }
197
+ nextSlideFromInterval(force = false) {
198
+ this.move(Direction.NEXT, force);
199
+ }
200
+ /**
201
+ * Rolling to next slide
202
+ * @param force: {boolean} if true - will ignore noWrap flag
203
+ */
204
+ nextSlide(force = false) {
205
+ if (this.isPlaying) {
206
+ this.restartTimer();
207
+ }
208
+ this.move(Direction.NEXT, force);
209
+ }
210
+ /**
211
+ * Rolling to previous slide
212
+ * @param force: {boolean} if true - will ignore noWrap flag
213
+ */
214
+ previousSlide(force = false) {
215
+ if (this.isPlaying) {
216
+ this.restartTimer();
217
+ }
218
+ this.move(Direction.PREV, force);
219
+ }
220
+ getFirstVisibleIndex() {
221
+ return this.slides.findIndex(this.getActive);
222
+ }
223
+ getLastVisibleIndex() {
224
+ return findLastIndex(this.slides, this.getActive);
225
+ }
226
+ move(direction, force = false) {
227
+ const firstVisibleIndex = this.getFirstVisibleIndex();
228
+ const lastVisibleIndex = this.getLastVisibleIndex();
229
+ if (this.noWrap) {
230
+ if (direction === Direction.NEXT &&
231
+ this.isLast(lastVisibleIndex) ||
232
+ direction === Direction.PREV &&
233
+ firstVisibleIndex === 0) {
234
+ return;
235
+ }
236
+ }
237
+ if (!this.multilist) {
238
+ this.activeSlide = this.findNextSlideIndex(direction, force) || 0;
239
+ }
240
+ else {
241
+ this.moveMultilist(direction);
242
+ }
243
+ }
244
+ /**
245
+ * Swith slides by enter, space and arrows keys
246
+ * @internal
247
+ */
248
+ keydownPress(event) {
249
+ if (event.keyCode === 13 || event.key === 'Enter' || event.keyCode === 32 || event.key === 'Space') {
250
+ this.nextSlide();
251
+ event.preventDefault();
252
+ return;
253
+ }
254
+ if (event.keyCode === 37 || event.key === 'LeftArrow') {
255
+ this.previousSlide();
256
+ return;
257
+ }
258
+ if (event.keyCode === 39 || event.key === 'RightArrow') {
259
+ this.nextSlide();
260
+ return;
261
+ }
262
+ }
263
+ /**
264
+ * Play on mouse leave
265
+ * @internal
266
+ */
267
+ onMouseLeave() {
268
+ if (!this.pauseOnFocus) {
269
+ this.play();
270
+ }
271
+ }
272
+ /**
273
+ * Play on mouse up
274
+ * @internal
275
+ */
276
+ onMouseUp() {
277
+ if (!this.pauseOnFocus) {
278
+ this.play();
279
+ }
280
+ }
281
+ /**
282
+ * When slides on focus autoplay is stopped(optional)
283
+ * @internal
284
+ */
285
+ pauseFocusIn() {
286
+ if (this.pauseOnFocus) {
287
+ this.isPlaying = false;
288
+ this.resetTimer();
289
+ }
290
+ }
291
+ /**
292
+ * When slides out of focus autoplay is started
293
+ * @internal
294
+ */
295
+ pauseFocusOut() {
296
+ this.play();
297
+ }
298
+ /**
299
+ * Rolling to specified slide
300
+ * @param index: {number} index of slide, which must be shown
301
+ */
302
+ selectSlide(index) {
303
+ if (this.isPlaying) {
304
+ this.restartTimer();
305
+ }
306
+ if (!this.multilist) {
307
+ this.activeSlide = this.indicatorsByChunk ? index * this.itemsPerSlide : index;
308
+ }
309
+ else {
310
+ this.selectSlideRange(this.indicatorsByChunk ? index * this.itemsPerSlide : index);
311
+ }
312
+ }
313
+ /**
314
+ * Starts a auto changing of slides
315
+ */
316
+ play() {
317
+ if (!this.isPlaying) {
318
+ this.isPlaying = true;
319
+ this.restartTimer();
320
+ }
321
+ }
322
+ /**
323
+ * Stops a auto changing of slides
324
+ */
325
+ pause() {
326
+ if (!this.noPause) {
327
+ this.isPlaying = false;
328
+ this.resetTimer();
329
+ }
330
+ }
331
+ /**
332
+ * Finds and returns index of currently displayed slide
333
+ */
334
+ getCurrentSlideIndex() {
335
+ return this._slides.findIndex(this.getActive);
336
+ }
337
+ /**
338
+ * Defines, whether the specified index is last in collection
339
+ * @param index
340
+ */
341
+ isLast(index) {
342
+ return index + 1 >= this._slides.length;
343
+ }
344
+ /**
345
+ * Defines, whether the specified index is first in collection
346
+ * @param index
347
+ */
348
+ isFirst(index) {
349
+ return index === 0;
350
+ }
351
+ indicatorsSlides() {
352
+ return this.slides.filter((slide, index) => !this.indicatorsByChunk || index % this.itemsPerSlide === 0);
353
+ }
354
+ selectInitialSlides() {
355
+ const startIndex = this.startFromIndex <= this._slides.length
356
+ ? this.startFromIndex
357
+ : 0;
358
+ this.hideSlides();
359
+ if (this.singleSlideOffset) {
360
+ this._slidesWithIndexes = this.mapSlidesAndIndexes();
361
+ if (this._slides.length - startIndex < this.itemsPerSlide) {
362
+ const slidesToAppend = this._slidesWithIndexes.slice(0, startIndex);
363
+ this._slidesWithIndexes = [
364
+ ...this._slidesWithIndexes,
365
+ ...slidesToAppend
366
+ ]
367
+ .slice(slidesToAppend.length)
368
+ .slice(0, this.itemsPerSlide);
369
+ }
370
+ else {
371
+ this._slidesWithIndexes = this._slidesWithIndexes.slice(startIndex, startIndex + this.itemsPerSlide);
372
+ }
373
+ this._slidesWithIndexes.forEach((slide) => slide.item.active = true);
374
+ this.makeSlidesConsistent(this._slidesWithIndexes);
375
+ }
376
+ else {
377
+ this.selectRangeByNestedIndex(startIndex);
378
+ }
379
+ this.slideRangeChange.emit(this.getVisibleIndexes());
380
+ }
381
+ /**
382
+ * Defines next slide index, depending of direction
383
+ * @param direction: Direction(UNKNOWN|PREV|NEXT)
384
+ * @param force: {boolean} if TRUE - will ignore noWrap flag, else will
385
+ * return undefined if next slide require wrapping
386
+ */
387
+ findNextSlideIndex(direction, force) {
388
+ let nextSlideIndex = 0;
389
+ if (!force &&
390
+ (this.isLast(this.activeSlide) &&
391
+ direction !== Direction.PREV &&
392
+ this.noWrap)) {
393
+ return;
394
+ }
395
+ switch (direction) {
396
+ case Direction.NEXT:
397
+ // if this is last slide, not force, looping is disabled
398
+ // and need to going forward - select current slide, as a next
399
+ if (typeof this._currentActiveSlide === 'undefined') {
400
+ nextSlideIndex = 0;
401
+ break;
402
+ }
403
+ if (!this.isLast(this._currentActiveSlide)) {
404
+ nextSlideIndex = this._currentActiveSlide + 1;
405
+ break;
406
+ }
407
+ nextSlideIndex = !force && this.noWrap ? this._currentActiveSlide : 0;
408
+ break;
409
+ case Direction.PREV:
410
+ // if this is first slide, not force, looping is disabled
411
+ // and need to going backward - select current slide, as a next
412
+ if (typeof this._currentActiveSlide === 'undefined') {
413
+ nextSlideIndex = 0;
414
+ break;
415
+ }
416
+ if (this._currentActiveSlide > 0) {
417
+ nextSlideIndex = this._currentActiveSlide - 1;
418
+ break;
419
+ }
420
+ if (!force && this.noWrap) {
421
+ nextSlideIndex = this._currentActiveSlide;
422
+ break;
423
+ }
424
+ nextSlideIndex = this._slides.length - 1;
425
+ break;
426
+ default:
427
+ throw new Error('Unknown direction');
428
+ }
429
+ return nextSlideIndex;
430
+ }
431
+ mapSlidesAndIndexes() {
432
+ return this.slides
433
+ .slice()
434
+ .map((slide, index) => {
435
+ return {
436
+ index,
437
+ item: slide
438
+ };
439
+ });
440
+ }
441
+ selectSlideRange(index) {
442
+ if (this.isIndexInRange(index)) {
443
+ return;
444
+ }
445
+ this.hideSlides();
446
+ if (!this.singleSlideOffset) {
447
+ this.selectRangeByNestedIndex(index);
448
+ }
449
+ else {
450
+ const startIndex = this.isIndexOnTheEdges(index)
451
+ ? index
452
+ : index - this.itemsPerSlide + 1;
453
+ const endIndex = this.isIndexOnTheEdges(index)
454
+ ? index + this.itemsPerSlide
455
+ : index + 1;
456
+ this._slidesWithIndexes = this.mapSlidesAndIndexes().slice(startIndex, endIndex);
457
+ this.makeSlidesConsistent(this._slidesWithIndexes);
458
+ this._slidesWithIndexes.forEach((slide) => slide.item.active = true);
459
+ }
460
+ this.slideRangeChange.emit(this.getVisibleIndexes());
461
+ }
462
+ selectRangeByNestedIndex(index) {
463
+ if (!this._chunkedSlides) {
464
+ return;
465
+ }
466
+ const selectedRange = this._chunkedSlides
467
+ .map((slidesList, i) => {
468
+ return {
469
+ index: i,
470
+ list: slidesList
471
+ };
472
+ })
473
+ .find((slidesList) => {
474
+ return slidesList.list.find(slide => slide.index === index) !== undefined;
475
+ });
476
+ if (!selectedRange) {
477
+ return;
478
+ }
479
+ this._currentVisibleSlidesIndex = selectedRange.index;
480
+ this._chunkedSlides[selectedRange.index].forEach((slide) => {
481
+ slide.item.active = true;
482
+ });
483
+ }
484
+ isIndexOnTheEdges(index) {
485
+ return (index + 1 - this.itemsPerSlide <= 0 ||
486
+ index + this.itemsPerSlide <= this._slides.length);
487
+ }
488
+ isIndexInRange(index) {
489
+ if (this.singleSlideOffset && this._slidesWithIndexes) {
490
+ const visibleIndexes = this._slidesWithIndexes.map((slide) => slide.index);
491
+ return visibleIndexes.indexOf(index) >= 0;
492
+ }
493
+ return (index <= this.getLastVisibleIndex() &&
494
+ index >= this.getFirstVisibleIndex());
495
+ }
496
+ hideSlides() {
497
+ this.slides.forEach((slide) => slide.active = false);
498
+ }
499
+ isVisibleSlideListLast() {
500
+ if (!this._chunkedSlides) {
501
+ return false;
502
+ }
503
+ return this._currentVisibleSlidesIndex === this._chunkedSlides.length - 1;
504
+ }
505
+ isVisibleSlideListFirst() {
506
+ return this._currentVisibleSlidesIndex === 0;
507
+ }
508
+ moveSliderByOneItem(direction) {
509
+ let firstVisibleIndex;
510
+ let lastVisibleIndex;
511
+ let indexToHide;
512
+ let indexToShow;
513
+ if (this.noWrap) {
514
+ firstVisibleIndex = this.getFirstVisibleIndex();
515
+ lastVisibleIndex = this.getLastVisibleIndex();
516
+ indexToHide = direction === Direction.NEXT
517
+ ? firstVisibleIndex
518
+ : lastVisibleIndex;
519
+ indexToShow = direction !== Direction.NEXT
520
+ ? firstVisibleIndex - 1
521
+ : !this.isLast(lastVisibleIndex)
522
+ ? lastVisibleIndex + 1 : 0;
523
+ const slideToHide = this._slides.get(indexToHide);
524
+ if (slideToHide) {
525
+ slideToHide.active = false;
526
+ }
527
+ const slideToShow = this._slides.get(indexToShow);
528
+ if (slideToShow) {
529
+ slideToShow.active = true;
530
+ }
531
+ const slidesToReorder = this.mapSlidesAndIndexes().filter((slide) => slide.item.active);
532
+ this.makeSlidesConsistent(slidesToReorder);
533
+ if (this.singleSlideOffset) {
534
+ this._slidesWithIndexes = slidesToReorder;
535
+ }
536
+ this.slideRangeChange.emit(this.getVisibleIndexes());
537
+ return;
538
+ }
539
+ if (!this._slidesWithIndexes || !this._slidesWithIndexes[0]) {
540
+ return;
541
+ }
542
+ let index;
543
+ firstVisibleIndex = this._slidesWithIndexes[0].index;
544
+ lastVisibleIndex = this._slidesWithIndexes[this._slidesWithIndexes.length - 1].index;
545
+ if (direction === Direction.NEXT) {
546
+ this._slidesWithIndexes.shift();
547
+ index = this.isLast(lastVisibleIndex)
548
+ ? 0
549
+ : lastVisibleIndex + 1;
550
+ const item = this._slides.get(index);
551
+ if (item) {
552
+ this._slidesWithIndexes.push({ index, item });
553
+ }
554
+ }
555
+ else {
556
+ this._slidesWithIndexes.pop();
557
+ index = this.isFirst(firstVisibleIndex)
558
+ ? this._slides.length - 1
559
+ : firstVisibleIndex - 1;
560
+ const item = this._slides.get(index);
561
+ if (item) {
562
+ this._slidesWithIndexes = [{ index, item }, ...this._slidesWithIndexes];
563
+ }
564
+ }
565
+ this.hideSlides();
566
+ this._slidesWithIndexes.forEach(slide => slide.item.active = true);
567
+ this.makeSlidesConsistent(this._slidesWithIndexes);
568
+ this.slideRangeChange.emit(this._slidesWithIndexes.map((slide) => slide.index));
569
+ }
570
+ moveMultilist(direction) {
571
+ if (this.singleSlideOffset) {
572
+ this.moveSliderByOneItem(direction);
573
+ }
574
+ else {
575
+ this.hideSlides();
576
+ if (this.noWrap) {
577
+ this._currentVisibleSlidesIndex = direction === Direction.NEXT
578
+ ? this._currentVisibleSlidesIndex + 1
579
+ : this._currentVisibleSlidesIndex - 1;
580
+ }
581
+ else if (direction === Direction.NEXT) {
582
+ this._currentVisibleSlidesIndex = this.isVisibleSlideListLast()
583
+ ? 0
584
+ : this._currentVisibleSlidesIndex + 1;
585
+ }
586
+ else {
587
+ if (this.isVisibleSlideListFirst()) {
588
+ this._currentVisibleSlidesIndex = this._chunkedSlides
589
+ ? this._chunkedSlides.length - 1
590
+ : 0;
591
+ }
592
+ else {
593
+ this._currentVisibleSlidesIndex = this._currentVisibleSlidesIndex - 1;
594
+ }
595
+ }
596
+ if (this._chunkedSlides) {
597
+ this._chunkedSlides[this._currentVisibleSlidesIndex].forEach((slide) => slide.item.active = true);
598
+ }
599
+ this.slideRangeChange.emit(this.getVisibleIndexes());
600
+ }
601
+ }
602
+ getVisibleIndexes() {
603
+ if (!this.singleSlideOffset && this._chunkedSlides) {
604
+ return this._chunkedSlides[this._currentVisibleSlidesIndex]
605
+ .map((slide) => slide.index);
606
+ }
607
+ if (this._slidesWithIndexes) {
608
+ return this._slidesWithIndexes.map((slide) => slide.index);
609
+ }
610
+ }
611
+ /**
612
+ * Sets a slide, which specified through index, as active
613
+ * @param index
614
+ */
615
+ _select(index) {
616
+ if (isNaN(index)) {
617
+ this.pause();
618
+ return;
619
+ }
620
+ if (!this.multilist && typeof this._currentActiveSlide !== 'undefined') {
621
+ const currentSlide = this._slides.get(this._currentActiveSlide);
622
+ if (typeof currentSlide !== 'undefined') {
623
+ currentSlide.active = false;
624
+ }
625
+ }
626
+ const nextSlide = this._slides.get(index);
627
+ if (typeof nextSlide !== 'undefined') {
628
+ this._currentActiveSlide = index;
629
+ nextSlide.active = true;
630
+ this.activeSlide = index;
631
+ this.activeSlideChange.emit(index);
632
+ }
633
+ }
634
+ /**
635
+ * Starts loop of auto changing of slides
636
+ */
637
+ restartTimer() {
638
+ this.resetTimer();
639
+ const interval = +this.interval;
640
+ if (!isNaN(interval) && interval > 0 && isPlatformBrowser(this.platformId)) {
641
+ this.currentInterval = this.ngZone.runOutsideAngular(() => {
642
+ return window.setInterval(() => {
643
+ const nInterval = +this.interval;
644
+ this.ngZone.run(() => {
645
+ if (this.isPlaying &&
646
+ !isNaN(this.interval) &&
647
+ nInterval > 0 &&
648
+ this.slides.length) {
649
+ this.nextSlideFromInterval();
650
+ }
651
+ else {
652
+ this.pause();
653
+ }
654
+ });
655
+ }, interval);
656
+ });
657
+ }
658
+ }
659
+ get multilist() {
660
+ return this.itemsPerSlide > 1;
661
+ }
662
+ /**
663
+ * Stops loop of auto changing of slides
664
+ */
665
+ resetTimer() {
666
+ if (this.currentInterval) {
667
+ clearInterval(this.currentInterval);
668
+ this.currentInterval = void 0;
669
+ }
670
+ }
671
+ checkDisabledClass(buttonType) {
672
+ if (buttonType === 'prev') {
673
+ return (this.activeSlide === 0 && this.noWrap && !this.multilist) || (this.isFirstSlideVisible && this.noWrap && this.multilist);
674
+ }
675
+ return (this.isLast(this.activeSlide) && this.noWrap && !this.multilist) || (this.isLastSlideVisible && this.noWrap && this.multilist);
676
+ }
677
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: CarouselComponent, deps: [{ token: i1.CarouselConfig }, { token: i0.NgZone }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
678
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: CarouselComponent, selector: "carousel", inputs: { noWrap: "noWrap", noPause: "noPause", showIndicators: "showIndicators", pauseOnFocus: "pauseOnFocus", indicatorsByChunk: "indicatorsByChunk", itemsPerSlide: "itemsPerSlide", singleSlideOffset: "singleSlideOffset", isAnimated: "isAnimated", activeSlide: "activeSlide", startFromIndex: "startFromIndex", interval: "interval" }, outputs: { activeSlideChange: "activeSlideChange", slideRangeChange: "slideRangeChange" }, ngImport: i0, template: "<div (mouseenter)=\"pause()\"\n (mouseleave)=\"onMouseLeave()\"\n (mouseup)=\"onMouseUp()\"\n (keydown)=\"keydownPress($event)\"\n (focusin)=\"pauseFocusIn()\"\n (focusout)=\"pauseFocusOut()\"\n [id]=\"'carousel' + currentId\"\n class=\"carousel slide\" tabindex=\"0\">\n <ng-container *ngIf=\"!_bsVer.isBs5 && showIndicators && slides.length > 1\">\n <ol class=\"carousel-indicators\">\n <li *ngFor=\"let slide of indicatorsSlides(); let i = index;\"\n [class.active]=\"slide.active === true\"\n (click)=\"selectSlide(i)\">\n </li>\n </ol>\n </ng-container>\n <ng-container *ngIf=\"_bsVer.isBs5 && showIndicators && slides.length > 1\">\n <div class=\"carousel-indicators\">\n <button\n *ngFor=\"let slide of indicatorsSlides(); let i = index;\"\n [class.active]=\"slide.active === true\"\n (click)=\"selectSlide(i)\"\n type=\"button\"\n [attr.data-bs-target]=\"'#carousel' + currentId\"\n [attr.data-bs-slide-to]=\"i\" aria-current=\"true\"\n >\n </button>\n </div>\n </ng-container>\n <div class=\"carousel-inner\" [ngStyle]=\"{'display': multilist ? 'flex' : 'block'}\">\n <ng-content></ng-content>\n </div>\n <a class=\"left carousel-control carousel-control-prev\"\n href=\"javascript:void(0);\"\n [class.disabled]=\"checkDisabledClass('prev')\"\n [attr.data-bs-target]=\"'#carousel' + currentId\"\n *ngIf=\"slides.length > 1\"\n (click)=\"previousSlide()\"\n tabindex=\"0\" role=\"button\">\n <span class=\"icon-prev carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n <span class=\"sr-only visually-hidden\">Previous</span>\n </a>\n\n <a class=\"right carousel-control carousel-control-next\"\n href=\"javascript:void(0);\"\n *ngIf=\"slides.length > 1\"\n (click)=\"nextSlide()\"\n [class.disabled]=\"checkDisabledClass('next')\"\n [attr.data-bs-target]=\"'#carousel' + currentId\"\n tabindex=\"0\" role=\"button\">\n <span class=\"icon-next carousel-control-next-icon\" aria-hidden=\"true\"></span>\n <span class=\"sr-only visually-hidden\">Next</span>\n </a>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
679
+ }
680
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: CarouselComponent, decorators: [{
681
+ type: Component,
682
+ args: [{ selector: 'carousel', template: "<div (mouseenter)=\"pause()\"\n (mouseleave)=\"onMouseLeave()\"\n (mouseup)=\"onMouseUp()\"\n (keydown)=\"keydownPress($event)\"\n (focusin)=\"pauseFocusIn()\"\n (focusout)=\"pauseFocusOut()\"\n [id]=\"'carousel' + currentId\"\n class=\"carousel slide\" tabindex=\"0\">\n <ng-container *ngIf=\"!_bsVer.isBs5 && showIndicators && slides.length > 1\">\n <ol class=\"carousel-indicators\">\n <li *ngFor=\"let slide of indicatorsSlides(); let i = index;\"\n [class.active]=\"slide.active === true\"\n (click)=\"selectSlide(i)\">\n </li>\n </ol>\n </ng-container>\n <ng-container *ngIf=\"_bsVer.isBs5 && showIndicators && slides.length > 1\">\n <div class=\"carousel-indicators\">\n <button\n *ngFor=\"let slide of indicatorsSlides(); let i = index;\"\n [class.active]=\"slide.active === true\"\n (click)=\"selectSlide(i)\"\n type=\"button\"\n [attr.data-bs-target]=\"'#carousel' + currentId\"\n [attr.data-bs-slide-to]=\"i\" aria-current=\"true\"\n >\n </button>\n </div>\n </ng-container>\n <div class=\"carousel-inner\" [ngStyle]=\"{'display': multilist ? 'flex' : 'block'}\">\n <ng-content></ng-content>\n </div>\n <a class=\"left carousel-control carousel-control-prev\"\n href=\"javascript:void(0);\"\n [class.disabled]=\"checkDisabledClass('prev')\"\n [attr.data-bs-target]=\"'#carousel' + currentId\"\n *ngIf=\"slides.length > 1\"\n (click)=\"previousSlide()\"\n tabindex=\"0\" role=\"button\">\n <span class=\"icon-prev carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n <span class=\"sr-only visually-hidden\">Previous</span>\n </a>\n\n <a class=\"right carousel-control carousel-control-next\"\n href=\"javascript:void(0);\"\n *ngIf=\"slides.length > 1\"\n (click)=\"nextSlide()\"\n [class.disabled]=\"checkDisabledClass('next')\"\n [attr.data-bs-target]=\"'#carousel' + currentId\"\n tabindex=\"0\" role=\"button\">\n <span class=\"icon-next carousel-control-next-icon\" aria-hidden=\"true\"></span>\n <span class=\"sr-only visually-hidden\">Next</span>\n </a>\n</div>\n" }]
683
+ }], ctorParameters: function () { return [{ type: i1.CarouselConfig }, { type: i0.NgZone }, { type: undefined, decorators: [{
684
+ type: Inject,
685
+ args: [PLATFORM_ID]
686
+ }] }]; }, propDecorators: { noWrap: [{
687
+ type: Input
688
+ }], noPause: [{
689
+ type: Input
690
+ }], showIndicators: [{
691
+ type: Input
692
+ }], pauseOnFocus: [{
693
+ type: Input
694
+ }], indicatorsByChunk: [{
695
+ type: Input
696
+ }], itemsPerSlide: [{
697
+ type: Input
698
+ }], singleSlideOffset: [{
699
+ type: Input
700
+ }], isAnimated: [{
701
+ type: Input
702
+ }], activeSlideChange: [{
703
+ type: Output
704
+ }], slideRangeChange: [{
705
+ type: Output
706
+ }], activeSlide: [{
707
+ type: Input
708
+ }], startFromIndex: [{
709
+ type: Input
710
+ }], interval: [{
711
+ type: Input
712
+ }] } });
713
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jYXJvdXNlbC9jYXJvdXNlbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSDs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFDTCxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWEsTUFBTSxFQUFpQixNQUFNLEVBQUUsV0FBVyxFQUM5RixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBYyxNQUFNLHFCQUFxQixDQUFDO0FBRXZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7Ozs7QUFHakUsTUFBTSxDQUFOLElBQVksU0FJWDtBQUpELFdBQVksU0FBUztJQUNuQiwrQ0FBTyxDQUFBO0lBQ1AseUNBQUksQ0FBQTtJQUNKLHlDQUFJLENBQUE7QUFDTixDQUFDLEVBSlcsU0FBUyxLQUFULFNBQVMsUUFJcEI7QUFFRCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFbkI7O0dBRUc7QUFLSCxNQUFNLE9BQU8saUJBQWlCO0lBNEI1Qix3REFBd0Q7SUFDeEQsSUFDSSxXQUFXLENBQUMsS0FBYTtRQUMzQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBRUQsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztTQUNoQztRQUVELElBQUks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Y0FBYztzQkFEYixLQUFLO2dCQVFGLFFBQVE7c0JBRFgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKipcbiAqIHBhdXNlIChub3QgeWV0IHN1cHBvcnRlZCkgKD9zdHJpbmc9J2hvdmVyJykgLSBldmVudCBncm91cCBuYW1lIHdoaWNoIHBhdXNlc1xuICogdGhlIGN5Y2xpbmcgb2YgdGhlIGNhcm91c2VsLCBpZiBob3ZlciBwYXVzZXMgb24gbW91c2VlbnRlciBhbmQgcmVzdW1lcyBvblxuICogbW91c2VsZWF2ZSBrZXlib2FyZCAobm90IHlldCBzdXBwb3J0ZWQpICg/Ym9vbGVhbj10cnVlKSAtIGlmIGZhbHNlXG4gKiBjYXJvdXNlbCB3aWxsIG5vdCByZWFjdCB0byBrZXlib2FyZCBldmVudHNcbiAqIG5vdGU6IHN3aXBpbmcgbm90IHlldCBzdXBwb3J0ZWRcbiAqL1xuLyoqKipcbiAqIFByb2JsZW1zOlxuICogMSkgaWYgd2Ugc2V0IGFuIGFjdGl2ZSBzbGlkZSB2aWEgbW9kZWwgY2hhbmdlcywgLmFjdGl2ZSBjbGFzcyByZW1haW5zIG9uIGFcbiAqIGN1cnJlbnQgc2xpZGUuXG4gKiAyKSBpZiB3ZSBoYXZlIG9ubHkgb25lIHNsaWRlLCB3ZSBzaG91bGRuJ3Qgc2hvdyBwcmV2L25leHQgbmF2IGJ1dHRvbnNcbiAqIDMpIGlmIGZpcnN0IG9yIGxhc3Qgc2xpZGUgaXMgYWN0aXZlIGFuZCBub1dyYXAgaXMgdHJ1ZSwgdGhlcmUgc2hvdWxkIGJlXG4gKiBcImRpc2FibGVkXCIgY2xhc3Mgb24gdGhlIG5hdiBidXR0b25zLlxuICogNCkgZGVmYXVsdCBpbnRlcnZhbCBzaG91bGQgYmUgZXF1YWwgNTAwMFxuICovXG5cbmltcG9ydCB7XG4gIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgTmdab25lLCBPbkRlc3Ryb3ksIE91dHB1dCwgQWZ0ZXJWaWV3SW5pdCwgSW5qZWN0LCBQTEFURk9STV9JRFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgTGlua2VkTGlzdCwgZ2V0QnNWZXIsIElCc1ZlcnNpb24gfSBmcm9tICduZ3gtYm9vdHN0cmFwL3V0aWxzJztcbmltcG9ydCB7IFNsaWRlQ29tcG9uZW50IH0gZnJvbSAnLi9zbGlkZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2Fyb3VzZWxDb25maWcgfSBmcm9tICcuL2Nhcm91c2VsLmNvbmZpZyc7XG5pbXBvcnQgeyBmaW5kTGFzdEluZGV4LCBjaHVua0J5TnVtYmVyLCBpc051bWJlciB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU2xpZGVXaXRoSW5kZXgsIEluZGV4ZWRTbGlkZUxpc3QgfSBmcm9tICcuL21vZGVscyc7XG5cbmV4cG9ydCBlbnVtIERpcmVjdGlvbiB7XG4gIFVOS05PV04sXG4gIE5FWFQsXG4gIFBSRVZcbn1cblxubGV0IF9jdXJyZW50SWQgPSAxO1xuXG4vKipcbiAqIEJhc2UgZWxlbWVudCB0byBjcmVhdGUgY2Fyb3VzZWxcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2Fyb3VzZWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIENhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyogSWYgYHRydWVgIOKAlCBjYXJvdXNlbCB3aWxsIG5vdCBjeWNsZSBjb250aW51b3VzbHkgYW5kIHdpbGwgaGF2ZSBoYXJkIHN0b3BzIChwcmV2ZW50IGxvb3BpbmcpICovXG4gIEBJbnB1dCgpIG5vV3JhcCA9IGZhbHNlO1xuICAvKiAgSWYgYHRydWVgIOKAlCB3aWxsIGRpc2FibGUgcGF1c2luZyBvbiBjYXJvdXNlbCBtb3VzZSBob3ZlciAqL1xuICBASW5wdXQoKSBub1BhdXNlID0gZmFsc2U7XG4gIC8qICBJZiBgdHJ1ZWAg4oCUIGNhcm91c2VsLWluZGljYXRvcnMgYXJlIHZpc2libGUgICovXG4gIEBJbnB1dCgpIHNob3dJbmRpY2F0b3JzID0gdHJ1ZTtcbiAgLyogIElmIGB0cnVlYCAtIGF1dG9wbGF5IHdpbGwgYmUgc3RvcHBlZCBvbiBmb2N1cyAqL1xuICBASW5wdXQoKSBwYXVzZU9uRm9jdXMgPSBmYWxzZTtcbiAgLyogSWYgYHRydWVgIC0gY2Fyb3VzZWwgaW5kaWNhdG9ycyBpbmRpY2F0ZSBzbGlkZXMgY2h1bmtzXG4gICAgIHdvcmtzIE9OTFkgaWYgc2luZ2xlU2xpZGVPZmZzZXQgPSBGQUxTRSAqL1xuICBASW5wdXQoKSBpbmRpY2F0b3JzQnlDaHVuayA9IGZhbHNlO1xuICAvKiBJZiB2YWx1ZSBtb3JlIHRoZW4gMSDigJQgY2Fyb3VzZWwgd29ya3MgaW4gbXVsdGlsaXN0IG1vZGUgKi9cbiAgQElucHV0KCkgaXRlbXNQZXJTbGlkZSA9IDE7XG4gIC8qIElmIGB0cnVlYCDigJQgY2Fyb3VzZWwgc2hpZnRzIGJ5IG9uZSBlbGVtZW50LiBCeSBkZWZhdWx0IGNhcm91c2VsIHNoaWZ0cyBieSBudW1iZXJcbiAgICAgb2YgdmlzaWJsZSBlbGVtZW50cyAoaXRlbXNQZXJTbGlkZSBmaWVsZCkgKi9cbiAgQElucHV0KCkgc2luZ2xlU2xpZGVPZmZzZXQgPSBmYWxzZTtcbiAgLyoqIFR1cm4gb24vb2ZmIGFuaW1hdGlvbi4gQW5pbWF0aW9uIGRvZXNuJ3Qgd29yayBmb3IgbXVsdGlsaXN0IGNhcm91c2VsICovXG4gIEBJbnB1dCgpIGlzQW5pbWF0ZWQgPSBmYWxzZTtcblxuICAvKiogV2lsbCBiZSBlbWl0dGVkIHdoZW4gYWN0aXZlIHNsaWRlIGhhcyBiZWVuIGNoYW5nZWQuIFBhcnQgb2YgdHdvLXdheS1iaW5kYWJsZSBbKGFjdGl2ZVNsaWRlKV0gcHJvcGVydHkgKi9cbiAgQE91dHB1dCgpXG4gIGFjdGl2ZVNsaWRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KGZhbHNlKTtcblxuICAvKiogV2lsbCBiZSBlbWl0dGVkIHdoZW4gYWN0aXZlIHNsaWRlcyBoYXMgYmVlbiBjaGFuZ2VkIGluIG11bHRpbGlzdCBtb2RlICovXG4gIEBPdXRwdXQoKVxuICBzbGlkZVJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXJbXXx2b2lkPigpO1xuXG4gIC8qKiBJbmRleCBvZiBjdXJyZW50bHkgZGlzcGxheWVkIHNsaWRlKHN0YXJ0ZWQgZm9yIDApICovXG4gIEBJbnB1dCgpXG4gIHNldCBhY3RpdmVTbGlkZShpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMubXVsdGlsaXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyKGluZGV4KSkge1xuICAgICAgdGhpcy5jdXN0b21BY3RpdmVTbGlkZSA9IGluZGV4O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zbGlkZXMubGVuZ3RoICYmIGluZGV4ICE9PSB0aGlzLl9jdXJyZW50QWN0aXZlU2xpZGUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdChpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFjdGl2ZVNsaWRlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRBY3RpdmVTbGlkZSB8fCAwO1xuICB9XG5cbiAgLyogSW5kZXggdG8gc3RhcnQgZGlzcGxheSBzbGlkZXMgZnJvbSBpdCAqL1xuICBASW5wdXQoKVxuICBzdGFydEZyb21JbmRleCA9IDA7XG5cbiAgLyoqXG4gICAqIERlbGF5IG9mIGl0ZW0gY3ljbGluZyBpbiBtaWxsaXNlY29uZHMuIElmIGZhbHNlLCBjYXJvdXNlbCB3b24ndCBjeWNsZVxuICAgKiBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGludGVydmFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVydmFsO1xuICB9XG5cbiAgc2V0IGludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9pbnRlcnZhbCA9IHZhbHVlO1xuICAgIHRoaXMucmVzdGFydFRpbWVyKCk7XG4gIH1cblxuICBnZXQgc2xpZGVzKCk6IFNsaWRlQ29tcG9uZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9zbGlkZXMudG9BcnJheSgpO1xuICB9XG5cbiAgZ2V0IGlzRmlyc3RTbGlkZVZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5kZXhlcyA9IHRoaXMuZ2V0VmlzaWJsZUluZGV4ZXMoKTtcbiAgICBpZiAoIWluZGV4ZXMgfHwgKGluZGV4ZXMgaW5zdGFuY2VvZiBBcnJheSAmJiAhaW5kZXhlcy5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4ZXMuaW5jbHVkZXMoMCk7XG4gIH1cblxuICBnZXQgaXNMYXN0U2xpZGVWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLmdldFZpc2libGVJbmRleGVzKCk7XG4gICAgaWYgKCFpbmRleGVzIHx8IChpbmRleGVzIGluc3RhbmNlb2YgQXJyYXkgJiYgIWluZGV4ZXMubGVuZ3RoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleGVzLmluY2x1ZGVzKHRoaXMuX3NsaWRlcy5sZW5ndGggLTEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGN1cnJlbnRJbnRlcnZhbD86IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9jdXJyZW50QWN0aXZlU2xpZGU/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfaW50ZXJ2YWwgPSA1MDAwO1xuICBwcm90ZWN0ZWQgX3NsaWRlczogTGlua2VkTGlzdDxTbGlkZUNvbXBvbmVudD4gPSBuZXcgTGlua2VkTGlzdDxTbGlkZUNvbXBvbmVudD4oKTtcbiAgcHJvdGVjdGVkIF9jaHVua2VkU2xpZGVzPzogU2xpZGVXaXRoSW5kZXhbXVtdO1xuICBwcm90ZWN0ZWQgX3NsaWRlc1dpdGhJbmRleGVzPzogU2xpZGVXaXRoSW5kZXhbXTtcbiAgcHJvdGVjdGVkIF9jdXJyZW50VmlzaWJsZVNsaWRlc0luZGV4ID0gMDtcbiAgcHJvdGVjdGVkIGlzUGxheWluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgZGVzdHJveWVkID0gZmFsc2U7XG4gIHByaXZhdGUgY3VzdG9tQWN0aXZlU2xpZGU/OiBudW1iZXI7XG4gIGN1cnJlbnRJZCA9IDA7XG5cbiAgZ2V0IF9ic1ZlcigpOiBJQnNWZXJzaW9uIHtcbiAgICByZXR1cm4gZ2V0QnNWZXIoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ2Fyb3VzZWxDb25maWcsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsIEBJbmplY3QoUExBVEZPUk1fSUQpIHB1YmxpYyBwbGF0Zm9ybUlkOiBudW1iZXIpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNvbmZpZyk7XG4gICAgdGhpcy5jdXJyZW50SWQgPSBfY3VycmVudElkKys7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zaW5nbGVTbGlkZU9mZnNldCkge1xuICAgICAgICB0aGlzLmluZGljYXRvcnNCeUNodW5rID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tdWx0aWxpc3QpIHtcbiAgICAgICAgdGhpcy5fY2h1bmtlZFNsaWRlcyA9IGNodW5rQnlOdW1iZXIoXG4gICAgICAgICAgdGhpcy5tYXBTbGlkZXNBbmRJbmRleGVzKCksXG4gICAgICAgICAgdGhpcy5pdGVtc1BlclNsaWRlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2VsZWN0SW5pdGlhbFNsaWRlcygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jdXN0b21BY3RpdmVTbGlkZSAmJiAhdGhpcy5tdWx0aWxpc3QpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0KHRoaXMuY3VzdG9tQWN0aXZlU2xpZGUpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbmV3IHNsaWRlLiBJZiB0aGlzIHNsaWRlIGlzIGZpcnN0IGluIGNvbGxlY3Rpb24gLSBzZXQgaXQgYXMgYWN0aXZlXG4gICAqIGFuZCBzdGFydHMgYXV0byBjaGFuZ2luZ1xuICAgKiBAcGFyYW0gc2xpZGVcbiAgICovXG4gIGFkZFNsaWRlKHNsaWRlOiBTbGlkZUNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3NsaWRlcy5hZGQoc2xpZGUpO1xuXG4gICAgaWYgKHRoaXMubXVsdGlsaXN0ICYmIHRoaXMuX3NsaWRlcy5sZW5ndGggPD0gdGhpcy5pdGVtc1BlclNsaWRlKSB7XG4gICAgICBzbGlkZS5hY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5tdWx0aWxpc3QgJiYgdGhpcy5pc0FuaW1hdGVkKSB7XG4gICAgICBzbGlkZS5pc0FuaW1hdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubXVsdGlsaXN0ICYmIHRoaXMuX3NsaWRlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRBY3RpdmVTbGlkZSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICghdGhpcy5jdXN0b21BY3RpdmVTbGlkZSkge1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMucGxheSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm11bHRpbGlzdCAmJiB0aGlzLl9zbGlkZXMubGVuZ3RoID4gdGhpcy5pdGVtc1BlclNsaWRlKSB7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBzcGVjaWZpZWQgc2xpZGUuIElmIHRoaXMgc2xpZGUgaXMgYWN0aXZlIC0gd2lsbCByb2xsIHRvIGFub3RoZXJcbiAgICogc2xpZGVcbiAgICogQHBhcmFtIHNsaWRlXG4gICAqL1xuICByZW1vdmVTbGlkZShzbGlkZTogU2xpZGVDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZW1JbmRleCA9IHRoaXMuX3NsaWRlcy5pbmRleE9mKHNsaWRlKTtcblxuICAgIGlmICh0aGlzLl9jdXJyZW50QWN0aXZlU2xpZGUgPT09IHJlbUluZGV4KSB7XG4gICAgICAvLyByZW1vdmluZyBvZiBhY3RpdmUgc2xpZGVcbiAgICAgIGxldCBuZXh0U2xpZGVJbmRleDogbnVtYmVyO1xuICAgICAgaWYgKHRoaXMuX3NsaWRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIGlmIHRoaXMgc2xpZGUgbGFzdCAtIHdpbGwgcm9sbCB0byBmaXJzdCBzbGlkZSwgaWYgbm9XcmFwIGZsYWcgaXNcbiAgICAgICAgLy8gRkFMU0Ugb3IgdG8gcHJldmlvdXMsIGlmIG5vV3JhcCBpcyBUUlVFIGluIGNhc2UsIGlmIHRoaXMgc2xpZGUgaW5cbiAgICAgICAgLy8gbWlkZGxlIG9mIGNvbGxlY3Rpb24sIGluZGV4IG9mIG5leHQgc2xpZGUgaXMgc2FtZSB0byByZW1vdmVkXG4gICAgICAgIG5leHRTbGlkZUluZGV4ID0gIXRoaXMuaXNMYXN0KHJlbUluZGV4KVxuICAgICAgICAgID8gcmVtSW5kZXhcbiAgICAgICAgICA6IHRoaXMubm9XcmFwID8gcmVtSW5kZXggLSAxIDogMDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NsaWRlcy5yZW1vdmUocmVtSW5kZXgpO1xuXG4gICAgICAvLyBwcmV2ZW50cyBleGNlcHRpb24gd2l0aCBjaGFuZ2luZyBzb21lIHZhbHVlIGFmdGVyIGNoZWNraW5nXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2VsZWN0KG5leHRTbGlkZUluZGV4KTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zbGlkZXMucmVtb3ZlKHJlbUluZGV4KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTbGlkZUluZGV4ID0gdGhpcy5nZXRDdXJyZW50U2xpZGVJbmRleCgpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIGFmdGVyIHJlbW92aW5nLCBuZWVkIHRvIGFjdHVhbGl6ZSBpbmRleCBvZiBjdXJyZW50IGFjdGl2ZSBzbGlkZVxuICAgICAgICB0aGlzLl9jdXJyZW50QWN0aXZlU2xpZGUgPSBjdXJyZW50U2xpZGVJbmRleDtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUNoYW5nZS5lbWl0KHRoaXMuX2N1cnJlbnRBY3RpdmVTbGlkZSk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBuZXh0U2xpZGVGcm9tSW50ZXJ2YWwoZm9yY2UgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMubW92ZShEaXJlY3Rpb24uTkVYVCwgZm9yY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxpbmcgdG8gbmV4dCBzbGlkZVxuICAgKiBAcGFyYW0gZm9yY2U6IHtib29sZWFufSBpZiB0cnVlIC0gd2lsbCBpZ25vcmUgbm9XcmFwIGZsYWdcbiAgICovXG4gIG5leHRTbGlkZShmb3JjZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnJlc3RhcnRUaW1lcigpO1xuICAgIH1cbiAgICB0aGlzLm1vdmUoRGlyZWN0aW9uLk5FWFQsIGZvcmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xsaW5nIHRvIHByZXZpb3VzIHNsaWRlXG4gICAqIEBwYXJhbSBmb3JjZToge2Jvb2xlYW59IGlmIHRydWUgLSB3aWxsIGlnbm9yZSBub1dyYXAgZmxhZ1xuICAgKi9cbiAgcHJldmlvdXNTbGlkZShmb3JjZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnJlc3RhcnRUaW1lcigpO1xuICAgIH1cbiAgICB0aGlzLm1vdmUoRGlyZWN0aW9uLlBSRVYsIGZvcmNlKTtcbiAgfVxuXG4gIGdldEZpcnN0VmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2xpZGVzLmZpbmRJbmRleCh0aGlzLmdldEFjdGl2ZSk7XG4gIH1cblxuICBnZXRMYXN0VmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRMYXN0SW5kZXgodGhpcy5zbGlkZXMsIHRoaXMuZ2V0QWN0aXZlKTtcbiAgfVxuXG4gIGdldEFjdGl2ZSA9IChzbGlkZTogU2xpZGVDb21wb25lbnQpID0+IHNsaWRlLmFjdGl2ZTtcblxuICBtb3ZlKGRpcmVjdGlvbjogRGlyZWN0aW9uLCBmb3JjZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZmlyc3RWaXNpYmxlSW5kZXggPSB0aGlzLmdldEZpcnN0VmlzaWJsZUluZGV4KCk7XG4gICAgY29uc3QgbGFzdFZpc2libGVJbmRleCA9IHRoaXMuZ2V0TGFzdFZpc2libGVJbmRleCgpO1xuXG4gICAgaWYgKHRoaXMubm9XcmFwKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9uLk5FWFQgJiZcbiAgICAgICAgdGhpcy5pc0xhc3QobGFzdFZpc2libGVJbmRleCkgfHxcbiAgICAgICAgZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uUFJFViAmJlxuICAgICAgICBmaXJzdFZpc2libGVJbmRleCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubXVsdGlsaXN0KSB7XG4gICAgICB0aGlzLmFjdGl2ZVNsaWRlID0gdGhpcy5maW5kTmV4dFNsaWRlSW5kZXgoZGlyZWN0aW9uLCBmb3JjZSkgfHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb3ZlTXVsdGlsaXN0KGRpcmVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRoIHNsaWRlcyBieSBlbnRlciwgc3BhY2UgYW5kIGFycm93cyBrZXlzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAga2V5ZG93blByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDEzIHx8IGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXlDb2RlID09PSAzMiB8fCBldmVudC5rZXkgPT09ICdTcGFjZScpIHtcbiAgICAgIHRoaXMubmV4dFNsaWRlKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDM3IHx8IGV2ZW50LmtleSA9PT0gJ0xlZnRBcnJvdycpIHtcbiAgICAgIHRoaXMucHJldmlvdXNTbGlkZSgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDM5IHx8IGV2ZW50LmtleSA9PT0gJ1JpZ2h0QXJyb3cnKSB7XG4gICAgICB0aGlzLm5leHRTbGlkZSgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgb24gbW91c2UgbGVhdmVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhdXNlT25Gb2N1cykge1xuICAgICAgdGhpcy5wbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgb24gbW91c2UgdXBcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbk1vdXNlVXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhdXNlT25Gb2N1cykge1xuICAgICAgdGhpcy5wbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gc2xpZGVzIG9uIGZvY3VzIGF1dG9wbGF5IGlzIHN0b3BwZWQob3B0aW9uYWwpXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcGF1c2VGb2N1c0luKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhdXNlT25Gb2N1cykge1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzZXRUaW1lcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHNsaWRlcyBvdXQgb2YgZm9jdXMgYXV0b3BsYXkgaXMgc3RhcnRlZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHBhdXNlRm9jdXNPdXQoKTogdm9pZCB7XG4gICAgdGhpcy5wbGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGluZyB0byBzcGVjaWZpZWQgc2xpZGVcbiAgICogQHBhcmFtIGluZGV4OiB7bnVtYmVyfSBpbmRleCBvZiBzbGlkZSwgd2hpY2ggbXVzdCBiZSBzaG93blxuICAgKi9cbiAgc2VsZWN0U2xpZGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUGxheWluZykge1xuICAgICAgdGhpcy5yZXN0YXJ0VGltZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubXVsdGlsaXN0KSB7XG4gICAgICB0aGlzLmFjdGl2ZVNsaWRlID0gdGhpcy5pbmRpY2F0b3JzQnlDaHVuayA/IGluZGV4ICogdGhpcy5pdGVtc1BlclNsaWRlIDogaW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0U2xpZGVSYW5nZSh0aGlzLmluZGljYXRvcnNCeUNodW5rID8gaW5kZXggKiB0aGlzLml0ZW1zUGVyU2xpZGUgOiBpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIGF1dG8gY2hhbmdpbmcgb2Ygc2xpZGVzXG4gICAqL1xuICBwbGF5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVzdGFydFRpbWVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIGEgYXV0byBjaGFuZ2luZyBvZiBzbGlkZXNcbiAgICovXG4gIHBhdXNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ub1BhdXNlKSB7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNldFRpbWVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuZCByZXR1cm5zIGluZGV4IG9mIGN1cnJlbnRseSBkaXNwbGF5ZWQgc2xpZGVcbiAgICovXG4gIGdldEN1cnJlbnRTbGlkZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NsaWRlcy5maW5kSW5kZXgodGhpcy5nZXRBY3RpdmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMsIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpbmRleCBpcyBsYXN0IGluIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGluZGV4XG4gICAqL1xuICBpc0xhc3QoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpbmRleCArIDEgPj0gdGhpcy5fc2xpZGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzLCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaW5kZXggaXMgZmlyc3QgaW4gY29sbGVjdGlvblxuICAgKiBAcGFyYW0gaW5kZXhcbiAgICovXG4gIGlzRmlyc3QoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpbmRleCA9PT0gMDtcbiAgfVxuXG4gIGluZGljYXRvcnNTbGlkZXMoKTogU2xpZGVDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2xpZGVzLmZpbHRlcihcbiAgICAgIChzbGlkZTogU2xpZGVDb21wb25lbnQsIGluZGV4OiBudW1iZXIpID0+ICF0aGlzLmluZGljYXRvcnNCeUNodW5rIHx8IGluZGV4ICUgdGhpcy5pdGVtc1BlclNsaWRlID09PSAwXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0SW5pdGlhbFNsaWRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5zdGFydEZyb21JbmRleCA8PSB0aGlzLl9zbGlkZXMubGVuZ3RoXG4gICAgICA/IHRoaXMuc3RhcnRGcm9tSW5kZXhcbiAgICAgIDogMDtcblxuICAgIHRoaXMuaGlkZVNsaWRlcygpO1xuXG4gICAgaWYgKHRoaXMuc2luZ2xlU2xpZGVPZmZzZXQpIHtcbiAgICAgIHRoaXMuX3NsaWRlc1dpdGhJbmRleGVzID0gdGhpcy5tYXBTbGlkZXNBbmRJbmRleGVzKCk7XG5cbiAgICAgIGlmICh0aGlzLl9zbGlkZXMubGVuZ3RoIC0gc3RhcnRJbmRleCA8IHRoaXMuaXRlbXNQZXJTbGlkZSkge1xuICAgICAgICBjb25zdCBzbGlkZXNUb0FwcGVuZCA9IHRoaXMuX3NsaWRlc1dpdGhJbmRleGVzLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuXG4gICAgICAgIHRoaXMuX3NsaWRlc1dpdGhJbmRleGVzID0gW1xuICAgICAgICAgIC4uLnRoaXMuX3NsaWRlc1dpdGhJbmRleGVzLFxuICAgICAgICAgIC4uLnNsaWRlc1RvQXBwZW5kXG4gICAgICAgIF1cbiAgICAgICAgICAuc2xpY2Uoc2xpZGVzVG9BcHBlbmQubGVuZ3RoKVxuICAgICAgICAgIC5zbGljZSgwLCB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2xpZGVzV2l0aEluZGV4ZXMgPSB0aGlzLl9zbGlkZXNXaXRoSW5kZXhlcy5zbGljZShcbiAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgIHN0YXJ0SW5kZXggKyB0aGlzLml0ZW1zUGVyU2xpZGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2xpZGVzV2l0aEluZGV4ZXMuZm9yRWFjaCgoc2xpZGU6IFNsaWRlV2l0aEluZGV4KSA9PiBzbGlkZS5pdGVtLmFjdGl2ZSA9IHRydWUpO1xuICAgICAgdGhpcy5tYWtlU2xpZGVzQ29uc2lzdGVudCh0aGlzLl9zbGlkZXNXaXRoSW5kZXhlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0UmFuZ2VCeU5lc3RlZEluZGV4KHN0YXJ0SW5kZXgpO1xuICAgIH1cblxuICAgIHRoaXMuc2xpZGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuZ2V0VmlzaWJsZUluZGV4ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBuZXh0IHNsaWRlIGluZGV4LCBkZXBlbmRpbmcgb2YgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBkaXJlY3Rpb246IERpcmVjdGlvbihVTktOT1dOfFBSRVZ8TkVYVClcbiAgICogQHBhcmFtIGZvcmNlOiB7Ym9vbGVhbn0gaWYgVFJVRSAtIHdpbGwgaWdub3JlIG5vV3JhcCBmbGFnLCBlbHNlIHdpbGxcbiAgICogICByZXR1cm4gdW5kZWZpbmVkIGlmIG5leHQgc2xpZGUgcmVxdWlyZSB3cmFwcGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBmaW5kTmV4dFNsaWRlSW5kZXgoZGlyZWN0aW9uOiBEaXJlY3Rpb24sIGZvcmNlOiBib29sZWFuKTogbnVtYmVyIHwgdm9pZCB7XG4gICAgbGV0IG5leHRTbGlkZUluZGV4ID0gMDtcblxuICAgIGlmIChcbiAgICAgICFmb3JjZSAmJlxuICAgICAgKHRoaXMuaXNMYXN0KHRoaXMuYWN0aXZlU2xpZGUpICYmXG4gICAgICAgIGRpcmVjdGlvbiAhPT0gRGlyZWN0aW9uLlBSRVYgJiZcbiAgICAgICAgdGhpcy5ub1dyYXApXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgRGlyZWN0aW9uLk5FWFQ6XG4gICAgICAgIC8vIGlmIHRoaXMgaXMgbGFzdCBzbGlkZSwgbm90IGZvcmNlLCBsb29waW5nIGlzIGRpc2FibGVkXG4gICAgICAgIC8vIGFuZCBuZWVkIHRvIGdvaW5nIGZvcndhcmQgLSBzZWxlY3QgY3VycmVudCBzbGlkZSwgYXMgYSBuZXh0XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY3VycmVudEFjdGl2ZVNsaWRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIG5leHRTbGlkZUluZGV4ID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNMYXN0KHRoaXMuX2N1cnJlbnRBY3RpdmVTbGlkZSkpIHtcbiAgICAgICAgICBuZXh0U2xpZGVJbmRleCA9IHRoaXMuX2N1cnJlbnRBY3RpdmVTbGlkZSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dFNsaWRlSW5kZXggPSAhZm9yY2UgJiYgdGhpcy5ub1dyYXAgPyB0aGlzLl9jdXJyZW50QWN0aXZlU2xpZGUgOiAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRGlyZWN0aW9uLlBSRVY6XG4gICAgICAgIC8vIGlmIHRoaXMgaXMgZmlyc3Qgc2xpZGUsIG5vdCBmb3JjZSwgbG9vcGluZyBpcyBkaXNhYmxlZFxuICAgICAgICAvLyBhbmQgbmVlZCB0byBnb2luZyBiYWNrd2FyZCAtIHNlbGVjdCBjdXJyZW50IHNsaWRlLCBhcyBhIG5leHRcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jdXJyZW50QWN0aXZlU2xpZGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbmV4dFNsaWRlSW5kZXggPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50QWN0aXZlU2xpZGUgPiAwKSB7XG4gICAgICAgICAgbmV4dFNsaWRlSW5kZXggPSB0aGlzLl9jdXJyZW50QWN0aXZlU2xpZGUgLSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZm9yY2UgJiYgdGhpcy5ub1dyYXApIHtcbiAgICAgICAgICBuZXh0U2xpZGVJbmRleCA9IHRoaXMuX2N1cnJlbnRBY3RpdmVTbGlkZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXh0U2xpZGVJbmRleCA9IHRoaXMuX3NsaWRlcy5sZW5ndGggLSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBkaXJlY3Rpb24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dFNsaWRlSW5kZXg7XG4gIH1cblxuICBwcml2YXRlIG1hcFNsaWRlc0FuZEluZGV4ZXMoKTogU2xpZGVXaXRoSW5kZXhbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2xpZGVzXG4gICAgICAuc2xpY2UoKVxuICAgICAgLm1hcCgoc2xpZGU6IFNsaWRlQ29tcG9uZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbTogc2xpZGVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cblxuICBwcml2YXRlIHNlbGVjdFNsaWRlUmFuZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5kZXhJblJhbmdlKGluZGV4KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaGlkZVNsaWRlcygpO1xuXG4gICAgaWYgKCF0aGlzLnNpbmdsZVNsaWRlT2Zmc2V0KSB7XG4gICAgICB0aGlzLnNlbGVjdFJhbmdlQnlOZXN0ZWRJbmRleChpbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLmlzSW5kZXhPblRoZUVkZ2VzKGluZGV4KVxuICAgICAgICA/IGluZGV4XG4gICAgICAgIDogaW5kZXggLSB0aGlzLml0ZW1zUGVyU2xpZGUgKyAxO1xuXG4gICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuaXNJbmRleE9uVGhlRWRnZXMoaW5kZXgpXG4gICAgICAgID8gaW5kZXggKyB0aGlzLml0ZW1zUGVyU2xpZGVcbiAgICAgICAgOiBpbmRleCArIDE7XG5cbiAgICAgIHRoaXMuX3NsaWRlc1dpdGhJbmRleGVzID0gdGhpcy5tYXBTbGlkZXNBbmRJbmRleGVzKCkuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgdGhpcy5tYWtlU2xpZGVzQ29uc2lzdGVudCh0aGlzLl9zbGlkZXNXaXRoSW5kZXhlcyk7XG5cbiAgICAgIHRoaXMuX3NsaWRlc1dpdGhJbmRleGVzLmZvckVhY2goKHNsaWRlOiBTbGlkZVdpdGhJbmRleCkgPT4gc2xpZGUuaXRlbS5hY3RpdmUgPSB0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnNsaWRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLmdldFZpc2libGVJbmRleGVzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RSYW5nZUJ5TmVzdGVkSW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY2h1bmtlZFNsaWRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkUmFuZ2UgPSB0aGlzLl9jaHVua2VkU2xpZGVzXG4gICAgICAubWFwKChzbGlkZXNMaXN0LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICBsaXN0OiBzbGlkZXNMaXN0XG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbmQoXG4gICAgICAgIChzbGlkZXNMaXN0OiBJbmRleGVkU2xpZGVMaXN0KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNsaWRlc0xpc3QubGlzdC5maW5kKHNsaWRlID0+IHNsaWRlLmluZGV4ID09PSBpbmRleCkgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgIGlmICghc2VsZWN0ZWRSYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRWaXNpYmxlU2xpZGVzSW5kZXggPSBzZWxlY3RlZFJhbmdlLmluZGV4O1xuXG4gICAgdGhpcy5fY2h1bmtlZFNsaWRlc1tzZWxlY3RlZFJhbmdlLmluZGV4XS5mb3JFYWNoKChzbGlkZTogU2xpZGVXaXRoSW5kZXgpID0+IHtcbiAgICAgIHNsaWRlLml0ZW0uYWN0aXZlID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbmRleE9uVGhlRWRnZXMoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleCArIDEgLSB0aGlzLml0ZW1zUGVyU2xpZGUgPD0gMCB8fFxuICAgICAgaW5kZXggKyB0aGlzLml0ZW1zUGVyU2xpZGUgPD0gdGhpcy5fc2xpZGVzLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlzSW5kZXhJblJhbmdlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zaW5nbGVTbGlkZU9mZnNldCAmJiB0aGlzLl9zbGlkZXNXaXRoSW5kZXhlcykge1xuICAgICAgY29uc3QgdmlzaWJsZUluZGV4ZXMgPSB0aGlzLl9zbGlkZXNXaXRoSW5kZXhlcy5tYXAoKHNsaWRlOiBTbGlkZVdpdGhJbmRleCkgPT4gc2xpZGUuaW5kZXgpO1xuXG4gICAgICByZXR1cm4gdmlzaWJsZUluZGV4ZXMuaW5kZXhPZihpbmRleCkgPj0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgaW5kZXggPD0gdGhpcy5nZXRMYXN0VmlzaWJsZUluZGV4KCkgJiZcbiAgICAgIGluZGV4ID49IHRoaXMuZ2V0Rmlyc3RWaXNpYmxlSW5kZXgoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVTbGlkZXMoKTogdm9pZCB7XG4gICAgdGhpcy5zbGlkZXMuZm9yRWFjaCgoc2xpZGU6IFNsaWRlQ29tcG9uZW50KSA9PiBzbGlkZS5hY3RpdmUgPSBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGlzVmlzaWJsZVNsaWRlTGlzdExhc3QoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9jaHVua2VkU2xpZGVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWaXNpYmxlU2xpZGVzSW5kZXggPT09IHRoaXMuX2NodW5rZWRTbGlkZXMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgaXNWaXNpYmxlU2xpZGVMaXN0Rmlyc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWaXNpYmxlU2xpZGVzSW5kZXggPT09IDA7XG4gIH1cblxuICBwcml2YXRlIG1vdmVTbGlkZXJCeU9uZUl0ZW0oZGlyZWN0aW9uOiBEaXJlY3Rpb24pOiB2b2lkIHtcbiAgICBsZXQgZmlyc3RWaXNpYmxlSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgbGFzdFZpc2libGVJbmRleDogbnVtYmVyO1xuICAgIGxldCBpbmRleFRvSGlkZTogbnVtYmVyO1xuICAgIGxldCBpbmRleFRvU2hvdzogbnVtYmVyO1xuXG4gICAgaWYgKHRoaXMubm9XcmFwKSB7XG4gICAgICBmaXJzdFZpc2libGVJbmRleCA9IHRoaXMuZ2V0Rmlyc3RWaXNpYmxlSW5kZXgoKTtcbiAgICAgIGxhc3RWaXNpYmxlSW5kZXggPSB0aGlzLmdldExhc3RWaXNpYmxlSW5kZXgoKTtcblxuICAgICAgaW5kZXhUb0hpZGUgPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbi5ORVhUXG4gICAgICAgID8gZmlyc3RWaXNpYmxlSW5kZXhcbiAgICAgICAgOiBsYXN0VmlzaWJsZUluZGV4O1xuXG4gICAgICBpbmRleFRvU2hvdyA9IGRpcmVjdGlvbiAhPT0gRGlyZWN0aW9uLk5FWFRcbiAgICAgICAgPyBmaXJzdFZpc2libGVJbmRleCAtIDFcbiAgICAgICAgOiAhdGhpcy5pc0xhc3QobGFzdFZpc2libGVJbmRleClcbiAgICAgICAgICA/IGxhc3RWaXNpYmxlSW5kZXggKyAxIDogMDtcblxuICAgICAgY29uc3Qgc2xpZGVUb0hpZGUgPSB0aGlzLl9zbGlkZXMuZ2V0KGluZGV4VG9IaWRlKTtcbiAgICAgIGlmIChzbGlkZVRvSGlkZSkge1xuICAgICAgICBzbGlkZVRvSGlkZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2xpZGVUb1Nob3cgPSB0aGlzLl9zbGlkZXMuZ2V0KGluZGV4VG9TaG93KTtcbiAgICAgIGlmIChzbGlkZVRvU2hvdykge1xuICAgICAgICBzbGlkZVRvU2hvdy5hY3RpdmUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzbGlkZXNUb1Jlb3JkZXIgPSB0aGlzLm1hcFNsaWRlc0FuZEluZGV4ZXMoKS5maWx0ZXIoXG4gICAgICAgIChzbGlkZTogU2xpZGVXaXRoSW5kZXgpID0+IHNsaWRlLml0ZW0uYWN0aXZlXG4gICAgICApO1xuXG4gICAgICB0aGlzLm1ha2VTbGlkZXNDb25zaXN0ZW50KHNsaWRlc1RvUmVvcmRlcik7XG4gICAgICBpZiAodGhpcy5zaW5nbGVTbGlkZU9mZnNldCkge1xuICAgICAgICB0aGlzLl9zbGlkZXNXaXRoSW5kZXhlcyA9IHNsaWRlc1RvUmVvcmRlcjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zbGlkZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5nZXRWaXNpYmxlSW5kZXhlcygpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NsaWRlc1dpdGhJbmRleGVzIHx8ICF0aGlzLl9zbGlkZXNXaXRoSW5kZXhlc1swXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpbmRleDogbnVtYmVyO1xuXG4gICAgZmlyc3RWaXNpYmxlSW5kZXggPSB0aGlzLl9zbGlkZXNXaXRoSW5kZXhlc1swXS5pbmRleDtcbiAgICBsYXN0VmlzaWJsZUluZGV4ID0gdGhpcy5fc2xpZGVzV2l0aEluZGV4ZXNbdGhpcy5fc2xpZGVzV2l0aEluZGV4ZXMubGVuZ3RoIC0gMV0uaW5kZXg7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uTkVYVCkge1xuICAgICAgdGhpcy5fc2xpZGVzV2l0aEluZGV4ZXMuc2hpZnQoKTtcblxuICAgICAgaW5kZXggPSB0aGlzLmlzTGFzdChsYXN0VmlzaWJsZUluZGV4KVxuICAgICAgICA/IDBcbiAgICAgICAgOiBsYXN0VmlzaWJsZUluZGV4ICsgMTtcblxuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX3NsaWRlcy5nZXQoaW5kZXgpO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICB0aGlzLl9zbGlkZXNXaXRoSW5kZXhlcy5wdXNoKHsgaW5kZXgsIGl0ZW0gfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NsaWRlc1dpdGhJbmRleGVzLnBvcCgpO1xuICAgICAgaW5kZXggPSB0aGlzLmlzRmlyc3QoZmlyc3RWaXNpYmxlSW5kZXgpXG4gICAgICAgID8gdGhpcy5fc2xpZGVzLmxlbmd0aCAtIDFcbiAgICAgICAgOiBmaXJzdFZpc2libGVJbmRleCAtIDE7XG5cbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9zbGlkZXMuZ2V0KGluZGV4KTtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIHRoaXMuX3NsaWRlc1dpdGhJbmRleGVzID0gW3sgaW5kZXgsIGl0ZW0gfSwgLi4udGhpcy5fc2xpZGVzV2l0aEluZGV4ZXNdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGlkZVNsaWRlcygpO1xuXG4gICAgdGhpcy5fc2xpZGVzV2l0aEluZGV4ZXMuZm9yRWFjaChzbGlkZSA9PiBzbGlkZS5pdGVtLmFjdGl2ZSA9IHRydWUpO1xuICAgIHRoaXMubWFrZVNsaWRlc0NvbnNpc3RlbnQodGhpcy5fc2xpZGVzV2l0aEluZGV4ZXMpO1xuXG4gICAgdGhpcy5zbGlkZVJhbmdlQ2hhbmdlLmVtaXQoXG4gICAgICB0aGlzLl9zbGlkZXNXaXRoSW5kZXhlcy5tYXAoKHNsaWRlOiBTbGlkZVdpdGhJbmRleCkgPT4gc2xpZGUuaW5kZXgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVNsaWRlc0NvbnNpc3RlbnQgPSAoc2xpZGVzOiBTbGlkZVdpdGhJbmRleFtdKTogdm9pZCA9PiB7XG4gICAgc2xpZGVzLmZvckVhY2goKHNsaWRlOiBTbGlkZVdpdGhJbmRleCwgaW5kZXg6IG51bWJlcikgPT4gc2xpZGUuaXRlbS5vcmRlciA9IGluZGV4KTtcbiAgfTtcblxuICBwcml2YXRlIG1vdmVNdWx0aWxpc3QoZGlyZWN0aW9uOiBEaXJlY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaW5nbGVTbGlkZU9mZnNldCkge1xuICAgICAgdGhpcy5tb3ZlU2xpZGVyQnlPbmVJdGVtKGRpcmVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZVNsaWRlcygpO1xuXG4gICAgICBpZiAodGhpcy5ub1dyYXApIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFZpc2libGVTbGlkZXNJbmRleCA9IGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9uLk5FWFRcbiAgICAgICAgICA/IHRoaXMuX2N1cnJlbnRWaXNpYmxlU2xpZGVzSW5kZXggKyAxXG4gICAgICAgICAgOiB0aGlzLl9jdXJyZW50VmlzaWJsZVNsaWRlc0luZGV4IC0gMTtcbiAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uTkVYVCkge1xuICAgICAgICB0aGlzLl9jdXJyZW50VmlzaWJsZVNsaWRlc0luZGV4ID0gdGhpcy5pc1Zpc2libGVTbGlkZUxpc3RMYXN0KClcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHRoaXMuX2N1cnJlbnRWaXNpYmxlU2xpZGVzSW5kZXggKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlU2xpZGVMaXN0Rmlyc3QoKSkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRWaXNpYmxlU2xpZGVzSW5kZXggPSB0aGlzLl9jaHVua2VkU2xpZGVzXG4gICAgICAgICAgICA/IHRoaXMuX2NodW5rZWRTbGlkZXMubGVuZ3RoIC0gMVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRWaXNpYmxlU2xpZGVzSW5kZXggPSB0aGlzLl9jdXJyZW50VmlzaWJsZVNsaWRlc0luZGV4IC0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY2h1bmtlZFNsaWRlcykge1xuICAgICAgICB0aGlzLl9jaHVua2VkU2xpZGVzW3RoaXMuX2N1cnJlbnRWaXNpYmxlU2xpZGVzSW5kZXhdLmZvckVhY2goXG4gICAgICAgICAgKHNsaWRlOiBTbGlkZVdpdGhJbmRleCkgPT4gc2xpZGUuaXRlbS5hY3RpdmUgPSB0cnVlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnNsaWRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLmdldFZpc2libGVJbmRleGVzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmlzaWJsZUluZGV4ZXMoKTogbnVtYmVyW10gfCB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2luZ2xlU2xpZGVPZmZzZXQgJiYgdGhpcy5fY2h1bmtlZFNsaWRlcykge1xuICAgICAgcmV0dXJuIHRoaXMuX2NodW5rZWRTbGlkZXNbdGhpcy5fY3VycmVudFZpc2libGVTbGlkZXNJbmRleF1cbiAgICAgICAgLm1hcCgoc2xpZGU6IFNsaWRlV2l0aEluZGV4KSA9PiBzbGlkZS5pbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NsaWRlc1dpdGhJbmRleGVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2xpZGVzV2l0aEluZGV4ZXMubWFwKChzbGlkZTogU2xpZGVXaXRoSW5kZXgpID0+IHNsaWRlLmluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHNsaWRlLCB3aGljaCBzcGVjaWZpZWQgdGhyb3VnaCBpbmRleCwgYXMgYWN0aXZlXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZWN0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaXNOYU4oaW5kZXgpKSB7XG4gICAgICB0aGlzLnBhdXNlKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubXVsdGlsaXN0ICYmIHR5cGVvZiB0aGlzLl9jdXJyZW50QWN0aXZlU2xpZGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2xpZGUgPSB0aGlzLl9zbGlkZXMuZ2V0KHRoaXMuX2N1cnJlbnRBY3RpdmVTbGlkZSk7XG4gICAgICBpZiAodHlwZW9mIGN1cnJlbnRTbGlkZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY3VycmVudFNsaWRlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5leHRTbGlkZSA9IHRoaXMuX3NsaWRlcy5nZXQoaW5kZXgpO1xuXG4gICAgaWYgKHR5cGVvZiBuZXh0U2xpZGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLl9jdXJyZW50QWN0aXZlU2xpZGUgPSBpbmRleDtcbiAgICAgIG5leHRTbGlkZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgdGhpcy5hY3RpdmVTbGlkZSA9IGluZGV4O1xuICAgICAgdGhpcy5hY3RpdmVTbGlkZUNoYW5nZS5lbWl0KGluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGxvb3Agb2YgYXV0byBjaGFuZ2luZyBvZiBzbGlkZXNcbiAgICovXG4gIHByaXZhdGUgcmVzdGFydFRpbWVyKCkge1xuICAgIHRoaXMucmVzZXRUaW1lcigpO1xuICAgIGNvbnN0IGludGVydmFsID0gK3RoaXMuaW50ZXJ2YWw7XG4gICAgaWYgKCFpc05hTihpbnRlcnZhbCkgJiYgaW50ZXJ2YWwgPiAwICYmIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHRoaXMuY3VycmVudEludGVydmFsID0gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXI8bnVtYmVyPigoKSA9PiB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5JbnRlcnZhbCA9ICt0aGlzLmludGVydmFsO1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuaXNQbGF5aW5nICYmXG4gICAgICAgICAgICAgICFpc05hTih0aGlzLmludGVydmFsKSAmJlxuICAgICAgICAgICAgICBuSW50ZXJ2YWwgPiAwICYmXG4gICAgICAgICAgICAgIHRoaXMuc2xpZGVzLmxlbmd0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMubmV4dFNsaWRlRnJvbUludGVydmFsKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGludGVydmFsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBtdWx0aWxpc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNQZXJTbGlkZSA+IDE7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgbG9vcCBvZiBhdXRvIGNoYW5naW5nIG9mIHNsaWRlc1xuICAgKi9cbiAgcHJpdmF0ZSByZXNldFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmN1cnJlbnRJbnRlcnZhbCk7XG4gICAgICB0aGlzLmN1cnJlbnRJbnRlcnZhbCA9IHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICBjaGVja0Rpc2FibGVkQ2xhc3MoYnV0dG9uVHlwZTogJ3ByZXYnIHwgJ25leHQnKTogYm9vbGVhbiB7XG4gICAgaWYgKGJ1dHRvblR5cGUgPT09ICdwcmV2Jykge1xuICAgICAgcmV0dXJuICh0aGlzLmFjdGl2ZVNsaWRlID09PSAwICYmIHRoaXMubm9XcmFwICYmICF0aGlzLm11bHRpbGlzdCkgfHwgKHRoaXMuaXNGaXJzdFNsaWRlVmlzaWJsZSAmJiB0aGlzLm5vV3JhcCAmJiB0aGlzLm11bHRpbGlzdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICh0aGlzLmlzTGFzdCh0aGlzLmFjdGl2ZVNsaWRlKSAmJiB0aGlzLm5vV3JhcCAmJiAhdGhpcy5tdWx0aWxpc3QpIHx8ICh0aGlzLmlzTGFzdFNsaWRlVmlzaWJsZSAmJiB0aGlzLm5vV3JhcCAmJiB0aGlzLm11bHRpbGlzdCk7XG4gIH1cbn1cbiIsIjxkaXYgKG1vdXNlZW50ZXIpPVwicGF1c2UoKVwiXG4gICAgIChtb3VzZWxlYXZlKT1cIm9uTW91c2VMZWF2ZSgpXCJcbiAgICAgKG1vdXNldXApPVwib25Nb3VzZVVwKClcIlxuICAgICAoa2V5ZG93bik9XCJrZXlkb3duUHJlc3MoJGV2ZW50KVwiXG4gICAgIChmb2N1c2luKT1cInBhdXNlRm9jdXNJbigpXCJcbiAgICAgKGZvY3Vzb3V0KT1cInBhdXNlRm9jdXNPdXQoKVwiXG4gICAgIFtpZF09XCInY2Fyb3VzZWwnICsgY3VycmVudElkXCJcbiAgICAgY2xhc3M9XCJjYXJvdXNlbCBzbGlkZVwiIHRhYmluZGV4PVwiMFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIV9ic1Zlci5pc0JzNSAmJiBzaG93SW5kaWNhdG9ycyAmJiBzbGlkZXMubGVuZ3RoID4gMVwiPlxuICAgIDxvbCBjbGFzcz1cImNhcm91c2VsLWluZGljYXRvcnNcIj5cbiAgICAgIDxsaSAqbmdGb3I9XCJsZXQgc2xpZGUgb2YgaW5kaWNhdG9yc1NsaWRlcygpOyBsZXQgaSA9IGluZGV4O1wiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzbGlkZS5hY3RpdmUgPT09IHRydWVcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTbGlkZShpKVwiPlxuICAgICAgPC9saT5cbiAgICA8L29sPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9ic1Zlci5pc0JzNSAmJiBzaG93SW5kaWNhdG9ycyAmJiBzbGlkZXMubGVuZ3RoID4gMVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJvdXNlbC1pbmRpY2F0b3JzXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBzbGlkZSBvZiBpbmRpY2F0b3JzU2xpZGVzKCk7IGxldCBpID0gaW5kZXg7XCJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzbGlkZS5hY3RpdmUgPT09IHRydWVcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0U2xpZGUoaSlcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuZGF0YS1icy10YXJnZXRdPVwiJyNjYXJvdXNlbCcgKyBjdXJyZW50SWRcIlxuICAgICAgICBbYXR0ci5kYXRhLWJzLXNsaWRlLXRvXT1cImlcIiBhcmlhLWN1cnJlbnQ9XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImNhcm91c2VsLWlubmVyXCIgW25nU3R5bGVdPVwieydkaXNwbGF5JzogbXVsdGlsaXN0ID8gJ2ZsZXgnIDogJ2Jsb2NrJ31cIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuICA8YSBjbGFzcz1cImxlZnQgY2Fyb3VzZWwtY29udHJvbCBjYXJvdXNlbC1jb250cm9sLXByZXZcIlxuICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiXG4gICAgIFtjbGFzcy5kaXNhYmxlZF09XCJjaGVja0Rpc2FibGVkQ2xhc3MoJ3ByZXYnKVwiXG4gICAgIFthdHRyLmRhdGEtYnMtdGFyZ2V0XT1cIicjY2Fyb3VzZWwnICsgY3VycmVudElkXCJcbiAgICAgKm5nSWY9XCJzbGlkZXMubGVuZ3RoID4gMVwiXG4gICAgIChjbGljayk9XCJwcmV2aW91c1NsaWRlKClcIlxuICAgICB0YWJpbmRleD1cIjBcIiByb2xlPVwiYnV0dG9uXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJpY29uLXByZXYgY2Fyb3VzZWwtY29udHJvbC1wcmV2LWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5IHZpc3VhbGx5LWhpZGRlblwiPlByZXZpb3VzPC9zcGFuPlxuICA8L2E+XG5cbiAgPGEgY2xhc3M9XCJyaWdodCBjYXJvdXNlbC1jb250cm9sIGNhcm91c2VsLWNvbnRyb2wtbmV4dFwiXG4gICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCJcbiAgICAgKm5nSWY9XCJzbGlkZXMubGVuZ3RoID4gMVwiXG4gICAgIChjbGljayk9XCJuZXh0U2xpZGUoKVwiXG4gICAgIFtjbGFzcy5kaXNhYmxlZF09XCJjaGVja0Rpc2FibGVkQ2xhc3MoJ25leHQnKVwiXG4gICAgIFthdHRyLmRhdGEtYnMtdGFyZ2V0XT1cIicjY2Fyb3VzZWwnICsgY3VycmVudElkXCJcbiAgICAgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiPlxuICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1uZXh0IGNhcm91c2VsLWNvbnRyb2wtbmV4dC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwic3Itb25seSB2aXN1YWxseS1oaWRkZW5cIj5OZXh0PC9zcGFuPlxuICA8L2E+XG48L2Rpdj5cbiJdfQ==