@coreui/angular-pro 4.2.34 → 4.2.37

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 (261) hide show
  1. package/esm2020/lib/accordion/accordion/accordion.component.mjs +4 -4
  2. package/esm2020/lib/accordion/accordion-button/accordion-button.directive.mjs +4 -4
  3. package/esm2020/lib/accordion/accordion-item/accordion-item.component.mjs +4 -4
  4. package/esm2020/lib/accordion/accordion.module.mjs +5 -5
  5. package/esm2020/lib/accordion/accordion.service.mjs +4 -4
  6. package/esm2020/lib/alert/alert-heading.directive.mjs +4 -4
  7. package/esm2020/lib/alert/alert-link.directive.mjs +4 -4
  8. package/esm2020/lib/alert/alert.component.mjs +4 -4
  9. package/esm2020/lib/alert/alert.module.mjs +5 -5
  10. package/esm2020/lib/avatar/avatar.component.mjs +4 -4
  11. package/esm2020/lib/avatar/avatar.module.mjs +5 -5
  12. package/esm2020/lib/backdrop/backdrop.service.mjs +4 -4
  13. package/esm2020/lib/badge/badge.component.mjs +4 -4
  14. package/esm2020/lib/badge/badge.module.mjs +5 -5
  15. package/esm2020/lib/breadcrumb/breadcrumb/breadcrumb.component.mjs +4 -4
  16. package/esm2020/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +4 -4
  17. package/esm2020/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +4 -4
  18. package/esm2020/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.mjs +4 -4
  19. package/esm2020/lib/breadcrumb/breadcrumb.module.mjs +5 -5
  20. package/esm2020/lib/button/button-close.directive.mjs +4 -4
  21. package/esm2020/lib/button/button.directive.mjs +4 -4
  22. package/esm2020/lib/button/button.module.mjs +5 -5
  23. package/esm2020/lib/button-group/button-group/button-group.component.mjs +4 -4
  24. package/esm2020/lib/button-group/button-group.module.mjs +5 -5
  25. package/esm2020/lib/button-group/button-toolbar/button-toolbar.component.mjs +4 -4
  26. package/esm2020/lib/calendar/calendar/calendar-class-view.pipe.mjs +4 -4
  27. package/esm2020/lib/calendar/calendar/calendar.component.mjs +4 -4
  28. package/esm2020/lib/calendar/calendar-month/calendar-class-day.pipe.mjs +4 -4
  29. package/esm2020/lib/calendar/calendar-month/calendar-class-month.pipe.mjs +4 -4
  30. package/esm2020/lib/calendar/calendar-month/calendar-class-year.pipe.mjs +4 -4
  31. package/esm2020/lib/calendar/calendar-month/calendar-day-title.pipe.mjs +4 -4
  32. package/esm2020/lib/calendar/calendar-month/calendar-day.directive.mjs +4 -4
  33. package/esm2020/lib/calendar/calendar-month/calendar-day.pipe.mjs +4 -4
  34. package/esm2020/lib/calendar/calendar-month/calendar-month.component.mjs +4 -4
  35. package/esm2020/lib/calendar/calendar-month/calendar-weekday.pipe.mjs +4 -4
  36. package/esm2020/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +4 -4
  37. package/esm2020/lib/calendar/calendar.module.mjs +5 -5
  38. package/esm2020/lib/calendar/calendar.service.mjs +4 -4
  39. package/esm2020/lib/calendar/calendar.utils.mjs +1 -1
  40. package/esm2020/lib/callout/callout.component.mjs +4 -4
  41. package/esm2020/lib/callout/callout.module.mjs +5 -5
  42. package/esm2020/lib/card/card-body.component.mjs +4 -4
  43. package/esm2020/lib/card/card-footer.component.mjs +4 -4
  44. package/esm2020/lib/card/card-group.component.mjs +4 -4
  45. package/esm2020/lib/card/card-header-actions.component.mjs +4 -4
  46. package/esm2020/lib/card/card-header.component.mjs +4 -4
  47. package/esm2020/lib/card/card-img-overlay/card-img-overlay.component.mjs +4 -4
  48. package/esm2020/lib/card/card-img.directive.mjs +4 -4
  49. package/esm2020/lib/card/card-link.directive.mjs +4 -4
  50. package/esm2020/lib/card/card-subtitle.directive.mjs +4 -4
  51. package/esm2020/lib/card/card-text.directive.mjs +4 -4
  52. package/esm2020/lib/card/card-title.directive.mjs +4 -4
  53. package/esm2020/lib/card/card.component.mjs +4 -4
  54. package/esm2020/lib/card/card.module.mjs +5 -5
  55. package/esm2020/lib/carousel/carousel/carousel.component.mjs +4 -4
  56. package/esm2020/lib/carousel/carousel-caption/carousel-caption.component.mjs +4 -4
  57. package/esm2020/lib/carousel/carousel-control/carousel-control.component.mjs +4 -4
  58. package/esm2020/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +4 -4
  59. package/esm2020/lib/carousel/carousel-inner/carousel-inner.component.mjs +4 -4
  60. package/esm2020/lib/carousel/carousel-item/carousel-item.component.mjs +4 -4
  61. package/esm2020/lib/carousel/carousel-state.mjs +4 -4
  62. package/esm2020/lib/carousel/carousel.config.mjs +4 -4
  63. package/esm2020/lib/carousel/carousel.module.mjs +5 -5
  64. package/esm2020/lib/carousel/carousel.service.mjs +4 -4
  65. package/esm2020/lib/collapse/collapse.directive.mjs +4 -4
  66. package/esm2020/lib/collapse/collapse.module.mjs +5 -5
  67. package/esm2020/lib/date-picker/date-picker.component.mjs +6 -6
  68. package/esm2020/lib/date-picker/date-picker.module.mjs +5 -5
  69. package/esm2020/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +22 -20
  70. package/esm2020/lib/date-range-picker/date-range-picker.module.mjs +5 -5
  71. package/esm2020/lib/dropdown/dropdown/dropdown.component.mjs +7 -7
  72. package/esm2020/lib/dropdown/dropdown-close/dropdown-close.directive.mjs +4 -4
  73. package/esm2020/lib/dropdown/dropdown-divider/dropdown-divider.directive.mjs +4 -4
  74. package/esm2020/lib/dropdown/dropdown-header/dropdown-header.directive.mjs +4 -4
  75. package/esm2020/lib/dropdown/dropdown-item/dropdown-item-plain.directive.mjs +4 -4
  76. package/esm2020/lib/dropdown/dropdown-item/dropdown-item.directive.mjs +4 -4
  77. package/esm2020/lib/dropdown/dropdown-menu/dropdown-menu.directive.mjs +4 -4
  78. package/esm2020/lib/dropdown/dropdown.module.mjs +5 -5
  79. package/esm2020/lib/dropdown/dropdown.service.mjs +4 -4
  80. package/esm2020/lib/element-cover/element-cover.component.mjs +4 -4
  81. package/esm2020/lib/element-cover/element-cover.module.mjs +5 -5
  82. package/esm2020/lib/footer/footer.component.mjs +4 -4
  83. package/esm2020/lib/footer/footer.module.mjs +5 -5
  84. package/esm2020/lib/form/form/form.directive.mjs +4 -4
  85. package/esm2020/lib/form/form-check/form-check-input.directive.mjs +4 -4
  86. package/esm2020/lib/form/form-check/form-check-label.directive.mjs +4 -4
  87. package/esm2020/lib/form/form-check/form-check.component.mjs +4 -4
  88. package/esm2020/lib/form/form-control/form-control.directive.mjs +4 -4
  89. package/esm2020/lib/form/form-feedback/form-feedback.component.mjs +4 -4
  90. package/esm2020/lib/form/form-floating/form-floating.directive.mjs +4 -4
  91. package/esm2020/lib/form/form-label/form-label.directive.mjs +4 -4
  92. package/esm2020/lib/form/form-select/form-select.directive.mjs +4 -4
  93. package/esm2020/lib/form/form-text/form-text.directive.mjs +4 -4
  94. package/esm2020/lib/form/form.module.mjs +5 -5
  95. package/esm2020/lib/form/input-group/input-group.component.mjs +4 -4
  96. package/esm2020/lib/form/input-group-text/input-group-text.directive.mjs +4 -4
  97. package/esm2020/lib/grid/col.component.mjs +4 -4
  98. package/esm2020/lib/grid/col.directive.mjs +4 -4
  99. package/esm2020/lib/grid/container.component.mjs +4 -4
  100. package/esm2020/lib/grid/grid.module.mjs +5 -5
  101. package/esm2020/lib/grid/gutter.directive.mjs +4 -4
  102. package/esm2020/lib/grid/row.component.mjs +4 -4
  103. package/esm2020/lib/grid/row.directive.mjs +4 -4
  104. package/esm2020/lib/header/header/header.component.mjs +4 -4
  105. package/esm2020/lib/header/header-brand/header-brand.component.mjs +4 -4
  106. package/esm2020/lib/header/header-divider/header-divider.component.mjs +4 -4
  107. package/esm2020/lib/header/header-nav/header-nav.component.mjs +4 -4
  108. package/esm2020/lib/header/header-text/header-text.component.mjs +4 -4
  109. package/esm2020/lib/header/header-toggler/header-toggler.directive.mjs +4 -4
  110. package/esm2020/lib/header/header.module.mjs +5 -5
  111. package/esm2020/lib/image/img.directive.mjs +4 -4
  112. package/esm2020/lib/image/img.module.mjs +5 -5
  113. package/esm2020/lib/list-group/list-group-item.directive.mjs +4 -4
  114. package/esm2020/lib/list-group/list-group.directive.mjs +4 -4
  115. package/esm2020/lib/list-group/list-group.module.mjs +5 -5
  116. package/esm2020/lib/loading-button/loading-button.component.mjs +4 -4
  117. package/esm2020/lib/loading-button/loading-button.module.mjs +5 -5
  118. package/esm2020/lib/modal/modal/modal.component.mjs +4 -4
  119. package/esm2020/lib/modal/modal-body/modal-body.component.mjs +4 -4
  120. package/esm2020/lib/modal/modal-content/modal-content.component.mjs +4 -4
  121. package/esm2020/lib/modal/modal-dialog/modal-dialog.component.mjs +4 -4
  122. package/esm2020/lib/modal/modal-dismiss/modal-toggle.directive.mjs +4 -4
  123. package/esm2020/lib/modal/modal-footer/modal-footer.component.mjs +4 -4
  124. package/esm2020/lib/modal/modal-header/modal-header.component.mjs +4 -4
  125. package/esm2020/lib/modal/modal-title/modal-title.directive.mjs +4 -4
  126. package/esm2020/lib/modal/modal.module.mjs +5 -5
  127. package/esm2020/lib/modal/modal.service.mjs +4 -4
  128. package/esm2020/lib/multi-select/multi-select/multi-select-search.directive.mjs +68 -0
  129. package/esm2020/lib/multi-select/multi-select/multi-select.component.mjs +614 -175
  130. package/esm2020/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +5 -5
  131. package/esm2020/lib/multi-select/multi-select-optgroup/multi-select-optgroup-label.component.mjs +4 -4
  132. package/esm2020/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +7 -7
  133. package/esm2020/lib/multi-select/multi-select-option/multi-select-option.component.mjs +194 -59
  134. package/esm2020/lib/multi-select/multi-select-tag/multi-select-tag.component.mjs +15 -8
  135. package/esm2020/lib/multi-select/multi-select.module.mjs +13 -9
  136. package/esm2020/lib/multi-select/multi-select.service.mjs +27 -10
  137. package/esm2020/lib/multi-select/multi-select.type.mjs +1 -1
  138. package/esm2020/lib/multi-select/public_api.mjs +1 -1
  139. package/esm2020/lib/nav/nav-item.component.mjs +4 -4
  140. package/esm2020/lib/nav/nav-link.directive.mjs +4 -4
  141. package/esm2020/lib/nav/nav.component.mjs +4 -4
  142. package/esm2020/lib/nav/nav.module.mjs +5 -5
  143. package/esm2020/lib/navbar/navbar-brand/navbar-brand.directive.mjs +4 -4
  144. package/esm2020/lib/navbar/navbar-nav/navbar-nav.component.mjs +4 -4
  145. package/esm2020/lib/navbar/navbar-text/navbar-text.component.mjs +4 -4
  146. package/esm2020/lib/navbar/navbar-toggler/navbar-toggler.directive.mjs +4 -4
  147. package/esm2020/lib/navbar/navbar.component.mjs +4 -4
  148. package/esm2020/lib/navbar/navbar.module.mjs +5 -5
  149. package/esm2020/lib/offcanvas/offcanvas/offcanvas.component.mjs +4 -4
  150. package/esm2020/lib/offcanvas/offcanvas-body/offcanvas-body.component.mjs +4 -4
  151. package/esm2020/lib/offcanvas/offcanvas-header/offcanvas-header.component.mjs +4 -4
  152. package/esm2020/lib/offcanvas/offcanvas-title/offcanvas-title.directive.mjs +4 -4
  153. package/esm2020/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.mjs +4 -4
  154. package/esm2020/lib/offcanvas/offcanvas.module.mjs +5 -5
  155. package/esm2020/lib/offcanvas/offcanvas.service.mjs +4 -4
  156. package/esm2020/lib/pagination/page-item/page-item.component.mjs +4 -4
  157. package/esm2020/lib/pagination/page-item/page-item.directive.mjs +4 -4
  158. package/esm2020/lib/pagination/page-link/page-link.directive.mjs +4 -4
  159. package/esm2020/lib/pagination/pagination/pagination.component.mjs +4 -4
  160. package/esm2020/lib/pagination/pagination.module.mjs +5 -5
  161. package/esm2020/lib/placeholder/placeholder-animation.directive.mjs +4 -4
  162. package/esm2020/lib/placeholder/placeholder.directive.mjs +4 -4
  163. package/esm2020/lib/placeholder/placeholder.module.mjs +5 -5
  164. package/esm2020/lib/popover/popover/popover.component.mjs +4 -4
  165. package/esm2020/lib/popover/popover.directive.mjs +4 -4
  166. package/esm2020/lib/popover/popover.module.mjs +5 -5
  167. package/esm2020/lib/progress/progress-bar.component.mjs +4 -4
  168. package/esm2020/lib/progress/progress.component.mjs +4 -4
  169. package/esm2020/lib/progress/progress.module.mjs +5 -5
  170. package/esm2020/lib/services/class-toggle.service.mjs +4 -4
  171. package/esm2020/lib/services/intersection.service.mjs +4 -4
  172. package/esm2020/lib/services/listeners.service.mjs +4 -4
  173. package/esm2020/lib/shared/html-attr.directive.mjs +4 -4
  174. package/esm2020/lib/shared/shared.module.mjs +5 -5
  175. package/esm2020/lib/shared/template-id.directive.mjs +4 -4
  176. package/esm2020/lib/sidebar/sidebar/sidebar.component.mjs +4 -4
  177. package/esm2020/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.mjs +4 -4
  178. package/esm2020/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +4 -4
  179. package/esm2020/lib/sidebar/sidebar-footer/sidebar-footer.component.mjs +4 -4
  180. package/esm2020/lib/sidebar/sidebar-header/sidebar-header.component.mjs +4 -4
  181. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.mjs +4 -4
  182. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.mjs +4 -4
  183. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-group.service.mjs +4 -4
  184. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.mjs +4 -4
  185. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.mjs +4 -4
  186. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +4 -4
  187. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +7 -7
  188. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.mjs +4 -4
  189. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-title.component.mjs +4 -4
  190. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +7 -7
  191. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav.service.mjs +7 -7
  192. package/esm2020/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.mjs +4 -4
  193. package/esm2020/lib/sidebar/sidebar-toggler/sidebar-toggler.component.mjs +4 -4
  194. package/esm2020/lib/sidebar/sidebar.module.mjs +5 -5
  195. package/esm2020/lib/sidebar/sidebar.service.mjs +4 -4
  196. package/esm2020/lib/smart-pagination/smart-pagination.component.mjs +4 -4
  197. package/esm2020/lib/smart-pagination/smart-pagination.module.mjs +5 -5
  198. package/esm2020/lib/smart-table/smart-table/smart-table.component.mjs +4 -4
  199. package/esm2020/lib/smart-table/smart-table-column-filter/smart-table-column-filter.component.mjs +4 -4
  200. package/esm2020/lib/smart-table/smart-table-filter/filter-input.directive.mjs +4 -4
  201. package/esm2020/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +4 -4
  202. package/esm2020/lib/smart-table/smart-table-head/smart-table-head.component.mjs +4 -4
  203. package/esm2020/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +4 -4
  204. package/esm2020/lib/smart-table/smart-table.module.mjs +5 -5
  205. package/esm2020/lib/smart-table/smart-table.type.mjs +1 -1
  206. package/esm2020/lib/spinner/spinner.component.mjs +4 -4
  207. package/esm2020/lib/spinner/spinner.module.mjs +5 -5
  208. package/esm2020/lib/table/table-active.directive.mjs +4 -4
  209. package/esm2020/lib/table/table-color.directive.mjs +4 -4
  210. package/esm2020/lib/table/table.directive.mjs +4 -4
  211. package/esm2020/lib/table/table.module.mjs +5 -5
  212. package/esm2020/lib/tabs/tab-content/tab-content.component.mjs +4 -4
  213. package/esm2020/lib/tabs/tab-content-ref.directive.mjs +4 -4
  214. package/esm2020/lib/tabs/tab-pane/tab-pane.component.mjs +4 -4
  215. package/esm2020/lib/tabs/tab.service.mjs +4 -4
  216. package/esm2020/lib/tabs/tabs.module.mjs +5 -5
  217. package/esm2020/lib/time-picker/time-picker-roll-col/time-picker-roll-am-pm.component.mjs +7 -7
  218. package/esm2020/lib/time-picker/time-picker-roll-col/time-picker-roll-col.component.mjs +7 -7
  219. package/esm2020/lib/time-picker/time-picker.component.mjs +4 -4
  220. package/esm2020/lib/time-picker/time-picker.module.mjs +5 -5
  221. package/esm2020/lib/toast/toast/toast.component.mjs +4 -4
  222. package/esm2020/lib/toast/toast-body/toast-body.component.mjs +4 -4
  223. package/esm2020/lib/toast/toast-close.directive.mjs +4 -4
  224. package/esm2020/lib/toast/toast-header/toast-header.component.mjs +4 -4
  225. package/esm2020/lib/toast/toast.module.mjs +5 -5
  226. package/esm2020/lib/toast/toaster/toaster-host.directive.mjs +4 -4
  227. package/esm2020/lib/toast/toaster/toaster.component.mjs +4 -4
  228. package/esm2020/lib/toast/toaster/toaster.service.mjs +4 -4
  229. package/esm2020/lib/tooltip/tooltip/tooltip.component.mjs +4 -4
  230. package/esm2020/lib/tooltip/tooltip.directive.mjs +4 -4
  231. package/esm2020/lib/tooltip/tooltip.module.mjs +5 -5
  232. package/esm2020/lib/utilities/align.directive.mjs +4 -4
  233. package/esm2020/lib/utilities/bg-color.directive.mjs +4 -4
  234. package/esm2020/lib/utilities/border.directive.mjs +4 -4
  235. package/esm2020/lib/utilities/rounded.directive.mjs +4 -4
  236. package/esm2020/lib/utilities/text-color.directive.mjs +4 -4
  237. package/esm2020/lib/utilities/utilities.module.mjs +5 -5
  238. package/esm2020/lib/widget/widget-stat-a/widget-stat-a.component.mjs +4 -4
  239. package/esm2020/lib/widget/widget-stat-b/widget-stat-b.component.mjs +4 -4
  240. package/esm2020/lib/widget/widget-stat-c/widget-stat-c.component.mjs +4 -4
  241. package/esm2020/lib/widget/widget-stat-d/widget-stat-d.component.mjs +4 -4
  242. package/esm2020/lib/widget/widget-stat-e/widget-stat-e.component.mjs +4 -4
  243. package/esm2020/lib/widget/widget-stat-f/widget-stat-f.component.mjs +4 -4
  244. package/esm2020/lib/widget/widget.module.mjs +5 -5
  245. package/fesm2015/coreui-angular-pro.mjs +1721 -1048
  246. package/fesm2015/coreui-angular-pro.mjs.map +1 -1
  247. package/fesm2020/coreui-angular-pro.mjs +1700 -1038
  248. package/fesm2020/coreui-angular-pro.mjs.map +1 -1
  249. package/lib/calendar/calendar.service.d.ts +2 -2
  250. package/lib/calendar/calendar.utils.d.ts +2 -2
  251. package/lib/multi-select/multi-select/multi-select-search.directive.d.ts +15 -0
  252. package/lib/multi-select/multi-select/multi-select.component.d.ts +160 -27
  253. package/lib/multi-select/multi-select-option/multi-select-option.component.d.ts +58 -16
  254. package/lib/multi-select/multi-select-tag/multi-select-tag.component.d.ts +5 -2
  255. package/lib/multi-select/multi-select.module.d.ts +8 -6
  256. package/lib/multi-select/multi-select.service.d.ts +14 -7
  257. package/lib/multi-select/multi-select.type.d.ts +4 -2
  258. package/lib/multi-select/public_api.d.ts +1 -0
  259. package/lib/smart-table/smart-table-head/smart-table-head.component.d.ts +3 -1
  260. package/lib/smart-table/smart-table.type.d.ts +1 -0
  261. package/package.json +1 -1
@@ -1,15 +1,16 @@
1
- var _MultiSelectComponent_destroy$;
2
- import { __classPrivateFieldGet } from "tslib";
3
- import { Component, ContentChildren, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, ViewChild } from '@angular/core';
4
- import { FocusKeyManager } from '@angular/cdk/a11y';
5
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
1
+ var _MultiSelectComponent_destroy$, _MultiSelectComponent_optionsReady$, _MultiSelectComponent_options, _MultiSelectComponent_value;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { Component, ContentChildren, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, ViewChild, ViewChildren } from '@angular/core';
6
4
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
- import { Subject } from 'rxjs';
5
+ import { FocusKeyManager } from '@angular/cdk/a11y';
6
+ import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';
7
+ import { BehaviorSubject, Subject } from 'rxjs';
8
+ import { combineLatestWith, debounceTime, delay, distinctUntilChanged, filter, map, take, takeUntil, tap } from 'rxjs/operators';
8
9
  import { DropdownComponent, DropdownToggleDirective } from '../../dropdown';
9
10
  import { MultiSelectService } from '../multi-select.service';
10
11
  import { MultiSelectOptionComponent } from '../multi-select-option/multi-select-option.component';
11
12
  import { MultiSelectNativeSelectComponent } from '../multi-select-native-select/multi-select-native-select.component';
12
- import { takeUntil } from 'rxjs/operators';
13
+ import { TemplateIdDirective } from '../../shared';
13
14
  import * as i0 from "@angular/core";
14
15
  import * as i1 from "@angular/cdk/a11y";
15
16
  import * as i2 from "../multi-select.service";
@@ -17,7 +18,10 @@ import * as i3 from "@angular/common";
17
18
  import * as i4 from "@angular/forms";
18
19
  import * as i5 from "../../dropdown/dropdown/dropdown.component";
19
20
  import * as i6 from "../../dropdown/dropdown-menu/dropdown-menu.directive";
20
- import * as i7 from "../multi-select-tag/multi-select-tag.component";
21
+ import * as i7 from "@angular/cdk/scrolling";
22
+ import * as i8 from "../multi-select-option/multi-select-option.component";
23
+ import * as i9 from "../multi-select-tag/multi-select-tag.component";
24
+ import * as i10 from "./multi-select-search.directive";
21
25
  // @ts-ignore
22
26
  export const observeReferenceModifier = {
23
27
  name: 'observeReferenceModifier', enabled: true, phase: 'main', fn({ state }) { },
@@ -49,31 +53,125 @@ export class MultiSelectComponent {
49
53
  this.multiSelectService = multiSelectService;
50
54
  this.iterableDiffers = iterableDiffers;
51
55
  _MultiSelectComponent_destroy$.set(this, new Subject());
56
+ _MultiSelectComponent_optionsReady$.set(this, new Subject());
57
+ this.optionsArray$ = new BehaviorSubject([]);
58
+ _MultiSelectComponent_options.set(this, new Map());
59
+ this.optionsSelected$ = new BehaviorSubject([]);
60
+ this.optionsSelected = new Map();
61
+ this.value$ = new BehaviorSubject([]);
52
62
  this.onChange = (value) => { };
53
63
  this.onTouched = () => { };
64
+ /**
65
+ * Enables selection cleaner element
66
+ * @type boolean
67
+ * @default true
68
+ */
54
69
  this.cleaner = true;
55
70
  this._disabled = false;
56
71
  this._multiple = false;
57
- this.nativeName = '';
72
+ /**
73
+ * Hidden native select form
74
+ * @type string
75
+ * @default ''
76
+ */
77
+ this.nativeFormId = '';
78
+ /**
79
+ * Hidden native select id
80
+ * @type string
81
+ * @default ''
82
+ */
58
83
  this.nativeId = '';
59
- this.options = [];
84
+ /**
85
+ * Hidden native select name
86
+ * @type string
87
+ * @default ''
88
+ */
89
+ this.nativeName = '';
90
+ /**
91
+ * Sets maxHeight of options list in px
92
+ * @type (string | number)
93
+ * @default 'auto'
94
+ */
60
95
  this.optionsMaxHeight = 'auto';
61
- this.optionsStyle = 'checkbox';
96
+ /**
97
+ * Specifies a short hint that is visible in the search input
98
+ * @type string
99
+ * @default 'Select...'
100
+ */
62
101
  this.placeholder = 'Select...';
102
+ /**
103
+ * Enables search input element
104
+ * @type boolean | SearchFn | 'external'
105
+ * @default true
106
+ */
63
107
  this.search = true;
108
+ /**
109
+ * Sets the label for no results when filtering
110
+ * @type string
111
+ * @default 'no items'
112
+ */
64
113
  this.searchNoResultsLabel = 'no items';
65
114
  this._searchValue = '';
115
+ /**
116
+ * Emits searchValue string for external filtering
117
+ * @type string
118
+ */
66
119
  this.searchValueChange = new EventEmitter();
120
+ /**
121
+ * Enables select all button
122
+ * @type boolean
123
+ * @default true
124
+ */
67
125
  this.selectAll = true;
126
+ /**
127
+ * Sets the select all button label
128
+ * @type string
129
+ * @default 'Select all options'
130
+ */
68
131
  this.selectAllLabel = 'Select all options';
132
+ /**
133
+ * Selection type
134
+ * @type 'counter' | 'tags' | 'text'
135
+ * @default 'tags'
136
+ */
69
137
  this.selectionType = 'tags';
138
+ /**
139
+ * Counter selection label value
140
+ * @type string
141
+ * @default 'item(s) selected'
142
+ */
70
143
  this.selectionTypeCounterText = 'item(s) selected';
144
+ /**
145
+ * Counter selection label plural map for I18nPluralPipe
146
+ * @type IPluralMap
147
+ * @default { '=1': 'item selected', 'other': 'items selected' }
148
+ */
71
149
  this.selectionTypeCounterTextPluralMap = { '=1': 'item selected', 'other': 'items selected' };
72
- this._value = [''];
150
+ _MultiSelectComponent_value.set(this, []);
151
+ /**
152
+ * Emits valueChange
153
+ * @type string | string[]
154
+ */
73
155
  this.valueChange = new EventEmitter();
74
156
  this._virtualScroller = false;
75
- this._visibleItems = 10;
157
+ this._visibleItems = 8;
158
+ /**
159
+ * The size of the option item in the list (in pixels).
160
+ * @type number
161
+ * @default 40
162
+ */
163
+ this.itemSize = 40;
164
+ /**
165
+ * Min width of the options list (in pixels).
166
+ * @type number
167
+ * @default 196
168
+ */
169
+ this.itemMinWidth = 196;
76
170
  this._visible = false;
171
+ /**
172
+ * Emits visibleChange
173
+ * @type boolean
174
+ */
77
175
  this.visibleChange = new EventEmitter();
78
176
  /**
79
177
  * Optional popper Options object
@@ -82,20 +180,24 @@ export class MultiSelectComponent {
82
180
  this.popperjsOptions = {
83
181
  strategy: 'fixed', modifiers: [observeReferenceModifier, {
84
182
  name: 'offset', options: {
85
- offset: () => this.selectionType === 'tags' && this.selectedOptions.length ? [-2, 8] : [-12, 12]
183
+ offset: () => this.selectionType === 'tags' && this.optionsSelected.size ? [-2, 8] : [-12, 12]
86
184
  }
87
185
  }]
88
186
  };
89
187
  this.isDropdownVisible = false;
90
- this._selectedOptions = [];
91
- this._tabIndex = '-1';
188
+ this.templates = {};
189
+ this._tabIndex = -1;
92
190
  this.visibleOptions = 0;
93
191
  this._subtreeFocused = this.focusOrigin(null);
94
- this.differ = this.iterableDiffers.find(this._value).create();
192
+ this.activeOption = null;
193
+ this.differ = this.iterableDiffers.find(__classPrivateFieldGet(this, _MultiSelectComponent_value, "f")).create();
95
194
  }
96
195
  writeValue(value) {
97
- if (value !== null) {
98
- this.value = Array.isArray(value) ? [...value] : [value ?? ''];
196
+ if (value?.length > 0) {
197
+ this.value = Array.isArray(value) ? [...value] : [value];
198
+ }
199
+ else {
200
+ this.value = Array(0);
99
201
  }
100
202
  }
101
203
  registerOnChange(fn) {
@@ -107,6 +209,11 @@ export class MultiSelectComponent {
107
209
  setDisabledState(isDisabled) {
108
210
  this.disabled = isDisabled;
109
211
  }
212
+ /**
213
+ * Disables multi-select component
214
+ * @type boolean
215
+ * @default false
216
+ */
110
217
  set disabled(value) {
111
218
  if (this._disabled !== value) {
112
219
  this._disabled = coerceBooleanProperty(value);
@@ -116,16 +223,47 @@ export class MultiSelectComponent {
116
223
  get disabled() {
117
224
  return this._disabled;
118
225
  }
226
+ /**
227
+ * Specifies that multiple options can be selected at once
228
+ * @type boolean
229
+ * @default false
230
+ */
119
231
  set multiple(value) {
120
232
  this._multiple = coerceBooleanProperty(value);
121
233
  }
122
234
  get multiple() {
123
235
  return this._multiple;
124
236
  }
237
+ /**
238
+ * List of option elements
239
+ * @type IOption[]
240
+ * @default []
241
+ */
242
+ set options(options) {
243
+ if (Array.isArray(options)) {
244
+ this.makeOptions(options);
245
+ }
246
+ }
247
+ get options() {
248
+ return [...__classPrivateFieldGet(this, _MultiSelectComponent_options, "f").values()];
249
+ }
250
+ /**
251
+ * Sets option style
252
+ * @type 'checkbox' | 'text'
253
+ * @default 'checkbox'
254
+ */
255
+ set optionsStyle(value) {
256
+ this.multiSelectService.optionsStyle = value ?? 'checkbox';
257
+ }
258
+ /**
259
+ * Sets initial search string
260
+ * @type string
261
+ * @default ''
262
+ */
125
263
  set searchValue(value) {
126
264
  if (this._searchValue !== value.trimStart()) {
127
265
  this._searchValue = value.trimStart();
128
- this.visible = !!this.searchValue.length || this.visible;
266
+ this.visible = !!this.searchValue.length ? true : this.visible;
129
267
  this.filterOptions(this.searchValue);
130
268
  this.inputElementSize();
131
269
  this.searchValueChange.emit(this._searchValue);
@@ -139,27 +277,25 @@ export class MultiSelectComponent {
139
277
  * @type string | string[]
140
278
  */
141
279
  set value(value) {
142
- const newValue = Array.isArray(value) ? [...value] : [value ?? ''];
280
+ const newValue = Array.isArray(value) ? [...value] : [value ?? undefined];
143
281
  if (this.differ) {
144
282
  const changes = this.differ.diff(newValue);
145
283
  if (changes) {
146
- this._value = [...newValue];
147
- this.onChange([...newValue]);
148
- this.selectOptions();
149
- // not required here:
150
- // this.selectedOptionsUpdate();
151
- this.valueChange.emit(this.value);
284
+ __classPrivateFieldSet(this, _MultiSelectComponent_value, [...newValue], "f");
285
+ this.value$.next([...newValue]);
286
+ this.onChange(this.value);
287
+ // this.valueChange.emit(this.value);
152
288
  }
153
289
  }
154
290
  }
155
291
  get value() {
156
- return this.multiple ? [...this._value] : this._value[0]?.toString() ?? '';
292
+ const value = this.multiSelectService.selectionModel?.selected ?? [...__classPrivateFieldGet(this, _MultiSelectComponent_value, "f")];
293
+ return this.multiple ? [...value] : value?.toString() ?? undefined;
157
294
  }
158
295
  /**
159
- * Enable virtual scroller for the options list.
296
+ * Enable virtual scroller for options list.
160
297
  * @type boolean
161
298
  * @default false
162
- * todo: virtual scroller implementation
163
299
  */
164
300
  set virtualScroller(value) {
165
301
  this._virtualScroller = coerceBooleanProperty(value);
@@ -170,11 +306,11 @@ export class MultiSelectComponent {
170
306
  /**
171
307
  * Amount of visible options, if set - overwrites optionsMaxHeight
172
308
  * @type number
173
- * @default 10
309
+ * @default 8
174
310
  */
175
311
  set visibleItems(value) {
176
- this._visibleItems = value || 1;
177
- this.optionsMaxHeight = ((42 * value) + 16).toString();
312
+ this._visibleItems = coerceNumberProperty(value || 8);
313
+ this.optionsMaxHeight = ((this.itemSize * this._visibleItems) + 16).toString();
178
314
  }
179
315
  get visibleItems() {
180
316
  return this._visibleItems;
@@ -189,21 +325,16 @@ export class MultiSelectComponent {
189
325
  if (visible !== this._visible) {
190
326
  this._visible = visible;
191
327
  this.multiSelectService.toggleVisible(visible);
192
- if (visible) {
193
- this.listKeyManager?.setFirstItemActive();
328
+ if (!visible) {
329
+ // this.searchValue = '';
194
330
  }
195
331
  }
196
332
  }
197
333
  get visible() {
198
334
  return this._visible;
199
335
  }
200
- set selectedOptions(value) {
201
- this._selectedOptions = value;
202
- this.value = this.selectedOptions.map(item => item.value);
203
- this.inputElementSize();
204
- }
205
336
  get selectedOptions() {
206
- return this._selectedOptions;
337
+ return [...this.optionsSelected.values()];
207
338
  }
208
339
  get selectedOptionsText() {
209
340
  return this.selectedOptions.map(option => option.label).join(', ');
@@ -223,7 +354,7 @@ export class MultiSelectComponent {
223
354
  get multiselectClasses() {
224
355
  return {
225
356
  'form-multi-select': true,
226
- 'form-multi-select-selection-tags': this.selectionType === 'tags' && this.selectedOptions.length > 0,
357
+ 'form-multi-select-selection-tags': this.selectionType === 'tags' && this.optionsSelected.size > 0,
227
358
  [`form-multi-select-${this.size}`]: !!this.size,
228
359
  'form-multi-select-with-cleaner': this.cleaner,
229
360
  show: this.visible,
@@ -240,7 +371,7 @@ export class MultiSelectComponent {
240
371
  }
241
372
  set tabIndex(value) {
242
373
  setTimeout(() => {
243
- this._tabIndex = this.disabled || this.search ? '-1' : value === null ? null : '0';
374
+ this._tabIndex = this.disabled || this.search ? -1 : value === null ? null : 0;
244
375
  });
245
376
  }
246
377
  onKeyUp($event) {
@@ -248,28 +379,81 @@ export class MultiSelectComponent {
248
379
  return;
249
380
  }
250
381
  this.onTouched();
382
+ const targetTagName = $event.target.tagName;
251
383
  if ($event.key === 'Escape') {
252
384
  this.visible = false;
253
385
  this.searchValue = '';
254
386
  this.setFocus('keyboard', 'onKeyUp');
255
387
  return;
256
388
  }
257
- if (['Enter', ' ', 'ArrowDown'].includes($event.key) && [this.inputElement?.nativeElement, this.elementRef.nativeElement].includes($event.target)) {
389
+ if (['Enter', 'Space', 'ArrowDown'].includes($event.code) && [this.inputElement?.nativeElement, this.elementRef.nativeElement].includes($event.target)) {
390
+ $event.stopPropagation();
258
391
  this.visible = true;
259
392
  if (!this.search) {
260
393
  this.setFocus('keyboard', 'onKeyUp');
261
394
  }
262
395
  return;
263
396
  }
264
- if ($event.key === 'Tab' && $event.target === this.elementRef.nativeElement) {
265
- this.visible = true;
266
- if (!this.search) {
267
- this.setFocus('keyboard', 'onKeyUp');
397
+ if (['Tab'].includes($event.key)) {
398
+ if ($event.target === this.elementRef.nativeElement) {
399
+ this.visible = true;
400
+ if (!this.search) {
401
+ this.setFocus('keyboard', 'onKeyUp');
402
+ }
403
+ this.tabTarget = targetTagName;
404
+ return;
405
+ }
406
+ if (this.visible && this.subtreeFocused) {
407
+ if (targetTagName === 'C-MULTI-SELECT-OPTION') {
408
+ if (this.tabTarget === 'C-MULTI-SELECT-OPTION') {
409
+ if ($event.shiftKey && this.listKeyManager.activeItem?.value === this.options.filter(option => option.visible && !option.disabled).slice(0)[0].value) {
410
+ this.setFocus('keyboard', 'onKeyUp');
411
+ this.tabTarget = targetTagName;
412
+ return;
413
+ }
414
+ if (!$event.shiftKey && this.listKeyManager.activeItem?.value === this.options.filter(option => option.visible && !option.disabled).slice(-1)[0].value) {
415
+ this.setFocus('keyboard', 'onKeyUp');
416
+ this.tabTarget = targetTagName;
417
+ this.updateActiveItem(0);
418
+ return;
419
+ }
420
+ }
421
+ if (!this.listKeyManager.activeItem || this.tabTarget !== targetTagName) {
422
+ if (this.activeOption) {
423
+ this.listKeyManager.setActiveItem(this.activeOption);
424
+ }
425
+ else {
426
+ this.setFirstItemActive();
427
+ }
428
+ }
429
+ else {
430
+ $event.shiftKey ? this.listKeyManager.setPreviousItemActive() : this.listKeyManager.setNextItemActive();
431
+ }
432
+ }
433
+ this.tabTarget = targetTagName;
434
+ return;
268
435
  }
269
- return;
270
436
  }
271
437
  }
272
438
  onKeyDown($event) {
439
+ const targetTagName = $event.target.tagName;
440
+ if ($event.key === 'Enter' && targetTagName === 'INPUT') {
441
+ $event.preventDefault();
442
+ }
443
+ if ($event.key === 'Tab') {
444
+ this.tabTarget = targetTagName;
445
+ return;
446
+ }
447
+ if ($event.key === 'ArrowDown' && targetTagName !== 'C-MULTI-SELECT-OPTION') {
448
+ $event.preventDefault();
449
+ return;
450
+ }
451
+ if ($event.key === 'Escape') {
452
+ this.visible = false;
453
+ this.searchValue = '';
454
+ this.setFocus('keyboard', 'onKeyUp');
455
+ return;
456
+ }
273
457
  if (this.disabled) {
274
458
  return;
275
459
  }
@@ -277,44 +461,132 @@ export class MultiSelectComponent {
277
461
  if ($event.target === this.inputElement.nativeElement) {
278
462
  return;
279
463
  }
280
- this.listKeyManager?.onKeydown($event);
464
+ if ($event.key !== 'Tab') {
465
+ this.listKeyManager?.onKeydown($event);
466
+ }
281
467
  }
282
468
  onClick($event) {
283
469
  if (this.disabled) {
284
470
  return;
285
471
  }
286
- if (!this.visible) {
287
- this.visible = true;
288
- this.setFocus('mouse', 'onClick');
472
+ if ([this.dropdown.nativeElement].includes($event.target)) {
473
+ this.visible = !this.visible;
289
474
  }
290
- else if ([this.dropdown.nativeElement].includes($event.target)) {
291
- this.visible = false;
292
- this.setFocus('mouse', 'onClick');
475
+ else {
476
+ this.visible = true;
293
477
  }
294
478
  this.onTouched();
479
+ this.setFocus('mouse', 'onClick');
295
480
  }
296
481
  get subtreeFocused() {
297
482
  return this._subtreeFocused;
298
483
  }
299
- set subtreeFocused(value) {
300
- this._subtreeFocused = this.disabled ? false : value;
301
- this.visible = value === false ? false : this.visible;
484
+ set subtreeFocused(focused) {
485
+ this._subtreeFocused = this.disabled ? false : focused;
486
+ if (!focused) {
487
+ this.searchValue = '';
488
+ }
489
+ if (!this.virtualScroller) {
490
+ this.visible = focused === false ? false : this.visible;
491
+ }
302
492
  }
303
493
  focusOrigin(origin) {
304
494
  if (this.disabled) {
305
495
  return false;
306
496
  }
307
- const focused = !!origin;
308
- this.searchValue = focused ? this.searchValue : '';
309
- return focused;
497
+ return !!origin;
310
498
  }
311
499
  ngOnInit() {
312
- this.tabIndex = '0';
500
+ this.multiSelectService.setSelectionModel(this.multiple);
501
+ this.multiSelectService.selectionModel.changed
502
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")), filter(() => !this.multiple), delay(0), tap(change => {
503
+ if (change.added.length) {
504
+ // close dropdown for single select (!multiple)
505
+ this.visible = false;
506
+ this.searchValue = '';
507
+ }
508
+ }))
509
+ .subscribe();
510
+ this.multiSelectService.selectionModel.changed
511
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")),
512
+ // delay(0),
513
+ combineLatestWith(__classPrivateFieldGet(this, _MultiSelectComponent_optionsReady$, "f")), tap(([change, ready]) => {
514
+ const { added, removed } = { ...change };
515
+ // added.forEach(key => {
516
+ // const value = this.#options.get(key);
517
+ // if (value) {
518
+ // this.optionsSelected.set(key, value);
519
+ // }
520
+ // });
521
+ removed.forEach(value => {
522
+ this.optionsSelected.delete(value);
523
+ });
524
+ this.multiSelectService.selectionModel.selected.forEach(key => {
525
+ const value = __classPrivateFieldGet(this, _MultiSelectComponent_options, "f").get(key);
526
+ if (value) {
527
+ this.optionsSelected.set(key, value);
528
+ }
529
+ });
530
+ this.optionsSelected$.next(Array.from(this.optionsSelected.values()));
531
+ this.value = [...this.multiSelectService.selectionModel.selected];
532
+ this.inputElementSize();
533
+ this.updateNativeSelect();
534
+ }))
535
+ .subscribe();
536
+ // set initial values
537
+ this.multiSelectService.selectionModel.select(...__classPrivateFieldGet(this, _MultiSelectComponent_value, "f"));
538
+ this.value$
539
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")))
540
+ .subscribe(value => {
541
+ if (!value.length) {
542
+ this.clearAllOptions();
543
+ return;
544
+ }
545
+ value.forEach(value => {
546
+ this.multiSelectService.selectionModel.select(value);
547
+ });
548
+ });
549
+ this.value$
550
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")), debounceTime(100), tap(value => {
551
+ this.valueChange.emit(this.value);
552
+ }))
553
+ .subscribe();
554
+ this.optionsArray$
555
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")), tap(options => {
556
+ this.visibleOptions = options.filter((item) => item.visible).length;
557
+ this.activeOption = null;
558
+ if (this.virtualScroller) {
559
+ this.multiSelectOptionsContent?.forEach(option => {
560
+ option.active = false;
561
+ });
562
+ this.scrollViewport?.setRenderedRange({ start: 0, end: this.visibleItems });
563
+ this.scrollViewport?.scrollToIndex(0);
564
+ }
565
+ else {
566
+ this.multiSelectOptionsContent?.forEach(option => {
567
+ const found = options.find(item => item.value === option.value);
568
+ option.visible = found?.visible ?? false;
569
+ option.active = false;
570
+ });
571
+ const firstFocusable = this.firstFocusableItem;
572
+ if (firstFocusable) {
573
+ this.updateActiveItem(firstFocusable);
574
+ }
575
+ }
576
+ if (!this.activeOption) {
577
+ setTimeout(() => {
578
+ this.updateActiveItem(0);
579
+ });
580
+ }
581
+ this.multiSelectOptionsContent?.notifyOnChanges();
582
+ // console.log('=> optionsArray$', options.length);
583
+ }))
584
+ .subscribe();
585
+ this.tabIndex = 0;
313
586
  }
314
587
  ngOnDestroy() {
315
588
  __classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f").next(true);
316
589
  __classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f").complete();
317
- this.multiselectSubscribe(false);
318
590
  this.setFocusMonitor(false);
319
591
  }
320
592
  ngOnChanges(changes) {
@@ -323,174 +595,190 @@ export class MultiSelectComponent {
323
595
  if (valueChanges.currentValue.length === 0) {
324
596
  this.clearAllOptions();
325
597
  }
326
- else {
327
- this.selectOptions();
328
- }
329
- this.selectedOptionsUpdate();
598
+ this.inputElementSize();
330
599
  }
331
600
  }
332
- ngAfterContentInit() {
333
- this.visibleOptions = this.multiSelectOptions.length;
334
- this.multiSelectOptions.changes
335
- .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")))
336
- .subscribe(next => {
337
- this.visibleOptions = this.multiSelectOptions?.filter((item) => item.visible).length;
338
- this.selectOptions();
601
+ makeOptions(options) {
602
+ if (this.search === 'external' && this.searchValue.length) {
603
+ __classPrivateFieldGet(this, _MultiSelectComponent_options, "f").forEach((value, key) => {
604
+ value.visible = false;
605
+ });
606
+ }
607
+ options.forEach(option => {
608
+ const key = option.value;
609
+ const value = {
610
+ value: option.value ?? option.label,
611
+ label: option.label ?? option.value,
612
+ disabled: option.disabled === true,
613
+ visible: this.search === 'external' ? true : option.visible !== false,
614
+ text: option.text ?? option.label ?? option.value,
615
+ selected: option.selected
616
+ // selected: this.multiSelectService.selectionModel.isSelected(option.value),
617
+ // id: option.id
618
+ };
619
+ __classPrivateFieldGet(this, _MultiSelectComponent_options, "f").set(key, { ...value });
339
620
  });
621
+ this.filterOptions(this.searchValue);
622
+ __classPrivateFieldGet(this, _MultiSelectComponent_optionsReady$, "f").next(true);
623
+ // console.log('makeOptions', this.#options.size);
624
+ this.multiSelectOptionsContent?.notifyOnChanges();
340
625
  }
341
626
  ngAfterViewInit() {
342
- this.selectOptions();
627
+ this.setVirtualScroller();
628
+ this.multiSelectOptionsContent?.changes
629
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")), delay(0), distinctUntilChanged((previous, current) => {
630
+ const prev = previous.toArray().map(option => option.value);
631
+ const curr = current.toArray().map(option => option.value);
632
+ return JSON.stringify(prev) === JSON.stringify(curr);
633
+ }))
634
+ .subscribe(next => {
635
+ this.visibleOptions = this.multiSelectOptionsContent?.filter((option) => option.visible).length;
636
+ if (this.visibleOptions) {
637
+ this.makeOptions(this.multiSelectOptionsContent.toArray());
638
+ }
639
+ });
640
+ this.visibleOptions = this.multiSelectOptionsContent?.length;
641
+ if (this.visibleOptions) {
642
+ this.multiSelectOptionsContent.notifyOnChanges();
643
+ }
343
644
  this.multiselectSubscribe();
344
- this.listKeyManager = new FocusKeyManager(this.multiSelectOptions).withHomeAndEnd().withTypeAhead();
345
- this.listKeyManager.skipPredicate(item => (item.disabled || !item.visible));
346
- this.listKeyManager.setFirstItemActive();
347
645
  this.setFocusMonitor(!this.disabled);
348
- // not required here:
349
- // this.selectedOptionsUpdate();
646
+ this.setListKeyManager();
647
+ this.inputElementSize();
648
+ this.multiSelectOptionsContent.notifyOnChanges();
350
649
  setTimeout(() => {
351
650
  this.createNativeSelect();
352
651
  });
652
+ this.multiSelectService.multiSelectFocus$
653
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")))
654
+ .subscribe((option) => {
655
+ if (this.activeOption?.value !== option.value) {
656
+ this.listKeyManager.setActiveItem(option);
657
+ }
658
+ });
353
659
  }
354
660
  multiselectSubscribe(subscribe = true) {
355
- if (subscribe) {
356
- this.multiselectVisibleSubscription = this.multiSelectService.multiSelectVisible$.subscribe((visible) => {
357
- if (this.isDropdownVisible !== visible) {
358
- this.isDropdownVisible = visible;
359
- this.visibleChange.emit(visible);
360
- if (!visible) {
361
- this.setFocus('program', 'multiSelectVisible$');
362
- }
661
+ this.multiSelectService.multiSelectVisible$
662
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")), debounceTime(100), distinctUntilChanged())
663
+ .subscribe((visible) => {
664
+ if (this.isDropdownVisible !== visible) {
665
+ this.isDropdownVisible = visible;
666
+ this.visibleChange.emit(visible);
667
+ if (!visible) {
363
668
  }
364
- });
365
- this.multiselectStateSubscription = this.multiSelectService.multiSelectState$.subscribe((option) => {
366
- if (option.selected === true && !this.multiple) {
367
- const selectedOptions = this.multiSelectOptions.toArray().filter((item) => item.selected);
368
- selectedOptions.reverse().forEach((item) => {
369
- if (item !== option) {
370
- item.selected = false;
371
- }
372
- });
373
- // close dropdown for single select (!multiple)
374
- this.visible = false;
375
- this.searchValue = '';
669
+ else {
670
+ if (this.virtualScroller) {
671
+ this.scrollViewport?.setRenderedRange({ start: 0, end: this.visibleItems });
672
+ this.scrollViewport?.scrollToIndex(0);
673
+ }
376
674
  }
377
- // todo?
378
- // if (!!option) {
379
- this.selectedOptionsUpdate();
380
- // }
381
- });
382
- }
383
- else {
384
- this.multiselectVisibleSubscription?.unsubscribe();
385
- this.multiselectStateSubscription?.unsubscribe();
386
- }
387
- }
388
- selectOptions() {
389
- this.multiSelectOptions?.forEach((option, index) => {
390
- option.optionsStyle = this.optionsStyle;
391
- option.selected = option.value !== undefined ? this._value.includes(option.value) : !!option.selected;
675
+ this.multiSelectOptionsContent.notifyOnChanges();
676
+ }
677
+ this.updateActiveItem(0);
392
678
  });
393
679
  }
394
680
  clearAllOptions($event) {
395
- this.selectedOptions.forEach((option) => {
396
- if (!option._disabled) {
397
- option.selected = false;
398
- }
681
+ setTimeout(() => {
682
+ const enabledOptions = Array.from(this.optionsSelected.values()).filter(option => !option.disabled).map(option => option.value);
683
+ this.multiSelectService.selectionModel.deselect(...enabledOptions);
399
684
  });
400
- this.selectedOptionsUpdate();
685
+ this.searchValue = '';
401
686
  if ($event) {
402
- this.searchValue = '';
403
687
  this.setFocus('program', 'clearAllOptions');
404
688
  }
405
689
  }
406
690
  selectAllOptions() {
407
- this.multiSelectOptions.forEach((option, index) => {
408
- if (!option.disabled && option.visible) {
409
- option.selected = true;
410
- }
411
- });
412
- this.selectedOptionsUpdate();
691
+ const enabledOptions = Array.from(__classPrivateFieldGet(this, _MultiSelectComponent_options, "f").values()).filter(option => option.visible && !option.disabled).map(option => option.value);
692
+ this.multiSelectService.selectionModel.select(...enabledOptions);
693
+ this.inputElementSize();
413
694
  }
414
- handleTagRemove($event) {
695
+ handleTagRemove(value) {
696
+ this.multiSelectService.selectionModel.deselect(value);
415
697
  this.setFocus('program', 'handleTagRemove');
416
698
  }
417
699
  setFocus(origin = 'program', methodName) {
418
700
  if (this.disabled) {
419
701
  return;
420
702
  }
421
- const element = this.inputElement ?? this.elementRef;
703
+ const element = (this.inputElement.nativeElement ?? this.elementRef.nativeElement);
422
704
  const preventScroll = origin === 'program';
423
705
  this.focusMonitor?.focusVia(element, origin, { preventScroll: preventScroll });
424
- // console.log('setFocus', origin, methodName, 'preventScroll:', preventScroll );
706
+ // console.log('setFocus', origin, methodName, 'preventScroll:', preventScroll, element.tagName);
425
707
  }
426
708
  filterOptions(value) {
427
709
  const searchString = value.toLowerCase() ?? '';
428
- this.multiSelectOptions?.forEach((item, index) => {
429
- if (this.search === 'external' || !searchString) {
710
+ __classPrivateFieldGet(this, _MultiSelectComponent_options, "f").forEach((item, index) => {
711
+ if (searchString === '') {
430
712
  item.visible = true;
713
+ return;
431
714
  }
432
- else {
433
- item.visible = item.label?.toLowerCase().includes(searchString) ?? true;
715
+ if (typeof this.search === 'function') {
716
+ item.visible = this.search(item, searchString);
717
+ return;
718
+ }
719
+ if (this.search === 'external' || !searchString) {
720
+ // item.visible = true;
721
+ return;
434
722
  }
723
+ item.visible = item.label?.toLowerCase().includes(searchString) ?? true;
435
724
  });
436
- this.visibleOptions = this.multiSelectOptions?.filter((item) => item.visible).length;
725
+ this.optionsArray$.next(Array.from(__classPrivateFieldGet(this, _MultiSelectComponent_options, "f").values()).filter((item) => item.visible));
437
726
  }
438
727
  createNativeSelect() {
728
+ if (!this.nativeId) {
729
+ return;
730
+ }
439
731
  this.viewContainerRef.clear();
440
732
  this.nativeSelectRef = this.viewContainerRef.createComponent(MultiSelectNativeSelectComponent);
441
733
  this.updateNativeSelect();
442
734
  }
443
735
  updateNativeSelect() {
444
- if (!this.nativeSelectRef) {
736
+ if (!this.nativeSelectRef || !this.nativeId) {
445
737
  return;
446
738
  }
447
- const options = this.selectedOptions.map(item => {
448
- const { selected, value, label } = item;
739
+ const options = Array.from(this.optionsSelected).map(item => {
740
+ const { selected, value, label } = item[1];
449
741
  return { selected, value, label };
450
742
  });
451
743
  this.nativeSelectRef.instance.multiple = this.multiple;
744
+ this.nativeSelectRef.instance.form = this.nativeFormId;
745
+ this.nativeSelectRef.instance.id = this.nativeId;
452
746
  this.nativeSelectRef.instance.name = this.nativeName;
453
- this.nativeSelectRef.instance.form = this.nativeId;
454
747
  this.nativeSelectRef.instance.options = [...options];
455
748
  this.nativeSelectRef.instance.disabled = this.disabled;
456
749
  this.nativeSelectRef.instance.changeDetectorRef.markForCheck();
457
750
  }
458
751
  inputElementSize() {
459
- if (this.inputElement) {
460
- if (this.selectedOptions.length > 0 || this.selectionType === 'counter') {
461
- this.renderer.setAttribute(this.inputElement.nativeElement, 'size', (this.searchValue.length + 2).toString());
462
- }
463
- else {
464
- this.renderer.removeAttribute(this.inputElement.nativeElement, 'size');
752
+ setTimeout(() => {
753
+ if (this.inputElement) {
754
+ if ((this.optionsSelected.size > 0 || this.selectionType === 'counter') && !this.inputElement.nativeElement?.disabled) {
755
+ this.renderer.setAttribute(this.inputElement.nativeElement, 'size', (this.searchValue.length + 2).toString());
756
+ }
757
+ else {
758
+ this.renderer.removeAttribute(this.inputElement.nativeElement, 'size');
759
+ }
465
760
  }
466
- }
761
+ });
467
762
  }
468
763
  handleSearchKeyDown($event) {
469
- if (this.searchValue.length || this.selectedOptions.length === 0) {
764
+ if (this.searchValue.length || this.optionsSelected.size === 0) {
470
765
  return;
471
766
  }
472
767
  if (['Backspace', 'Delete'].includes($event.key)) {
473
768
  $event.stopPropagation();
474
769
  const last = this.selectedOptions.filter(option => !option.disabled).pop();
475
- this.selectOption(last, false);
770
+ if (last) {
771
+ this.multiSelectService.selectionModel.deselect(last.value);
772
+ }
476
773
  }
477
774
  }
478
- selectOption(option, selected) {
479
- option.selected = selected;
480
- this.selectedOptionsUpdate();
481
- }
482
- selectedOptionsUpdate() {
483
- setTimeout(() => {
484
- this.selectedOptions = this.multiSelectOptions?.filter((option) => !!option.selected);
485
- this.inputElementSize();
486
- this.updateNativeSelect();
487
- this.changeDetectorRef.markForCheck();
488
- });
489
- }
490
775
  setFocusMonitor(monitor) {
491
776
  if (monitor && !this.disabled) {
492
- this.focusMonitorSubscription = this.focusMonitor?.monitor(this.elementRef, true).subscribe((origin) => {
493
- // console.log('focusMonitorSubscription', this.elementRef, origin);
777
+ this.focusMonitorSubscription = this.focusMonitor?.monitor(this.elementRef, true)
778
+ .pipe(
779
+ // to avoid focus lost on speed scrolling with virtualScroll
780
+ debounceTime(100))
781
+ .subscribe((origin) => {
494
782
  this.ngZone.run(() => {
495
783
  this.subtreeFocused = this.focusOrigin(origin);
496
784
  this.changeDetectorRef?.markForCheck();
@@ -502,33 +790,168 @@ export class MultiSelectComponent {
502
790
  this.focusMonitorSubscription?.unsubscribe();
503
791
  }
504
792
  }
793
+ handleScrolledIndexChange(scrolledIndex, scrollViewport) {
794
+ if (!this.scrollViewport) {
795
+ this.scrollViewport = scrollViewport;
796
+ }
797
+ const availableOptions = this.options.filter(option => option.visible);
798
+ const firstVisibleOption = availableOptions[scrolledIndex];
799
+ const activeOptionIndex = availableOptions.findIndex(option => option.value === this.activeOption?.value);
800
+ const optionsArray = this.multiSelectOptionsContent.toArray();
801
+ if (scrolledIndex > activeOptionIndex) {
802
+ const firstVisibleItem = optionsArray.find(option => option.value === firstVisibleOption?.value);
803
+ if (firstVisibleItem && scrolledIndex) {
804
+ this.listKeyManager.setActiveItem(firstVisibleItem);
805
+ }
806
+ return;
807
+ }
808
+ if (scrolledIndex + this.visibleItems - 2 <= activeOptionIndex) {
809
+ const lastVisibleItem = optionsArray.findIndex(option => option.value === firstVisibleOption.value);
810
+ if (lastVisibleItem > -1) {
811
+ this.listKeyManager.setActiveItem(lastVisibleItem + this.visibleItems - 2);
812
+ }
813
+ return;
814
+ }
815
+ }
816
+ trackByFn(index, option) {
817
+ return option.value;
818
+ }
819
+ handleSearchValueChange(searchValue) {
820
+ this.searchValue = searchValue;
821
+ if (!searchValue) {
822
+ this.scrollViewport?.scrollToIndex(0);
823
+ this.multiSelectOptionsContent.notifyOnChanges();
824
+ }
825
+ }
826
+ setVirtualScroller() {
827
+ if (!this.virtualScroller) {
828
+ return;
829
+ }
830
+ // multiSelectOptionTemplate for virtualScroller
831
+ this.contentTemplates.forEach((child) => {
832
+ this.templates[child.id] = child.templateRef;
833
+ });
834
+ // if no template found, get defaultMultiSelectOptionTemplate from view
835
+ if (!this.templates['multiSelectOptionTemplate']) {
836
+ this.multiSelectOptionsContent = this.multiSelectOptionsView;
837
+ }
838
+ // multiSelectOptionsContent gets out of order on changes
839
+ // do sort() and reset()
840
+ const indexOfOption = (option) => {
841
+ return [...option.elementRef.nativeElement.parentElement.children]?.indexOf(option.elementRef.nativeElement);
842
+ };
843
+ const optionsChange$ = this.multiSelectOptionsContent.changes;
844
+ const sortedOptions$ = optionsChange$.pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")), map(options => options.toArray()), filter(options => options.length > 0), map(options => options.sort((a, b) => indexOfOption(a) - indexOfOption(b))));
845
+ sortedOptions$
846
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")))
847
+ .subscribe(sortedOptions => {
848
+ return this.multiSelectOptionsContent.reset(sortedOptions);
849
+ });
850
+ this.scrollViewportView.changes
851
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")), take(1), map(changes => changes.toArray()[0]), tap((scrollViewport) => {
852
+ if (!this.scrollViewport) {
853
+ this.scrollViewport = scrollViewport;
854
+ const cdkVirtualScrollContentWrapper = this.scrollViewport.getElementRef().nativeElement?.firstElementChild;
855
+ if (cdkVirtualScrollContentWrapper) {
856
+ const style = getComputedStyle(cdkVirtualScrollContentWrapper, null);
857
+ const padding = parseInt(style.getPropertyValue('padding-left') ?? '12px') * 3;
858
+ const observer = new MutationObserver((mutationRecords) => {
859
+ mutationRecords.forEach(child => {
860
+ child.addedNodes.forEach(node => {
861
+ if (node.nodeName === 'C-MULTI-SELECT-OPTION') {
862
+ const width = node.offsetWidth;
863
+ if (width > this.itemMinWidth) {
864
+ this.itemMinWidth = width + padding;
865
+ }
866
+ }
867
+ });
868
+ });
869
+ });
870
+ observer.observe(cdkVirtualScrollContentWrapper, { childList: true });
871
+ __classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f").subscribe(() => {
872
+ observer.disconnect();
873
+ });
874
+ }
875
+ }
876
+ }))
877
+ .subscribe();
878
+ }
879
+ setListKeyManager() {
880
+ // run once on multiSelectOptionsContent first set
881
+ this.multiSelectOptionsContent.changes
882
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")), take(1))
883
+ .subscribe(change => {
884
+ this.listKeyManager = new FocusKeyManager(this.multiSelectOptionsContent)
885
+ .withHomeAndEnd()
886
+ .skipPredicate((option) => (option.disabled || !option.visible));
887
+ if (!this._virtualScroller) {
888
+ this.listKeyManager.withTypeAhead(300);
889
+ }
890
+ this.listKeyManager.change
891
+ .pipe(takeUntil(__classPrivateFieldGet(this, _MultiSelectComponent_destroy$, "f")))
892
+ .subscribe(change => {
893
+ if (change < 0) {
894
+ this.activeOption ? this.listKeyManager.setActiveItem(this.activeOption) : this.setFirstItemActive();
895
+ }
896
+ if (this.listKeyManager.activeItem) {
897
+ this.listKeyManager.activeItem.active = true;
898
+ }
899
+ this.activeOption = this.listKeyManager.activeItem;
900
+ this.multiSelectOptionsContent.notifyOnChanges();
901
+ });
902
+ if (!this.listKeyManager.activeItem) {
903
+ this.setFirstItemActive();
904
+ }
905
+ });
906
+ }
907
+ get firstFocusableItem() {
908
+ return this.multiSelectOptionsContent?.find(option => option.visible && !option.disabled);
909
+ }
910
+ setFirstItemActive() {
911
+ const firstFocusableItem = this.firstFocusableItem;
912
+ firstFocusableItem ? this.listKeyManager?.setActiveItem(firstFocusableItem) : this.listKeyManager?.setFirstItemActive();
913
+ this.activeOption = this.listKeyManager?.activeItem ?? null;
914
+ }
915
+ updateActiveItem(item) {
916
+ const firstFocusableItem = this.firstFocusableItem ?? item;
917
+ firstFocusableItem ? this.listKeyManager?.updateActiveItem(firstFocusableItem) : this.listKeyManager?.updateActiveItem(0);
918
+ if (this.listKeyManager?.activeItem) {
919
+ this.multiSelectOptionsContent?.forEach(option => {
920
+ option.active = false;
921
+ });
922
+ this.listKeyManager.activeItem.active = true;
923
+ }
924
+ this.activeOption = this.listKeyManager?.activeItem ?? null;
925
+ }
505
926
  }
506
- _MultiSelectComponent_destroy$ = new WeakMap();
507
- MultiSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i1.FocusMonitor }, { token: i2.MultiSelectService }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
508
- MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: MultiSelectComponent, selector: "c-multi-select", inputs: { cleaner: "cleaner", disabled: "disabled", multiple: "multiple", nativeName: "nativeName", nativeId: "nativeId", options: "options", optionsMaxHeight: "optionsMaxHeight", optionsStyle: "optionsStyle", placeholder: "placeholder", search: "search", searchNoResultsLabel: "searchNoResultsLabel", searchValue: "searchValue", selectAll: "selectAll", selectAllLabel: "selectAllLabel", selectionType: "selectionType", selectionTypeCounterText: "selectionTypeCounterText", selectionTypeCounterTextPluralMap: "selectionTypeCounterTextPluralMap", size: "size", value: "value", valid: "valid", virtualScroller: "virtualScroller", visibleItems: "visibleItems", visible: "visible", popperjsOptions: ["popperOptions", "popperjsOptions"] }, outputs: { searchValueChange: "searchValueChange", valueChange: "valueChange", visibleChange: "visibleChange" }, host: { listeners: { "keyup": "onKeyUp($event)", "keydown": "onKeyDown($event)", "click": "onClick($event)" }, properties: { "class": "this.hostClasses", "attr.aria-multiselectable": "this.ariaMultiSelectable", "attr.tabindex": "this.tabIndex" } }, providers: [
927
+ _MultiSelectComponent_destroy$ = new WeakMap(), _MultiSelectComponent_optionsReady$ = new WeakMap(), _MultiSelectComponent_options = new WeakMap(), _MultiSelectComponent_value = new WeakMap();
928
+ MultiSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i1.FocusMonitor }, { token: i2.MultiSelectService }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
929
+ MultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MultiSelectComponent, selector: "c-multi-select", inputs: { cleaner: "cleaner", disabled: "disabled", multiple: "multiple", nativeFormId: "nativeFormId", nativeId: "nativeId", nativeName: "nativeName", options: "options", optionsMaxHeight: "optionsMaxHeight", optionsStyle: "optionsStyle", placeholder: "placeholder", search: "search", searchNoResultsLabel: "searchNoResultsLabel", searchValue: "searchValue", selectAll: "selectAll", selectAllLabel: "selectAllLabel", selectionType: "selectionType", selectionTypeCounterText: "selectionTypeCounterText", selectionTypeCounterTextPluralMap: "selectionTypeCounterTextPluralMap", size: "size", value: "value", valid: "valid", virtualScroller: "virtualScroller", visibleItems: "visibleItems", itemSize: "itemSize", itemMinWidth: "itemMinWidth", visible: "visible", popperjsOptions: ["popperOptions", "popperjsOptions"] }, outputs: { searchValueChange: "searchValueChange", valueChange: "valueChange", visibleChange: "visibleChange" }, host: { listeners: { "keyup": "onKeyUp($event)", "keydown": "onKeyDown($event)", "click": "onClick($event)" }, properties: { "class": "this.hostClasses", "attr.aria-multiselectable": "this.ariaMultiSelectable", "attr.tabindex": "this.tabIndex" } }, providers: [
509
930
  MultiSelectService,
510
931
  {
511
932
  provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MultiSelectComponent), multi: true
512
933
  }
513
- ], queries: [{ propertyName: "multiSelectOptions", predicate: MultiSelectOptionComponent, descendants: true }], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }, { propertyName: "dropdownMenu", first: true, predicate: ["dropdownMenu"], descendants: true }, { propertyName: "dropdownToggle", first: true, predicate: DropdownToggleDirective, descendants: true }, { propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true, read: ElementRef }], exportAs: ["cMultiSelect"], usesOnChanges: true, ngImport: i0, template: "<c-dropdown #dropdown=\"cDropdown\" [autoClose]=\"'outside'\" class=\"picker\" [ngClass]=\"multiselectClasses\"\n [(visible)]=\"visible\" [popperOptions]=\"popperjsOptions\">\n <div [caret]=\"false\" [disabled]=\"disabled\" cDropdownToggle #dropdownToggle=\"cDropdownToggle\">\n <div class=\"form-multi-select-selection\">\n <ng-template [ngIf]=\"selectionType === 'tags'\">\n <c-multi-select-tag\n *ngFor=\"let option of selectedOptions; index as i\"\n (remove)=\"handleTagRemove($event)\"\n [option]=\"option\"\n tabindex=\"-1\"\n class=\"form-multi-select-tag\"\n ></c-multi-select-tag>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'text' && !!selectedOptionsText\">\n <span class=\"form-multi-select-search\">{{ selectedOptionsText }}</span>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'counter'\">\n <span *ngIf=\"counterTextType === 'string'; else pluralMap\">{{ counterText }}</span>\n <ng-template #pluralMap>\n <span>{{selectedOptions.length}} {{ selectedOptions.length | i18nPlural: selectionTypeCounterTextPluralMap ?? { other: counterText } }}</span>\n </ng-template>\n </ng-template>\n <!-- <ng-template [ngIf]=\"!search && selectedOptions.length === 0 && selectionType !== 'counter'\">-->\n <!-- <span class=\"form-multi-select-search\">{{ placeholder }}</span>-->\n <!-- </ng-template>-->\n </div>\n\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"disabled || !search\"\n [ngClass]=\"{ 'form-multi-select-search': true, disabled: (disabled || !search) }\"\n [attr.placeholder]=\"selectedOptions.length === 0 && selectionType !== 'counter' ? placeholder : null\"\n autocomplete=\"off\"\n tabindex=\"{{ disabled ? '-1' : '0' }}\"\n type=\"text\"\n >\n\n <button\n (click)=\"clearAllOptions($event)\"\n *ngIf=\"cleaner && selectedOptions.length > 0 && !disabled\"\n [disabled]=\"disabled || !isDropdownVisible\"\n aria-label=\"Clear all\"\n class=\"form-multi-select-selection-cleaner\"\n ></button>\n </div>\n\n <div *ngIf=\"!disabled\" class=\"\" cDropdownMenu #dropdownMenu=\"cDropdownMenu\" [visible]=\"dropdown.visible\">\n <ng-template [ngIfElse]=\"optionsEmpty\" [ngIf]=\"visibleOptions > 0\">\n <button (click)=\"selectAllOptions()\" *ngIf=\"selectAll && multiple\" class=\"form-multi-select-all\">\n {{ selectAllLabel }}\n </button>\n <div #multiselectOptionsDiv\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'maxHeight.px': optionsMaxHeight, overflowY: 'scroll' } : {}\"\n class=\"form-multi-select-options\"\n >\n <ng-content></ng-content>\n </div>\n </ng-template>\n <ng-template #optionsEmpty>\n <div class=\"form-multi-select-options-empty\">{{ searchNoResultsLabel }}</div>\n </ng-template>\n </div>\n</c-dropdown>\n", styles: [":host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{color:var(--cui-form-multi-select-focus-color, rgba(44, 56, 74, .95));background-color:var(--cui-form-multi-select-focus-bg, #fff);border-color:var(--cui-form-multi-select-focus-border-color, #6557e4);box-shadow:0 0 0 .25rem #321fdb40}:host:not(.cdk-focused) .form-multi-select:not(.show) input.form-multi-select-search:not([placeholder]){width:.1rem;margin-inline-start:0}:host .form-multi-select-search[size]{display:inline}:host .form-multi-select-selection-tags .form-multi-select-search{height:1.5rem}:host-context(.dark-theme)::ng-deep .form-multi-select-optgroup-label{color:var(--cui-form-multi-select-disabled-color)}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.DropdownComponent, selector: "c-dropdown", inputs: ["alignment", "autoClose", "dark", "direction", "placement", "popper", "popperOptions", "variant", "visible"], outputs: ["visibleChange"], exportAs: ["cDropdown"] }, { kind: "directive", type: i5.DropdownToggleDirective, selector: "[cDropdownToggle]", inputs: ["dropdownComponent", "disabled", "caret", "split"], exportAs: ["cDropdownToggle"] }, { kind: "directive", type: i6.DropdownMenuDirective, selector: "[cDropdownMenu]", inputs: ["alignment", "visible", "dark"], exportAs: ["cDropdownMenu"] }, { kind: "component", type: i7.MultiSelectTagComponent, selector: "c-multi-select-tag", inputs: ["option"], outputs: ["remove"] }, { kind: "pipe", type: i3.I18nPluralPipe, name: "i18nPlural" }] });
514
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: MultiSelectComponent, decorators: [{
934
+ ], queries: [{ propertyName: "multiSelectOptionsContent", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true }], viewQueries: [{ propertyName: "optionsElementRef", first: true, predicate: ["options"], descendants: true }, { propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }, { propertyName: "dropdownMenu", first: true, predicate: ["dropdownMenu"], descendants: true }, { propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true, read: ElementRef }, { propertyName: "dropdownToggle", first: true, predicate: DropdownToggleDirective, descendants: true, read: ElementRef }, { propertyName: "multiSelectOptionsView", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "scrollViewportView", predicate: ["scrollViewport"], descendants: true }], exportAs: ["cMultiSelect"], usesOnChanges: true, ngImport: i0, template: "<c-dropdown #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [ngClass]=\"multiselectClasses\"\n [popperOptions]=\"popperjsOptions\"\n class=\"picker\">\n <div #dropdownToggle=\"cDropdownToggle\" [caret]=\"false\" [disabled]=\"disabled\" cDropdownToggle>\n <div class=\"form-multi-select-selection\">\n <ng-template [ngIf]=\"selectionType === 'tags'\">\n <ng-container *ngIf=\"(optionsSelected$ | async) as optionTags\">\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n *ngFor=\"let option of optionTags; index as i\"\n [disabled]=\"option.disabled ?? false\"\n [label]=\"option.label\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag\"\n tabindex=\"-1\">\n </c-multi-select-tag>\n </ng-container>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'text' && !!selectedOptionsText\">\n <span class=\"form-multi-select-search\">{{ selectedOptionsText }}</span>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'counter'\">\n <span *ngIf=\"counterTextType === 'string'; else pluralMap\">{{ counterText }}</span>\n <ng-template #pluralMap>\n <span>{{selectedOptions.length}} {{ selectedOptions.length | i18nPlural: selectionTypeCounterTextPluralMap ?? { other: counterText } }}</span>\n </ng-template>\n </ng-template>\n <!-- <ng-template [ngIf]=\"!search && selectedOptions.length === 0 && selectionType !== 'counter'\">-->\n <!-- <span class=\"form-multi-select-search\">{{ placeholder }}</span>-->\n <!-- </ng-template>-->\n </div>\n\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"optionsSelected.size === 0 && selectionType !== 'counter' ? placeholder : null\"\n [disabled]=\"disabled || !search\"\n [ngClass]=\"{ 'form-multi-select-search': true, disabled: (disabled || !search) }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"3\"\n tabindex=\"{{ disabled ? -1 : 0 }}\"\n type=\"text\"\n >\n\n <button\n (click)=\"clearAllOptions($event)\"\n *ngIf=\"cleaner && optionsSelected.size > 0 && !disabled\"\n [disabled]=\"disabled || !isDropdownVisible\"\n aria-label=\"Clear all\"\n class=\"form-multi-select-selection-cleaner\"\n ></button>\n </div>\n <div #dropdownMenu=\"cDropdownMenu\" *ngIf=\"!disabled\" [visible]=\"dropdown.visible\" cDropdownMenu>\n <ng-template [ngIfElse]=\"optionsEmpty\" [ngIf]=\"visibleOptions > 0 && options.length > 0\">\n <button (click)=\"selectAllOptions()\"\n *ngIf=\"selectAll && multiple && !virtualScroller\"\n class=\"form-multi-select-all\"\n >\n {{ selectAllLabel }}\n </button>\n <ng-container\n *ngTemplateOutlet=\"virtualScroller ? multiselectVirtualScroller : multiselectOptionsDiv\"></ng-container>\n </ng-template>\n <ng-template #optionsEmpty>\n <div class=\"form-multi-select-options-empty\">{{ searchNoResultsLabel }}</div>\n </ng-template>\n </div>\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n *ngIf=\"optionsArray$ | async as optionsArray\"\n [itemSize]=\"itemSize\"\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'height.px': optionsMaxHeight, 'maxHeight.px': optionsMaxHeight, 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden' } : { 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden'}\"\n maxBufferPx=\"{{itemSize * visibleItems}}\"\n minBufferPx=\"{{itemSize * visibleItems}}\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"let option of optionsArray; trackBy: trackByFn; templateCacheSize: 0; even as even; odd as odd; index as index; count as count; first as first; last as last;\"\n [ngTemplateOutletContext]=\"{$implicit: option, even, odd, index, count, first, last}\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n >\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n <div\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'maxHeight.px': optionsMaxHeight, overflowY: 'scroll' } : {}\"\n class=\"form-multi-select-options\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [selected]=\"option.selected\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{option.text}}\n </c-multi-select-option>\n</ng-template>\n", styles: [":host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{color:var(--cui-form-multi-select-focus-color, rgba(44, 56, 74, .95));background-color:var(--cui-form-multi-select-focus-bg, #fff);border-color:var(--cui-form-multi-select-focus-border-color, #6557e4);box-shadow:0 0 0 .25rem #321fdb40}:host:not(.cdk-focused) .form-multi-select:not(.show) input.form-multi-select-search:not([placeholder]){width:.1rem;margin-inline-start:0}:host .form-multi-select-search[size]{display:inline-block}:host .form-multi-select-selection-tags .form-multi-select-search{height:1.5rem}:host ::ng-deep .cdk-virtual-scroll-content-wrapper{padding:var(--cui-form-multi-select-options-padding-y) var(--cui-form-multi-select-options-padding-x);font-size:1rem;color:var(--cui-form-multi-select-options-color)}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host-context(.dark-theme)::ng-deep .form-multi-select-optgroup-label{color:var(--cui-form-multi-select-disabled-color)}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.DropdownComponent, selector: "c-dropdown", inputs: ["alignment", "autoClose", "dark", "direction", "placement", "popper", "popperOptions", "variant", "visible"], outputs: ["visibleChange"], exportAs: ["cDropdown"] }, { kind: "directive", type: i5.DropdownToggleDirective, selector: "[cDropdownToggle]", inputs: ["dropdownComponent", "disabled", "caret", "split"], exportAs: ["cDropdownToggle"] }, { kind: "directive", type: i6.DropdownMenuDirective, selector: "[cDropdownMenu]", inputs: ["alignment", "visible", "dark"], exportAs: ["cDropdownMenu"] }, { kind: "directive", type: i7.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i7.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i7.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i8.MultiSelectOptionComponent, selector: "c-multi-select-option", inputs: ["optionsStyle", "label", "text", "visible", "disabled", "selected", "value", "active", "role"], outputs: ["selectedChange", "focusChange"], exportAs: ["cMultiSelectOption"] }, { kind: "component", type: i9.MultiSelectTagComponent, selector: "c-multi-select-tag", inputs: ["option", "disabled", "label", "value"], outputs: ["remove"] }, { kind: "directive", type: i10.MultiSelectSearchDirective, selector: "[cMultiSelectSearch]", inputs: ["delay", "value"], outputs: ["valueChange"], exportAs: ["cMultiSelectSearch"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.I18nPluralPipe, name: "i18nPlural" }] });
935
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiSelectComponent, decorators: [{
515
936
  type: Component,
516
937
  args: [{ selector: 'c-multi-select', exportAs: 'cMultiSelect', providers: [
517
938
  MultiSelectService,
518
939
  {
519
940
  provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MultiSelectComponent), multi: true
520
941
  }
521
- ], template: "<c-dropdown #dropdown=\"cDropdown\" [autoClose]=\"'outside'\" class=\"picker\" [ngClass]=\"multiselectClasses\"\n [(visible)]=\"visible\" [popperOptions]=\"popperjsOptions\">\n <div [caret]=\"false\" [disabled]=\"disabled\" cDropdownToggle #dropdownToggle=\"cDropdownToggle\">\n <div class=\"form-multi-select-selection\">\n <ng-template [ngIf]=\"selectionType === 'tags'\">\n <c-multi-select-tag\n *ngFor=\"let option of selectedOptions; index as i\"\n (remove)=\"handleTagRemove($event)\"\n [option]=\"option\"\n tabindex=\"-1\"\n class=\"form-multi-select-tag\"\n ></c-multi-select-tag>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'text' && !!selectedOptionsText\">\n <span class=\"form-multi-select-search\">{{ selectedOptionsText }}</span>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'counter'\">\n <span *ngIf=\"counterTextType === 'string'; else pluralMap\">{{ counterText }}</span>\n <ng-template #pluralMap>\n <span>{{selectedOptions.length}} {{ selectedOptions.length | i18nPlural: selectionTypeCounterTextPluralMap ?? { other: counterText } }}</span>\n </ng-template>\n </ng-template>\n <!-- <ng-template [ngIf]=\"!search && selectedOptions.length === 0 && selectionType !== 'counter'\">-->\n <!-- <span class=\"form-multi-select-search\">{{ placeholder }}</span>-->\n <!-- </ng-template>-->\n </div>\n\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"disabled || !search\"\n [ngClass]=\"{ 'form-multi-select-search': true, disabled: (disabled || !search) }\"\n [attr.placeholder]=\"selectedOptions.length === 0 && selectionType !== 'counter' ? placeholder : null\"\n autocomplete=\"off\"\n tabindex=\"{{ disabled ? '-1' : '0' }}\"\n type=\"text\"\n >\n\n <button\n (click)=\"clearAllOptions($event)\"\n *ngIf=\"cleaner && selectedOptions.length > 0 && !disabled\"\n [disabled]=\"disabled || !isDropdownVisible\"\n aria-label=\"Clear all\"\n class=\"form-multi-select-selection-cleaner\"\n ></button>\n </div>\n\n <div *ngIf=\"!disabled\" class=\"\" cDropdownMenu #dropdownMenu=\"cDropdownMenu\" [visible]=\"dropdown.visible\">\n <ng-template [ngIfElse]=\"optionsEmpty\" [ngIf]=\"visibleOptions > 0\">\n <button (click)=\"selectAllOptions()\" *ngIf=\"selectAll && multiple\" class=\"form-multi-select-all\">\n {{ selectAllLabel }}\n </button>\n <div #multiselectOptionsDiv\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'maxHeight.px': optionsMaxHeight, overflowY: 'scroll' } : {}\"\n class=\"form-multi-select-options\"\n >\n <ng-content></ng-content>\n </div>\n </ng-template>\n <ng-template #optionsEmpty>\n <div class=\"form-multi-select-options-empty\">{{ searchNoResultsLabel }}</div>\n </ng-template>\n </div>\n</c-dropdown>\n", styles: [":host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{color:var(--cui-form-multi-select-focus-color, rgba(44, 56, 74, .95));background-color:var(--cui-form-multi-select-focus-bg, #fff);border-color:var(--cui-form-multi-select-focus-border-color, #6557e4);box-shadow:0 0 0 .25rem #321fdb40}:host:not(.cdk-focused) .form-multi-select:not(.show) input.form-multi-select-search:not([placeholder]){width:.1rem;margin-inline-start:0}:host .form-multi-select-search[size]{display:inline}:host .form-multi-select-selection-tags .form-multi-select-search{height:1.5rem}:host-context(.dark-theme)::ng-deep .form-multi-select-optgroup-label{color:var(--cui-form-multi-select-disabled-color)}\n"] }]
942
+ ], template: "<c-dropdown #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [ngClass]=\"multiselectClasses\"\n [popperOptions]=\"popperjsOptions\"\n class=\"picker\">\n <div #dropdownToggle=\"cDropdownToggle\" [caret]=\"false\" [disabled]=\"disabled\" cDropdownToggle>\n <div class=\"form-multi-select-selection\">\n <ng-template [ngIf]=\"selectionType === 'tags'\">\n <ng-container *ngIf=\"(optionsSelected$ | async) as optionTags\">\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n *ngFor=\"let option of optionTags; index as i\"\n [disabled]=\"option.disabled ?? false\"\n [label]=\"option.label\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag\"\n tabindex=\"-1\">\n </c-multi-select-tag>\n </ng-container>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'text' && !!selectedOptionsText\">\n <span class=\"form-multi-select-search\">{{ selectedOptionsText }}</span>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'counter'\">\n <span *ngIf=\"counterTextType === 'string'; else pluralMap\">{{ counterText }}</span>\n <ng-template #pluralMap>\n <span>{{selectedOptions.length}} {{ selectedOptions.length | i18nPlural: selectionTypeCounterTextPluralMap ?? { other: counterText } }}</span>\n </ng-template>\n </ng-template>\n <!-- <ng-template [ngIf]=\"!search && selectedOptions.length === 0 && selectionType !== 'counter'\">-->\n <!-- <span class=\"form-multi-select-search\">{{ placeholder }}</span>-->\n <!-- </ng-template>-->\n </div>\n\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"optionsSelected.size === 0 && selectionType !== 'counter' ? placeholder : null\"\n [disabled]=\"disabled || !search\"\n [ngClass]=\"{ 'form-multi-select-search': true, disabled: (disabled || !search) }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"3\"\n tabindex=\"{{ disabled ? -1 : 0 }}\"\n type=\"text\"\n >\n\n <button\n (click)=\"clearAllOptions($event)\"\n *ngIf=\"cleaner && optionsSelected.size > 0 && !disabled\"\n [disabled]=\"disabled || !isDropdownVisible\"\n aria-label=\"Clear all\"\n class=\"form-multi-select-selection-cleaner\"\n ></button>\n </div>\n <div #dropdownMenu=\"cDropdownMenu\" *ngIf=\"!disabled\" [visible]=\"dropdown.visible\" cDropdownMenu>\n <ng-template [ngIfElse]=\"optionsEmpty\" [ngIf]=\"visibleOptions > 0 && options.length > 0\">\n <button (click)=\"selectAllOptions()\"\n *ngIf=\"selectAll && multiple && !virtualScroller\"\n class=\"form-multi-select-all\"\n >\n {{ selectAllLabel }}\n </button>\n <ng-container\n *ngTemplateOutlet=\"virtualScroller ? multiselectVirtualScroller : multiselectOptionsDiv\"></ng-container>\n </ng-template>\n <ng-template #optionsEmpty>\n <div class=\"form-multi-select-options-empty\">{{ searchNoResultsLabel }}</div>\n </ng-template>\n </div>\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n *ngIf=\"optionsArray$ | async as optionsArray\"\n [itemSize]=\"itemSize\"\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'height.px': optionsMaxHeight, 'maxHeight.px': optionsMaxHeight, 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden' } : { 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden'}\"\n maxBufferPx=\"{{itemSize * visibleItems}}\"\n minBufferPx=\"{{itemSize * visibleItems}}\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"let option of optionsArray; trackBy: trackByFn; templateCacheSize: 0; even as even; odd as odd; index as index; count as count; first as first; last as last;\"\n [ngTemplateOutletContext]=\"{$implicit: option, even, odd, index, count, first, last}\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n >\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n <div\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'maxHeight.px': optionsMaxHeight, overflowY: 'scroll' } : {}\"\n class=\"form-multi-select-options\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [selected]=\"option.selected\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{option.text}}\n </c-multi-select-option>\n</ng-template>\n", styles: [":host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{color:var(--cui-form-multi-select-focus-color, rgba(44, 56, 74, .95));background-color:var(--cui-form-multi-select-focus-bg, #fff);border-color:var(--cui-form-multi-select-focus-border-color, #6557e4);box-shadow:0 0 0 .25rem #321fdb40}:host:not(.cdk-focused) .form-multi-select:not(.show) input.form-multi-select-search:not([placeholder]){width:.1rem;margin-inline-start:0}:host .form-multi-select-search[size]{display:inline-block}:host .form-multi-select-selection-tags .form-multi-select-search{height:1.5rem}:host ::ng-deep .cdk-virtual-scroll-content-wrapper{padding:var(--cui-form-multi-select-options-padding-y) var(--cui-form-multi-select-options-padding-x);font-size:1rem;color:var(--cui-form-multi-select-options-color)}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host-context(.dark-theme)::ng-deep .form-multi-select-optgroup-label{color:var(--cui-form-multi-select-disabled-color)}\n"] }]
522
943
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }, { type: i1.FocusMonitor }, { type: i2.MultiSelectService }, { type: i0.IterableDiffers }]; }, propDecorators: { cleaner: [{
523
944
  type: Input
524
945
  }], disabled: [{
525
946
  type: Input
526
947
  }], multiple: [{
527
948
  type: Input
528
- }], nativeName: [{
949
+ }], nativeFormId: [{
529
950
  type: Input
530
951
  }], nativeId: [{
531
952
  type: Input
953
+ }], nativeName: [{
954
+ type: Input
532
955
  }], options: [{
533
956
  type: Input
534
957
  }], optionsMaxHeight: [{
@@ -567,6 +990,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
567
990
  type: Input
568
991
  }], visibleItems: [{
569
992
  type: Input
993
+ }], itemSize: [{
994
+ type: Input
995
+ }], itemMinWidth: [{
996
+ type: Input
570
997
  }], visible: [{
571
998
  type: Input
572
999
  }], visibleChange: [{
@@ -574,21 +1001,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
574
1001
  }], popperjsOptions: [{
575
1002
  type: Input,
576
1003
  args: ['popperOptions']
577
- }], multiSelectOptions: [{
1004
+ }], multiSelectOptionsContent: [{
578
1005
  type: ContentChildren,
579
1006
  args: [MultiSelectOptionComponent, { descendants: true }]
1007
+ }], multiSelectOptionsView: [{
1008
+ type: ViewChildren,
1009
+ args: [MultiSelectOptionComponent]
1010
+ }], scrollViewportView: [{
1011
+ type: ViewChildren,
1012
+ args: ['scrollViewport']
1013
+ }], optionsElementRef: [{
1014
+ type: ViewChild,
1015
+ args: ['options']
1016
+ }], contentTemplates: [{
1017
+ type: ContentChildren,
1018
+ args: [TemplateIdDirective, { descendants: true }]
580
1019
  }], inputElement: [{
581
1020
  type: ViewChild,
582
1021
  args: ['inputElement']
583
1022
  }], dropdownMenu: [{
584
1023
  type: ViewChild,
585
1024
  args: ['dropdownMenu']
586
- }], dropdownToggle: [{
587
- type: ViewChild,
588
- args: [DropdownToggleDirective]
589
1025
  }], dropdown: [{
590
1026
  type: ViewChild,
591
1027
  args: [DropdownComponent, { read: ElementRef }]
1028
+ }], dropdownToggle: [{
1029
+ type: ViewChild,
1030
+ args: [DropdownToggleDirective, { read: ElementRef }]
592
1031
  }], hostClasses: [{
593
1032
  type: HostBinding,
594
1033
  args: ['class']
@@ -608,4 +1047,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
608
1047
  type: HostListener,
609
1048
  args: ['click', ['$event']]
610
1049
  }] } });
611
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9tdWx0aS1zZWxlY3QvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFJTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQU9MLE1BQU0sRUFJTixTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBNkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMvRSxPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBRzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQ3RILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBTTNDLGFBQWE7QUFDYixNQUFNLENBQUMsTUFBTSx3QkFBd0Is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O3NCQUFyQixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyxpQ0FBaUM7c0JBQXpDLEtBQUs7Z0JBTUcsSUFBSTtzQkFBWixLQUFLO2dCQU1PLEtBQUs7c0JBQWpCLEtBQUs7Z0JBcUJhLFdBQVc7c0JBQTdCLE1BQU07Z0JBT0UsS0FBSztzQkFBYixLQUFLO2dCQVNGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBaUJGLFlBQVk7c0JBRGYsS0FBSztnQkFpQk8sT0FBTztzQkFBbkIsS0FBSztnQkFpQmEsYUFBYTtzQkFBL0IsTUFBTTtnQkFNaUIsZUFBZTtzQkFBdEMsS0FBSzt1QkFBQyxlQUFlO2dCQXNDOEMsa0JBQWtCO3NCQUFyRixlQUFlO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFJdkMsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNFLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDVyxjQUFjO3NCQUFqRCxTQUFTO3VCQUFDLHVCQUF1QjtnQkFDa0IsUUFBUTtzQkFBM0QsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBRXhCLFdBQVc7c0JBQXBDLFdBQVc7dUJBQUMsT0FBTztnQkFvQlIsbUJBQW1CO3NCQUQ5QixXQUFXO3VCQUFDLDJCQUEyQjtnQkFNNUIsUUFBUTtzQkFEbkIsV0FBVzt1QkFBQyxlQUFlO2dCQWFPLE9BQU87c0JBQXpDLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTJCSSxTQUFTO3NCQUE3QyxZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXQSxPQUFPO3NCQUF6QyxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb2N1c0tleU1hbmFnZXIsIEZvY3VzTW9uaXRvciwgRm9jdXNPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1vZGlmaWVyLCBNb2RpZmllckFyZ3VtZW50cywgT3B0aW9ucyB9IGZyb20gJ0Bwb3BwZXJqcy9jb3JlJztcblxuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIERyb3Bkb3duVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZHJvcGRvd24nO1xuaW1wb3J0IHsgSU11bHRpU2VsZWN0LCBJT3B0aW9uIH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LnR5cGUnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9tdWx0aS1zZWxlY3Qtb3B0aW9uL211bHRpLXNlbGVjdC1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpU2VsZWN0TmF0aXZlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LW5hdGl2ZS1zZWxlY3QvbXVsdGktc2VsZWN0LW5hdGl2ZS1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW50ZXJmYWNlIElQbHVyYWxNYXAge1xuICBbazogc3RyaW5nXTogc3RyaW5nO1xufVxuXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3Qgb2JzZXJ2ZVJlZmVyZW5jZU1vZGlmaWVyOiBNb2RpZmllcjxzdHJpbmcsIGFueT4gPSB7XG4gIG5hbWU6ICdvYnNlcnZlUmVmZXJlbmNlTW9kaWZpZXInLCBlbmFibGVkOiB0cnVlLCBwaGFzZTogJ21haW4nLCBmbih7IHN0YXRlIH0pIHt9LFxuXG4gIGVmZmVjdDogKHsgc3RhdGUsIGluc3RhbmNlIH06IE1vZGlmaWVyQXJndW1lbnRzPE9wdGlvbnM+KSA9PiB7XG4gICAgY29uc3QgUk9fUFJPUCA9ICdfX3BvcHBlcmpzUk9fXyc7XG4gICAgY29uc3QgeyByZWZlcmVuY2UgfSA9IHN0YXRlLmVsZW1lbnRzO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJlZmVyZW5jZVtST19QUk9QXSA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmVmZXJlbmNlW1JPX1BST1BdLm9ic2VydmUocmVmZXJlbmNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmVmZXJlbmNlW1JPX1BST1BdLmRpc2Nvbm5lY3QoKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGRlbGV0ZSByZWZlcmVuY2VbUk9fUFJPUF07XG4gICAgfTtcbiAgfVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYy1tdWx0aS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbXVsdGktc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGV4cG9ydEFzOiAnY011bHRpU2VsZWN0JyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgTXVsdGlTZWxlY3RTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aVNlbGVjdENvbXBvbmVudCksIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgSU11bHRpU2VsZWN0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGZvY3VzTW9uaXRvcjogRm9jdXNNb25pdG9yLFxuICAgIHByaXZhdGUgbXVsdGlTZWxlY3RTZXJ2aWNlOiBNdWx0aVNlbGVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVyc1xuICApIHtcbiAgICB0aGlzLmRpZmZlciA9IHRoaXMuaXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5fdmFsdWUpLmNyZWF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkaWZmZXIhOiBJdGVyYWJsZURpZmZlcjxhbnk+O1xuXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9tdWx0aXBsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3ZpcnR1YWxTY3JvbGxlcjogQm9vbGVhbklucHV0O1xuXG4gIHJlYWRvbmx5ICNkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgb25DaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIHdyaXRlVmFsdWUodmFsdWU6IChzdHJpbmcgfCBzdHJpbmdbXSkpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiBbdmFsdWUgPz8gJyddO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBASW5wdXQoKSBjbGVhbmVyID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgICB0aGlzLnNldEZvY3VzTW9uaXRvcighdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBtdWx0aXBsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX211bHRpcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGU7XG4gIH1cblxuICBwcml2YXRlIF9tdWx0aXBsZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG5hdGl2ZU5hbWUgPSAnJztcbiAgQElucHV0KCkgbmF0aXZlSWQgPSAnJztcbiAgQElucHV0KCkgb3B0aW9uczogSU9wdGlvbltdID0gW107XG4gIEBJbnB1dCgpIG9wdGlvbnNNYXhIZWlnaHQgPSAnYXV0byc7XG4gIEBJbnB1dCgpIG9wdGlvbnNTdHlsZTogJ2NoZWNrYm94JyB8ICd0ZXh0JyA9ICdjaGVja2JveCc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1NlbGVjdC4uLic7XG4gIEBJbnB1dCgpIHNlYXJjaDogYm9vbGVhbiB8ICdleHRlcm5hbCcgPSB0cnVlO1xuICBASW5wdXQoKSBzZWFyY2hOb1Jlc3VsdHNMYWJlbCA9ICdubyBpdGVtcyc7XG5cbiAgQElucHV0KClcbiAgc2V0IHNlYXJjaFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuX3NlYXJjaFZhbHVlICE9PSB2YWx1ZS50cmltU3RhcnQoKSkge1xuICAgICAgdGhpcy5fc2VhcmNoVmFsdWUgPSB2YWx1ZS50cmltU3RhcnQoKTtcbiAgICAgIHRoaXMudmlzaWJsZSA9ICEhdGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGggfHwgdGhpcy52aXNpYmxlO1xuICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKHRoaXMuc2VhcmNoVmFsdWUpO1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnRTaXplKCk7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fc2VhcmNoVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzZWFyY2hWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9zZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlYXJjaFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQElucHV0KCkgc2VsZWN0QWxsID0gdHJ1ZTtcbiAgQElucHV0KCkgc2VsZWN0QWxsTGFiZWwgPSAnU2VsZWN0IGFsbCBvcHRpb25zJztcbiAgQElucHV0KCkgc2VsZWN0aW9uVHlwZTogJ2NvdW50ZXInIHwgJ3RhZ3MnIHwgJ3RleHQnID0gJ3RhZ3MnO1xuICBASW5wdXQoKSBzZWxlY3Rpb25UeXBlQ291bnRlclRleHQ6IHN0cmluZyA9ICdpdGVtKHMpIHNlbGVjdGVkJztcbiAgQElucHV0KCkgc2VsZWN0aW9uVHlwZUNvdW50ZXJUZXh0UGx1cmFsTWFwPzogSVBsdXJhbE1hcCA9IHsgJz0xJzogJ2l0ZW0gc2VsZWN0ZWQnLCAnb3RoZXInOiAnaXRlbXMgc2VsZWN0ZWQnIH07XG5cbiAgLyoqXG4gICAqIFNpemUgdGhlIGNvbXBvbmVudCBzbWFsbCBvciBsYXJnZS5cbiAgICogQHR5cGUgJ3NtJyB8ICdsZycgfCB1bmRlZmluZWRcbiAgICovXG4gIEBJbnB1dCgpIHNpemU/OiAnc20nIHwgJ2xnJztcblxuICAvKipcbiAgICogSW5pdGlhbCB2YWx1ZSBvZiBtdWx0aS1zZWxlY3RcbiAgICogQHR5cGUgc3RyaW5nIHwgc3RyaW5nW11cbiAgICovXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IFt2YWx1ZSA/PyAnJ107XG4gICAgaWYgKHRoaXMuZGlmZmVyKSB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5kaWZmZXIuZGlmZihuZXdWYWx1ZSk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IFsuLi5uZXdWYWx1ZV07XG4gICAgICAgIHRoaXMub25DaGFuZ2UoWy4uLm5ld1ZhbHVlXSk7XG4gICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucygpO1xuICAgICAgICAvLyBub3QgcmVxdWlyZWQgaGVyZTpcbiAgICAgICAgLy8gdGhpcy5zZWxlY3RlZE9wdGlvbnNVcGRhdGUoKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/IFsuLi50aGlzLl92YWx1ZV0gOiB0aGlzLl92YWx1ZVswXT8udG9TdHJpbmcoKSA/PyAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmdbXSA9IFsnJ107XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBzdHJpbmdbXT4oKTtcblxuICAvKipcbiAgICogVG9nZ2xlIHZpc3VhbCB2YWxpZGF0aW9uIGZlZWRiYWNrLlxuICAgKiBAdHlwZSBib29sZWFuIHwgdW5kZWZpbmVkXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgdmFsaWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdmlydHVhbCBzY3JvbGxlciBmb3IgdGhlIG9wdGlvbnMgbGlzdC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiB0b2RvOiB2aXJ0dWFsIHNjcm9sbGVyIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgdmlydHVhbFNjcm9sbGVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdmlydHVhbFNjcm9sbGVyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCB2aXJ0dWFsU2Nyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpcnR1YWxTY3JvbGxlcjtcbiAgfVxuXG4gIHByaXZhdGUgX3ZpcnR1YWxTY3JvbGxlciA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBbW91bnQgb2YgdmlzaWJsZSBvcHRpb25zLCBpZiBzZXQgLSBvdmVyd3JpdGVzIG9wdGlvbnNNYXhIZWlnaHRcbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgdmlzaWJsZUl0ZW1zKHZhbHVlKSB7XG4gICAgdGhpcy5fdmlzaWJsZUl0ZW1zID0gdmFsdWUgfHwgMTtcbiAgICB0aGlzLm9wdGlvbnNNYXhIZWlnaHQgPSAoKDQyICogdmFsdWUpICsgMTYpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBnZXQgdmlzaWJsZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlSXRlbXM7XG4gIH1cblxuICBwcml2YXRlIF92aXNpYmxlSXRlbXMgPSAxMDtcblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBkcm9wZG93biBzZWxlY3QgY29tcG9uZW50LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgdmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHZpc2libGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmICh2aXNpYmxlICE9PSB0aGlzLl92aXNpYmxlKSB7XG4gICAgICB0aGlzLl92aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnRvZ2dsZVZpc2libGUodmlzaWJsZSk7XG4gICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyPy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgdmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2libGUgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgcG9wcGVyIE9wdGlvbnMgb2JqZWN0XG4gICAqIEB0eXBlIFBhcnRpYWw8T3B0aW9ucz5cbiAgICovXG4gIEBJbnB1dCgncG9wcGVyT3B0aW9ucycpIHBvcHBlcmpzT3B0aW9uczogUGFydGlhbDxPcHRpb25zPiA9IHtcbiAgICBzdHJhdGVneTogJ2ZpeGVkJywgbW9kaWZpZXJzOiBbb2JzZXJ2ZVJlZmVyZW5jZU1vZGlmaWVyLCB7XG4gICAgICBuYW1lOiAnb2Zmc2V0Jywgb3B0aW9uczoge1xuICAgICAgICBvZmZzZXQ6ICgpID0+IHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ3RhZ3MnICYmIHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA/IFstMiwgOF0gOiBbLTEyLCAxMl1cbiAgICAgIH1cbiAgICB9XVxuICB9O1xuXG4gIGlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG5cbiAgc2V0IHNlbGVjdGVkT3B0aW9ucyh2YWx1ZSkge1xuICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucyA9IHZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKTtcbiAgICB0aGlzLmlucHV0RWxlbWVudFNpemUoKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkT3B0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdGVkT3B0aW9uczogYW55W10gPSBbXTtcblxuICBnZXQgc2VsZWN0ZWRPcHRpb25zVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24ubGFiZWwpLmpvaW4oJywgJyk7XG4gIH1cblxuICBnZXQgY291bnRlclRleHQoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aH0gJHt0aGlzLnNlbGVjdGlvblR5cGVDb3VudGVyVGV4dH1gO1xuICB9XG5cbiAgZ2V0IGNvdW50ZXJUZXh0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5zZWxlY3Rpb25UeXBlQ291bnRlclRleHRQbHVyYWxNYXAgPz8gdHlwZW9mIHRoaXMuc2VsZWN0aW9uVHlwZUNvdW50ZXJUZXh0O1xuICB9O1xuXG4gIHByaXZhdGUgbXVsdGlzZWxlY3RTdGF0ZVN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBtdWx0aXNlbGVjdFZpc2libGVTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZm9jdXNNb25pdG9yU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgbXVsdGlTZWxlY3RPcHRpb25zITogUXVlcnlMaXN0PE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50PjtcblxuICBwcml2YXRlIGxpc3RLZXlNYW5hZ2VyITogRm9jdXNLZXlNYW5hZ2VyPE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50PjtcblxuICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnKSBpbnB1dEVsZW1lbnQhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkcm9wZG93bk1lbnUnKSBkcm9wZG93bk1lbnUhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKERyb3Bkb3duVG9nZ2xlRGlyZWN0aXZlKSBkcm9wZG93blRvZ2dsZSE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoRHJvcGRvd25Db21wb25lbnQsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkcm9wZG93biE6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGdldCBob3N0Q2xhc3NlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgZ2V0IG11bHRpc2VsZWN0Q2xhc3NlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2Zvcm0tbXVsdGktc2VsZWN0JzogdHJ1ZSxcbiAgICAgICdmb3JtLW11bHRpLXNlbGVjdC1zZWxlY3Rpb24tdGFncyc6IHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ3RhZ3MnICYmIHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA+IDAsXG4gICAgICBbYGZvcm0tbXVsdGktc2VsZWN0LSR7dGhpcy5zaXplfWBdOiAhIXRoaXMuc2l6ZSxcbiAgICAgICdmb3JtLW11bHRpLXNlbGVjdC13aXRoLWNsZWFuZXInOiB0aGlzLmNsZWFuZXIsXG4gICAgICBzaG93OiB0aGlzLnZpc2libGUsXG4gICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCxcbiAgICAgICdpcy12YWxpZCc6IHRoaXMudmFsaWQgPT09IHRydWUsXG4gICAgICAnaXMtaW52YWxpZCc6IHRoaXMudmFsaWQgPT09IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW11bHRpc2VsZWN0YWJsZScpXG4gIHByaXZhdGUgZ2V0IGFyaWFNdWx0aVNlbGVjdGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGU7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICBwcml2YXRlIGdldCB0YWJJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiSW5kZXg7XG4gIH1cblxuICBwcml2YXRlIHNldCB0YWJJbmRleCh2YWx1ZSkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fdGFiSW5kZXggPSB0aGlzLmRpc2FibGVkIHx8IHRoaXMuc2VhcmNoID8gJy0xJyA6IHZhbHVlID09PSBudWxsID8gbnVsbCA6ICcwJztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3RhYkluZGV4OiBzdHJpbmcgfCBudWxsID0gJy0xJztcblxuICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pIG9uS2V5VXAoJGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5zZXRGb2N1cygna2V5Ym9hcmQnLCAnb25LZXlVcCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydFbnRlcicsICcgJywgJ0Fycm93RG93biddLmluY2x1ZGVzKCRldmVudC5rZXkpICYmIFt0aGlzLmlucHV0RWxlbWVudD8ubmF0aXZlRWxlbWVudCwgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRdLmluY2x1ZGVzKCRldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgaWYgKCF0aGlzLnNlYXJjaCkge1xuICAgICAgICB0aGlzLnNldEZvY3VzKCdrZXlib2FyZCcsICdvbktleVVwJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgkZXZlbnQua2V5ID09PSAnVGFiJyAmJiAkZXZlbnQudGFyZ2V0ID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIGlmICghdGhpcy5zZWFyY2gpIHtcbiAgICAgICAgdGhpcy5zZXRGb2N1cygna2V5Ym9hcmQnLCAnb25LZXlVcCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKSBvbktleURvd24oJGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYXZvaWQgc2V0dGluZyBmb2N1cyB0byBvcHRpb24gd2hpbGUgb24gaW5wdXQgZWxlbWVudFxuICAgIGlmICgkZXZlbnQudGFyZ2V0ID09PSB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubGlzdEtleU1hbmFnZXI/Lm9uS2V5ZG93bigkZXZlbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKSBvbkNsaWNrKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRGb2N1cygnbW91c2UnLCAnb25DbGljaycpO1xuICAgIH0gZWxzZSBpZiAoW3RoaXMuZHJvcGRvd24ubmF0aXZlRWxlbWVudF0uaW5jbHVkZXMoJGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRGb2N1cygnbW91c2UnLCAnb25DbGljaycpO1xuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgcHVibGljIHZpc2libGVPcHRpb25zID0gMDtcblxuICBnZXQgc3VidHJlZUZvY3VzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnRyZWVGb2N1c2VkO1xuICB9XG5cbiAgc2V0IHN1YnRyZWVGb2N1c2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc3VidHJlZUZvY3VzZWQgPSB0aGlzLmRpc2FibGVkID8gZmFsc2UgOiB2YWx1ZTtcbiAgICB0aGlzLnZpc2libGUgPSB2YWx1ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRoaXMudmlzaWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3N1YnRyZWVGb2N1c2VkID0gdGhpcy5mb2N1c09yaWdpbihudWxsKTtcblxuICBwcml2YXRlIG5hdGl2ZVNlbGVjdFJlZiE6IGFueTtcblxuICBmb2N1c09yaWdpbihvcmlnaW46IEZvY3VzT3JpZ2luKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZm9jdXNlZCA9ICEhb3JpZ2luO1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBmb2N1c2VkID8gdGhpcy5zZWFyY2hWYWx1ZSA6ICcnO1xuICAgIHJldHVybiBmb2N1c2VkO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy50YWJJbmRleCA9ICcwJztcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuI2Rlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy4jZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLm11bHRpc2VsZWN0U3Vic2NyaWJlKGZhbHNlKTtcbiAgICB0aGlzLnNldEZvY3VzTW9uaXRvcihmYWxzZSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlcyA9IGNoYW5nZXNbJ3ZhbHVlJ107XG4gICAgICBpZiAodmFsdWVDaGFuZ2VzLmN1cnJlbnRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5jbGVhckFsbE9wdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucygpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnNVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG5cbiAgICB0aGlzLnZpc2libGVPcHRpb25zID0gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnMubGVuZ3RoO1xuXG4gICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnMuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLiNkZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUobmV4dCA9PiB7XG4gICAgICAgIHRoaXMudmlzaWJsZU9wdGlvbnMgPSB0aGlzLm11bHRpU2VsZWN0T3B0aW9ucz8uZmlsdGVyKChpdGVtKSA9PiBpdGVtLnZpc2libGUpLmxlbmd0aDtcbiAgICAgICAgdGhpcy5zZWxlY3RPcHRpb25zKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuc2VsZWN0T3B0aW9ucygpO1xuICAgIHRoaXMubXVsdGlzZWxlY3RTdWJzY3JpYmUoKTtcblxuICAgIHRoaXMubGlzdEtleU1hbmFnZXIgPSBuZXcgRm9jdXNLZXlNYW5hZ2VyKHRoaXMubXVsdGlTZWxlY3RPcHRpb25zKS53aXRoSG9tZUFuZEVuZCgpLndpdGhUeXBlQWhlYWQoKTtcbiAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyLnNraXBQcmVkaWNhdGUoaXRlbSA9PiAoaXRlbS5kaXNhYmxlZCB8fCAhaXRlbS52aXNpYmxlKSk7XG4gICAgdGhpcy5saXN0S2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcblxuICAgIHRoaXMuc2V0Rm9jdXNNb25pdG9yKCF0aGlzLmRpc2FibGVkKTtcbiAgICAvLyBub3QgcmVxdWlyZWQgaGVyZTpcbiAgICAvLyB0aGlzLnNlbGVjdGVkT3B0aW9uc1VwZGF0ZSgpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jcmVhdGVOYXRpdmVTZWxlY3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbXVsdGlzZWxlY3RTdWJzY3JpYmUoc3Vic2NyaWJlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChzdWJzY3JpYmUpIHtcblxuICAgICAgdGhpcy5tdWx0aXNlbGVjdFZpc2libGVTdWJzY3JpcHRpb24gPSB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5tdWx0aVNlbGVjdFZpc2libGUkLnN1YnNjcmliZSgodmlzaWJsZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSAhPT0gdmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHZpc2libGUpO1xuICAgICAgICAgIGlmICghdmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRGb2N1cygncHJvZ3JhbScsICdtdWx0aVNlbGVjdFZpc2libGUkJyApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5tdWx0aXNlbGVjdFN0YXRlU3Vic2NyaXB0aW9uID0gdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2UubXVsdGlTZWxlY3RTdGF0ZSQuc3Vic2NyaWJlKChvcHRpb24pID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCA9PT0gdHJ1ZSAmJiAhdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IHRoaXMubXVsdGlTZWxlY3RPcHRpb25zLnRvQXJyYXkoKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc2VsZWN0ZWQpO1xuICAgICAgICAgIHNlbGVjdGVkT3B0aW9ucy5yZXZlcnNlKCkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0gIT09IG9wdGlvbikge1xuICAgICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gY2xvc2UgZHJvcGRvd24gZm9yIHNpbmdsZSBzZWxlY3QgKCFtdWx0aXBsZSlcbiAgICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9kbz9cbiAgICAgICAgLy8gaWYgKCEhb3B0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zVXBkYXRlKCk7XG4gICAgICAgIC8vIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm11bHRpc2VsZWN0VmlzaWJsZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMubXVsdGlzZWxlY3RTdGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RPcHRpb25zKCkge1xuICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zPy5mb3JFYWNoKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICBvcHRpb24ub3B0aW9uc1N0eWxlID0gdGhpcy5vcHRpb25zU3R5bGU7XG4gICAgICBvcHRpb24uc2VsZWN0ZWQgPSBvcHRpb24udmFsdWUgIT09IHVuZGVmaW5lZCA/IHRoaXMuX3ZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkgOiAhIW9wdGlvbi5zZWxlY3RlZDtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyQWxsT3B0aW9ucygkZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoIW9wdGlvbi5fZGlzYWJsZWQpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbnNVcGRhdGUoKTtcbiAgICBpZiAoJGV2ZW50KSB7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICB0aGlzLnNldEZvY3VzKCdwcm9ncmFtJywgJ2NsZWFyQWxsT3B0aW9ucycpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEFsbE9wdGlvbnMoKSB7XG4gICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnMuZm9yRWFjaCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQgJiYgb3B0aW9uLnZpc2libGUpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNlbGVjdGVkT3B0aW9uc1VwZGF0ZSgpO1xuICB9XG5cbiAgaGFuZGxlVGFnUmVtb3ZlKCRldmVudDogSU9wdGlvbikge1xuICAgIHRoaXMuc2V0Rm9jdXMoJ3Byb2dyYW0nLCAnaGFuZGxlVGFnUmVtb3ZlJyk7XG4gIH1cblxuICBzZXRGb2N1cyhvcmlnaW46IEZvY3VzT3JpZ2luID0gJ3Byb2dyYW0nLCBtZXRob2ROYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuaW5wdXRFbGVtZW50ID8/IHRoaXMuZWxlbWVudFJlZjtcbiAgICBjb25zdCBwcmV2ZW50U2Nyb2xsID0gb3JpZ2luID09PSAncHJvZ3JhbSc7XG4gICAgdGhpcy5mb2N1c01vbml0b3I/LmZvY3VzVmlhKGVsZW1lbnQsIG9yaWdpbiwgeyBwcmV2ZW50U2Nyb2xsOiBwcmV2ZW50U2Nyb2xsIH0pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdzZXRGb2N1cycsIG9yaWdpbiwgbWV0aG9kTmFtZSwgJ3ByZXZlbnRTY3JvbGw6JywgcHJldmVudFNjcm9sbCApO1xuICB9XG5cbiAgZmlsdGVyT3B0aW9ucyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VhcmNoU3RyaW5nID0gdmFsdWUudG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9ucz8uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNlYXJjaCA9PT0gJ2V4dGVybmFsJyB8fCAhc2VhcmNoU3RyaW5nKSB7XG4gICAgICAgIGl0ZW0udmlzaWJsZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtLnZpc2libGUgPSBpdGVtLmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFN0cmluZykgPz8gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnZpc2libGVPcHRpb25zID0gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnM/LmZpbHRlcigoaXRlbSkgPT4gaXRlbS52aXNpYmxlKS5sZW5ndGg7XG4gIH1cblxuICBjcmVhdGVOYXRpdmVTZWxlY3QoKSB7XG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KE11bHRpU2VsZWN0TmF0aXZlU2VsZWN0Q29tcG9uZW50KTtcbiAgICB0aGlzLnVwZGF0ZU5hdGl2ZVNlbGVjdCgpO1xuICB9XG5cbiAgdXBkYXRlTmF0aXZlU2VsZWN0KCkge1xuICAgIGlmICghdGhpcy5uYXRpdmVTZWxlY3RSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5zZWxlY3RlZE9wdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgeyBzZWxlY3RlZCwgdmFsdWUsIGxhYmVsIH0gPSBpdGVtO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0ZWQsIHZhbHVlLCBsYWJlbCB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2UubXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlO1xuICAgIHRoaXMubmF0aXZlU2VsZWN0UmVmLmluc3RhbmNlLm5hbWUgPSB0aGlzLm5hdGl2ZU5hbWU7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2UuZm9ybSA9IHRoaXMubmF0aXZlSWQ7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2Uub3B0aW9ucyA9IFsuLi5vcHRpb25zXTtcbiAgICB0aGlzLm5hdGl2ZVNlbGVjdFJlZi5pbnN0YW5jZS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2UuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBpbnB1dEVsZW1lbnRTaXplKCkge1xuICAgIGlmICh0aGlzLmlucHV0RWxlbWVudCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA+IDAgfHwgdGhpcy5zZWxlY3Rpb25UeXBlID09PSAnY291bnRlcicpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3NpemUnLCAodGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGggKyAyKS50b1N0cmluZygpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdzaXplJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlU2VhcmNoS2V5RG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGggfHwgdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFsnQmFja3NwYWNlJywgJ0RlbGV0ZSddLmluY2x1ZGVzKCRldmVudC5rZXkpKSB7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBsYXN0ID0gdGhpcy5zZWxlY3RlZE9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiAhb3B0aW9uLmRpc2FibGVkKS5wb3AoKTtcbiAgICAgIHRoaXMuc2VsZWN0T3B0aW9uKGxhc3QsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdE9wdGlvbihvcHRpb246IE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50LCBzZWxlY3RlZDogYm9vbGVhbikge1xuICAgIG9wdGlvbi5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zVXBkYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdGVkT3B0aW9uc1VwZGF0ZSgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zID0gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnM/LmZpbHRlcigob3B0aW9uKSA9PiAhIW9wdGlvbi5zZWxlY3RlZCk7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudFNpemUoKTtcbiAgICAgIHRoaXMudXBkYXRlTmF0aXZlU2VsZWN0KCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb2N1c01vbml0b3IobW9uaXRvcjogYm9vbGVhbikge1xuICAgIGlmIChtb25pdG9yICYmICF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmZvY3VzTW9uaXRvclN1YnNjcmlwdGlvbiA9IHRoaXMuZm9jdXNNb25pdG9yPy5tb25pdG9yKHRoaXMuZWxlbWVudFJlZiwgdHJ1ZSkuc3Vic2NyaWJlKChvcmlnaW4pID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2ZvY3VzTW9uaXRvclN1YnNjcmlwdGlvbicsIHRoaXMuZWxlbWVudFJlZiwgb3JpZ2luKTtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN1YnRyZWVGb2N1c2VkID0gdGhpcy5mb2N1c09yaWdpbihvcmlnaW4pO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWY/Lm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTW9uaXRvcj8uc3RvcE1vbml0b3JpbmcodGhpcy5lbGVtZW50UmVmKTtcbiAgICAgIHRoaXMuZm9jdXNNb25pdG9yU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGMtZHJvcGRvd24gI2Ryb3Bkb3duPVwiY0Ryb3Bkb3duXCIgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIiBjbGFzcz1cInBpY2tlclwiIFtuZ0NsYXNzXT1cIm11bHRpc2VsZWN0Q2xhc3Nlc1wiXG4gICAgICAgICAgICBbKHZpc2libGUpXT1cInZpc2libGVcIiBbcG9wcGVyT3B0aW9uc109XCJwb3BwZXJqc09wdGlvbnNcIj5cbiAgPGRpdiBbY2FyZXRdPVwiZmFsc2VcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBjRHJvcGRvd25Ub2dnbGUgI2Ryb3Bkb3duVG9nZ2xlPVwiY0Ryb3Bkb3duVG9nZ2xlXCI+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXNlbGVjdGlvblwiPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNlbGVjdGlvblR5cGUgPT09ICd0YWdzJ1wiPlxuICAgICAgICA8Yy1tdWx0aS1zZWxlY3QtdGFnXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzZWxlY3RlZE9wdGlvbnM7IGluZGV4IGFzIGlcIlxuICAgICAgICAgIChyZW1vdmUpPVwiaGFuZGxlVGFnUmVtb3ZlKCRldmVudClcIlxuICAgICAgICAgIFtvcHRpb25dPVwib3B0aW9uXCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXRhZ1wiXG4gICAgICAgID48L2MtbXVsdGktc2VsZWN0LXRhZz5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic2VsZWN0aW9uVHlwZSA9PT0gJ3RleHQnICYmICEhc2VsZWN0ZWRPcHRpb25zVGV4dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXNlYXJjaFwiPnt7IHNlbGVjdGVkT3B0aW9uc1RleHQgfX08L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNlbGVjdGlvblR5cGUgPT09ICdjb3VudGVyJ1wiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImNvdW50ZXJUZXh0VHlwZSA9PT0gJ3N0cmluZyc7IGVsc2UgcGx1cmFsTWFwXCI+e3sgY291bnRlclRleHQgfX08L3NwYW4+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcGx1cmFsTWFwPlxuICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWRPcHRpb25zLmxlbmd0aH19IHt7IHNlbGVjdGVkT3B0aW9ucy5sZW5ndGggfCBpMThuUGx1cmFsOiBzZWxlY3Rpb25UeXBlQ291bnRlclRleHRQbHVyYWxNYXAgPz8geyBvdGhlcjogY291bnRlclRleHQgfSB9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8IS0tICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFzZWFyY2ggJiYgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA9PT0gMCAmJiBzZWxlY3Rpb25UeXBlICE9PSAnY291bnRlcidcIj4tLT5cbiAgICAgIDwhLS0gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtc2VhcmNoXCI+e3sgcGxhY2Vob2xkZXIgfX08L3NwYW4+LS0+XG4gICAgICA8IS0tICAgICAgPC9uZy10ZW1wbGF0ZT4tLT5cbiAgICA8L2Rpdj5cblxuICAgIDxpbnB1dFxuICAgICAgI2lucHV0RWxlbWVudFxuICAgICAgKGtleWRvd24pPVwiaGFuZGxlU2VhcmNoS2V5RG93bigkZXZlbnQpXCJcbiAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8ICFzZWFyY2hcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnZm9ybS1tdWx0aS1zZWxlY3Qtc2VhcmNoJzogdHJ1ZSwgZGlzYWJsZWQ6IChkaXNhYmxlZCB8fCAhc2VhcmNoKSB9XCJcbiAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cInNlbGVjdGVkT3B0aW9ucy5sZW5ndGggPT09IDAgJiYgc2VsZWN0aW9uVHlwZSAhPT0gJ2NvdW50ZXInID8gcGxhY2Vob2xkZXIgOiBudWxsXCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICB0YWJpbmRleD1cInt7IGRpc2FibGVkID8gJy0xJyA6ICcwJyB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgPlxuXG4gICAgPGJ1dHRvblxuICAgICAgKGNsaWNrKT1cImNsZWFyQWxsT3B0aW9ucygkZXZlbnQpXCJcbiAgICAgICpuZ0lmPVwiY2xlYW5lciAmJiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoID4gMCAmJiAhZGlzYWJsZWRcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8ICFpc0Ryb3Bkb3duVmlzaWJsZVwiXG4gICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgYWxsXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtc2VsZWN0aW9uLWNsZWFuZXJcIlxuICAgID48L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cIiFkaXNhYmxlZFwiIGNsYXNzPVwiXCIgY0Ryb3Bkb3duTWVudSAjZHJvcGRvd25NZW51PVwiY0Ryb3Bkb3duTWVudVwiIFt2aXNpYmxlXT1cImRyb3Bkb3duLnZpc2libGVcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZFbHNlXT1cIm9wdGlvbnNFbXB0eVwiIFtuZ0lmXT1cInZpc2libGVPcHRpb25zID4gMFwiPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2VsZWN0QWxsT3B0aW9ucygpXCIgKm5nSWY9XCJzZWxlY3RBbGwgJiYgbXVsdGlwbGVcIiBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LWFsbFwiPlxuICAgICAgICB7eyBzZWxlY3RBbGxMYWJlbCB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2ICNtdWx0aXNlbGVjdE9wdGlvbnNEaXZcbiAgICAgICAgICAgW25nU3R5bGVdPVwib3B0aW9uc01heEhlaWdodCAhPT0gJ2F1dG8nID8geyAnbWF4SGVpZ2h0LnB4Jzogb3B0aW9uc01heEhlaWdodCwgb3ZlcmZsb3dZOiAnc2Nyb2xsJyB9IDoge31cIlxuICAgICAgICAgICBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LW9wdGlvbnNcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uc0VtcHR5PlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LW9wdGlvbnMtZW1wdHlcIj57eyBzZWFyY2hOb1Jlc3VsdHNMYWJlbCB9fTwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9jLWRyb3Bkb3duPlxuIl19
1050
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9tdWx0aS1zZWxlY3QvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQU9MLE1BQU0sRUFLTixTQUFTLEVBQ1QsWUFBWSxFQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQW1CLGVBQWUsRUFBNkIsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRyxPQUFPLEVBQWdCLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbEcsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzFFLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsWUFBWSxFQUNaLEtBQUssRUFDTCxvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLEdBQUcsRUFDSCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSww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QUFXLEVBQUUsSUFBSSxFQUFFO2dCQUN4QixzQkFBc0I7c0JBQS9ELFlBQVk7dUJBQUMsMEJBQTBCO2dCQUNSLGtCQUFrQjtzQkFBakQsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBQ1IsaUJBQWlCO3NCQUF0QyxTQUFTO3VCQUFDLFNBQVM7Z0JBS3lDLGdCQUFnQjtzQkFBNUUsZUFBZTt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBSWhDLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQzJCLFFBQVE7c0JBQTNELFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNRLGNBQWM7c0JBQXZFLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUdwRCxXQUFXO3NCQURkLFdBQVc7dUJBQUMsT0FBTztnQkFxQlIsbUJBQW1CO3NCQUQ5QixXQUFXO3VCQUFDLDJCQUEyQjtnQkFNNUIsUUFBUTtzQkFEbkIsV0FBVzt1QkFBQyxlQUFlO2dCQWFPLE9BQU87c0JBQXpDLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWtFSSxTQUFTO3NCQUE3QyxZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFnQ25DLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIEl0ZXJhYmxlRGlmZmVyLFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9jdXNhYmxlT3B0aW9uLCBGb2N1c0tleU1hbmFnZXIsIEZvY3VzTW9uaXRvciwgRm9jdXNPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY29tYmluZUxhdGVzdFdpdGgsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTW9kaWZpZXIsIE1vZGlmaWVyQXJndW1lbnRzLCBPcHRpb25zIH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuXG5pbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCwgRHJvcGRvd25Ub2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kcm9wZG93bic7XG5pbXBvcnQgeyBJTXVsdGlTZWxlY3QsIElPcHRpb24sIFNlYXJjaEZuIH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LnR5cGUnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9tdWx0aS1zZWxlY3Qtb3B0aW9uL211bHRpLXNlbGVjdC1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpU2VsZWN0TmF0aXZlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LW5hdGl2ZS1zZWxlY3QvbXVsdGktc2VsZWN0LW5hdGl2ZS1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IFRlbXBsYXRlSWREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuXG5pbnRlcmZhY2UgSVBsdXJhbE1hcCB7XG4gIFtrOiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBvYnNlcnZlUmVmZXJlbmNlTW9kaWZpZXI6IE1vZGlmaWVyPHN0cmluZywgYW55PiA9IHtcbiAgbmFtZTogJ29ic2VydmVSZWZlcmVuY2VNb2RpZmllcicsIGVuYWJsZWQ6IHRydWUsIHBoYXNlOiAnbWFpbicsIGZuKHsgc3RhdGUgfSkge30sXG5cbiAgZWZmZWN0OiAoeyBzdGF0ZSwgaW5zdGFuY2UgfTogTW9kaWZpZXJBcmd1bWVudHM8T3B0aW9ucz4pID0+IHtcbiAgICBjb25zdCBST19QUk9QID0gJ19fcG9wcGVyanNST19fJztcbiAgICBjb25zdCB7IHJlZmVyZW5jZSB9ID0gc3RhdGUuZWxlbWVudHM7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmVmZXJlbmNlW1JPX1BST1BdID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZWZlcmVuY2VbUk9fUFJPUF0ub2JzZXJ2ZShyZWZlcmVuY2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZWZlcmVuY2VbUk9fUFJPUF0uZGlzY29ubmVjdCgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZGVsZXRlIHJlZmVyZW5jZVtST19QUk9QXTtcbiAgICB9O1xuICB9XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLW11bHRpLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdjTXVsdGlTZWxlY3QnLFxuICBwcm92aWRlcnM6IFtcbiAgICBNdWx0aVNlbGVjdFNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpU2VsZWN0Q29tcG9uZW50KSwgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBJTXVsdGlTZWxlY3QsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSBtdWx0aVNlbGVjdFNlcnZpY2U6IE11bHRpU2VsZWN0U2VydmljZSxcbiAgICBwcml2YXRlIGl0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzXG4gICkge1xuICAgIHRoaXMuZGlmZmVyID0gdGhpcy5pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLiN2YWx1ZSkuY3JlYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRpZmZlciE6IEl0ZXJhYmxlRGlmZmVyPGFueT47XG5cbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX211bHRpcGxlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kaXNhYmxlZDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfdmlydHVhbFNjcm9sbGVyOiBCb29sZWFuSW5wdXQ7XG5cbiAgcmVhZG9ubHkgI2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgI29wdGlvbnNSZWFkeSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICByZWFkb25seSBvcHRpb25zQXJyYXkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJT3B0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgI29wdGlvbnM6IE1hcDxhbnksIElPcHRpb24+ID0gbmV3IE1hcCgpO1xuICByZWFkb25seSBvcHRpb25zU2VsZWN0ZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJT3B0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgb3B0aW9uc1NlbGVjdGVkOiBNYXA8YW55LCBJT3B0aW9uPiA9IG5ldyBNYXAoKTtcbiAgcmVhZG9ubHkgdmFsdWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuXG4gIG9uQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHt9O1xuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiAoc3RyaW5nIHwgc3RyaW5nW10pKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogW3ZhbHVlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IEFycmF5KDApO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyBzZWxlY3Rpb24gY2xlYW5lciBlbGVtZW50XG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgY2xlYW5lciA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIG11bHRpLXNlbGVjdCBjb21wb25lbnRcbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVkICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgICAgdGhpcy5zZXRGb2N1c01vbml0b3IoIXZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoYXQgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgYXQgb25jZVxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgbXVsdGlwbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tdWx0aXBsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfbXVsdGlwbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogSGlkZGVuIG5hdGl2ZSBzZWxlY3QgZm9ybVxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIEBJbnB1dCgpIG5hdGl2ZUZvcm1JZCA9ICcnO1xuXG4gIC8qKlxuICAgKiBIaWRkZW4gbmF0aXZlIHNlbGVjdCBpZFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIEBJbnB1dCgpIG5hdGl2ZUlkID0gJyc7XG5cbiAgLyoqXG4gICAqIEhpZGRlbiBuYXRpdmUgc2VsZWN0IG5hbWVcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZWZhdWx0ICcnXG4gICAqL1xuICBASW5wdXQoKSBuYXRpdmVOYW1lID0gJyc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2Ygb3B0aW9uIGVsZW1lbnRzXG4gICAqIEB0eXBlIElPcHRpb25bXVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IG9wdGlvbnMob3B0aW9uczogSU9wdGlvbltdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgIHRoaXMubWFrZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLiNvcHRpb25zLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIG1heEhlaWdodCBvZiBvcHRpb25zIGxpc3QgaW4gcHhcbiAgICogQHR5cGUgKHN0cmluZyB8IG51bWJlcilcbiAgICogQGRlZmF1bHQgJ2F1dG8nXG4gICAqL1xuICBASW5wdXQoKSBvcHRpb25zTWF4SGVpZ2h0ID0gJ2F1dG8nO1xuXG4gIC8qKlxuICAgKiBTZXRzIG9wdGlvbiBzdHlsZVxuICAgKiBAdHlwZSAnY2hlY2tib3gnIHwgJ3RleHQnXG4gICAqIEBkZWZhdWx0ICdjaGVja2JveCdcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBvcHRpb25zU3R5bGUodmFsdWU6ICdjaGVja2JveCcgfCAndGV4dCcpIHtcbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5vcHRpb25zU3R5bGUgPSB2YWx1ZSA/PyAnY2hlY2tib3gnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHNob3J0IGhpbnQgdGhhdCBpcyB2aXNpYmxlIGluIHRoZSBzZWFyY2ggaW5wdXRcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZWZhdWx0ICdTZWxlY3QuLi4nXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdTZWxlY3QuLi4nO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHNlYXJjaCBpbnB1dCBlbGVtZW50XG4gICAqIEB0eXBlIGJvb2xlYW4gfCBTZWFyY2hGbiB8ICdleHRlcm5hbCdcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgc2VhcmNoOiAoYm9vbGVhbiB8ICdleHRlcm5hbCcgfCBTZWFyY2hGbikgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBsYWJlbCBmb3Igbm8gcmVzdWx0cyB3aGVuIGZpbHRlcmluZ1xuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgJ25vIGl0ZW1zJ1xuICAgKi9cbiAgQElucHV0KCkgc2VhcmNoTm9SZXN1bHRzTGFiZWwgPSAnbm8gaXRlbXMnO1xuXG4gIC8qKlxuICAgKiBTZXRzIGluaXRpYWwgc2VhcmNoIHN0cmluZ1xuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBzZWFyY2hWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0aGlzLl9zZWFyY2hWYWx1ZSAhPT0gdmFsdWUudHJpbVN0YXJ0KCkpIHtcbiAgICAgIHRoaXMuX3NlYXJjaFZhbHVlID0gdmFsdWUudHJpbVN0YXJ0KCk7XG4gICAgICB0aGlzLnZpc2libGUgPSAhIXRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoID8gdHJ1ZSA6IHRoaXMudmlzaWJsZTtcbiAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucyh0aGlzLnNlYXJjaFZhbHVlKTtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50U2l6ZSgpO1xuICAgICAgdGhpcy5zZWFyY2hWYWx1ZUNoYW5nZS5lbWl0KHRoaXMuX3NlYXJjaFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VhcmNoVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWFyY2hWYWx1ZSBzdHJpbmcgZm9yIGV4dGVybmFsIGZpbHRlcmluZ1xuICAgKiBAdHlwZSBzdHJpbmdcbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWFyY2hWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHNlbGVjdCBhbGwgYnV0dG9uXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0QWxsID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgc2VsZWN0IGFsbCBidXR0b24gbGFiZWxcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZWZhdWx0ICdTZWxlY3QgYWxsIG9wdGlvbnMnXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RBbGxMYWJlbCA9ICdTZWxlY3QgYWxsIG9wdGlvbnMnO1xuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gdHlwZVxuICAgKiBAdHlwZSAnY291bnRlcicgfCAndGFncycgfCAndGV4dCdcbiAgICogQGRlZmF1bHQgJ3RhZ3MnXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3Rpb25UeXBlOiAnY291bnRlcicgfCAndGFncycgfCAndGV4dCcgPSAndGFncyc7XG5cbiAgLyoqXG4gICAqIENvdW50ZXIgc2VsZWN0aW9uIGxhYmVsIHZhbHVlXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCAnaXRlbShzKSBzZWxlY3RlZCdcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGlvblR5cGVDb3VudGVyVGV4dDogc3RyaW5nID0gJ2l0ZW0ocykgc2VsZWN0ZWQnO1xuXG4gIC8qKlxuICAgKiBDb3VudGVyIHNlbGVjdGlvbiBsYWJlbCBwbHVyYWwgbWFwIGZvciBJMThuUGx1cmFsUGlwZVxuICAgKiBAdHlwZSBJUGx1cmFsTWFwXG4gICAqIEBkZWZhdWx0IHsgJz0xJzogJ2l0ZW0gc2VsZWN0ZWQnLCAnb3RoZXInOiAnaXRlbXMgc2VsZWN0ZWQnIH1cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGlvblR5cGVDb3VudGVyVGV4dFBsdXJhbE1hcD86IElQbHVyYWxNYXAgPSB7ICc9MSc6ICdpdGVtIHNlbGVjdGVkJywgJ290aGVyJzogJ2l0ZW1zIHNlbGVjdGVkJyB9O1xuXG4gIC8qKlxuICAgKiBTaXplIHRoZSBjb21wb25lbnQgc21hbGwgb3IgbGFyZ2UuXG4gICAqIEB0eXBlICdzbScgfCAnbGcnIHwgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSBzaXplPzogJ3NtJyB8ICdsZyc7XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgdmFsdWUgb2YgbXVsdGktc2VsZWN0XG4gICAqIEB0eXBlIHN0cmluZyB8IHN0cmluZ1tdXG4gICAqL1xuICBASW5wdXQoKSBzZXQgdmFsdWUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiBbdmFsdWUgPz8gdW5kZWZpbmVkXTtcbiAgICBpZiAodGhpcy5kaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmRpZmZlci5kaWZmKG5ld1ZhbHVlKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuI3ZhbHVlID0gWy4uLm5ld1ZhbHVlXTtcbiAgICAgICAgdGhpcy52YWx1ZSQubmV4dChbLi4ubmV3VmFsdWVdKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgLy8gdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZCA/PyBbLi4udGhpcy4jdmFsdWVdO1xuICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gWy4uLnZhbHVlXSA6IHZhbHVlPy50b1N0cmluZygpID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gICN2YWx1ZTogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogRW1pdHMgdmFsdWVDaGFuZ2VcbiAgICogQHR5cGUgc3RyaW5nIHwgc3RyaW5nW11cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgc3RyaW5nW10+KCk7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB2aXN1YWwgdmFsaWRhdGlvbiBmZWVkYmFjay5cbiAgICogQHR5cGUgYm9vbGVhbiB8IHVuZGVmaW5lZFxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIEBJbnB1dCgpIHZhbGlkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIHZpcnR1YWwgc2Nyb2xsZXIgZm9yIG9wdGlvbnMgbGlzdC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHZpcnR1YWxTY3JvbGxlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3ZpcnR1YWxTY3JvbGxlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgdmlydHVhbFNjcm9sbGVyKCkge1xuICAgIHJldHVybiB0aGlzLl92aXJ0dWFsU2Nyb2xsZXI7XG4gIH1cblxuICBwcml2YXRlIF92aXJ0dWFsU2Nyb2xsZXIgPSBmYWxzZTtcblxuICAvKipcbiAgICogQW1vdW50IG9mIHZpc2libGUgb3B0aW9ucywgaWYgc2V0IC0gb3ZlcndyaXRlcyBvcHRpb25zTWF4SGVpZ2h0XG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVmYXVsdCA4XG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgdmlzaWJsZUl0ZW1zKHZhbHVlKSB7XG4gICAgdGhpcy5fdmlzaWJsZUl0ZW1zID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUgfHwgOCk7XG4gICAgdGhpcy5vcHRpb25zTWF4SGVpZ2h0ID0gKCh0aGlzLml0ZW1TaXplICogdGhpcy5fdmlzaWJsZUl0ZW1zKSArIDE2KS50b1N0cmluZygpO1xuICB9XG5cbiAgZ2V0IHZpc2libGVJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmlzaWJsZUl0ZW1zID0gODtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIG9wdGlvbiBpdGVtIGluIHRoZSBsaXN0IChpbiBwaXhlbHMpLlxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlZmF1bHQgNDBcbiAgICovXG4gIEBJbnB1dCgpIGl0ZW1TaXplOiBudW1iZXIgPSA0MDtcblxuICAvKipcbiAgICogTWluIHdpZHRoIG9mIHRoZSBvcHRpb25zIGxpc3QgKGluIHBpeGVscykuXG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVmYXVsdCAxOTZcbiAgICovXG4gIEBJbnB1dCgpIGl0ZW1NaW5XaWR0aDogbnVtYmVyID0gMTk2O1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGRyb3Bkb3duIHNlbGVjdCBjb21wb25lbnQuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgdmlzaWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgaWYgKHZpc2libGUgIT09IHRoaXMuX3Zpc2libGUpIHtcbiAgICAgIHRoaXMuX3Zpc2libGUgPSB2aXNpYmxlO1xuICAgICAgdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2UudG9nZ2xlVmlzaWJsZSh2aXNpYmxlKTtcbiAgICAgIGlmICghdmlzaWJsZSkge1xuICAgICAgICAvLyB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGU7XG4gIH1cblxuICBwcml2YXRlIF92aXNpYmxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHZpc2libGVDaGFuZ2VcbiAgICogQHR5cGUgYm9vbGVhblxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBvcHBlciBPcHRpb25zIG9iamVjdFxuICAgKiBAdHlwZSBQYXJ0aWFsPE9wdGlvbnM+XG4gICAqL1xuICBASW5wdXQoJ3BvcHBlck9wdGlvbnMnKSBwb3BwZXJqc09wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4gPSB7XG4gICAgc3RyYXRlZ3k6ICdmaXhlZCcsIG1vZGlmaWVyczogW29ic2VydmVSZWZlcmVuY2VNb2RpZmllciwge1xuICAgICAgbmFtZTogJ29mZnNldCcsIG9wdGlvbnM6IHtcbiAgICAgICAgb2Zmc2V0OiAoKSA9PiB0aGlzLnNlbGVjdGlvblR5cGUgPT09ICd0YWdzJyAmJiB0aGlzLm9wdGlvbnNTZWxlY3RlZC5zaXplID8gWy0yLCA4XSA6IFstMTIsIDEyXVxuICAgICAgfVxuICAgIH1dXG4gIH07XG5cbiAgaXNEcm9wZG93blZpc2libGUgPSBmYWxzZTtcblxuICBnZXQgc2VsZWN0ZWRPcHRpb25zKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5vcHRpb25zU2VsZWN0ZWQudmFsdWVzKCldO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9uc1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcHRpb25zLm1hcChvcHRpb24gPT4gb3B0aW9uLmxhYmVsKS5qb2luKCcsICcpO1xuICB9XG5cbiAgZ2V0IGNvdW50ZXJUZXh0KCkge1xuICAgIHJldHVybiBgJHt0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGh9ICR7dGhpcy5zZWxlY3Rpb25UeXBlQ291bnRlclRleHR9YDtcbiAgfVxuXG4gIGdldCBjb3VudGVyVGV4dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuc2VsZWN0aW9uVHlwZUNvdW50ZXJUZXh0UGx1cmFsTWFwID8/IHR5cGVvZiB0aGlzLnNlbGVjdGlvblR5cGVDb3VudGVyVGV4dDtcbiAgfTtcblxuICBwcml2YXRlIGZvY3VzTW9uaXRvclN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcblxuICBAQ29udGVudENoaWxkcmVuKE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIG11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQhOiBRdWVyeUxpc3Q8TXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQ+O1xuICBAVmlld0NoaWxkcmVuKE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50KSBtdWx0aVNlbGVjdE9wdGlvbnNWaWV3ITogUXVlcnlMaXN0PE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50PjtcbiAgQFZpZXdDaGlsZHJlbignc2Nyb2xsVmlld3BvcnQnKSBzY3JvbGxWaWV3cG9ydFZpZXchOiBRdWVyeUxpc3Q8Q2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0PjtcbiAgQFZpZXdDaGlsZCgnb3B0aW9ucycpIG9wdGlvbnNFbGVtZW50UmVmITogRWxlbWVudFJlZjtcblxuICBwcm90ZWN0ZWQgc2Nyb2xsVmlld3BvcnQhOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgcHJvdGVjdGVkIHRlbXBsYXRlczogeyBbaWQ6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfSA9IHt9O1xuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlSWREaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgY29udGVudFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZUlkRGlyZWN0aXZlPjtcblxuICBwcml2YXRlIGxpc3RLZXlNYW5hZ2VyITogRm9jdXNLZXlNYW5hZ2VyPE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50PjtcblxuICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnKSBpbnB1dEVsZW1lbnQhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkcm9wZG93bk1lbnUnKSBkcm9wZG93bk1lbnUhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKERyb3Bkb3duQ29tcG9uZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgZHJvcGRvd24hOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKERyb3Bkb3duVG9nZ2xlRGlyZWN0aXZlLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgZHJvcGRvd25Ub2dnbGUhOiBFbGVtZW50UmVmO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkXG4gICAgfTtcbiAgfVxuXG4gIGdldCBtdWx0aXNlbGVjdENsYXNzZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdmb3JtLW11bHRpLXNlbGVjdCc6IHRydWUsXG4gICAgICAnZm9ybS1tdWx0aS1zZWxlY3Qtc2VsZWN0aW9uLXRhZ3MnOiB0aGlzLnNlbGVjdGlvblR5cGUgPT09ICd0YWdzJyAmJiB0aGlzLm9wdGlvbnNTZWxlY3RlZC5zaXplID4gMCxcbiAgICAgIFtgZm9ybS1tdWx0aS1zZWxlY3QtJHt0aGlzLnNpemV9YF06ICEhdGhpcy5zaXplLFxuICAgICAgJ2Zvcm0tbXVsdGktc2VsZWN0LXdpdGgtY2xlYW5lcic6IHRoaXMuY2xlYW5lcixcbiAgICAgIHNob3c6IHRoaXMudmlzaWJsZSxcbiAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkLFxuICAgICAgJ2lzLXZhbGlkJzogdGhpcy52YWxpZCA9PT0gdHJ1ZSxcbiAgICAgICdpcy1pbnZhbGlkJzogdGhpcy52YWxpZCA9PT0gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlJylcbiAgcHJpdmF0ZSBnZXQgYXJpYU11bHRpU2VsZWN0YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBsZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gIHByaXZhdGUgZ2V0IHRhYkluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLl90YWJJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0IHRhYkluZGV4KHZhbHVlKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl90YWJJbmRleCA9IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5zZWFyY2ggPyAtMSA6IHZhbHVlID09PSBudWxsID8gbnVsbCA6IDA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF90YWJJbmRleDogbnVtYmVyIHwgbnVsbCA9IC0xO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXVwJywgWyckZXZlbnQnXSkgb25LZXlVcCgkZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIGNvbnN0IHRhcmdldFRhZ05hbWUgPSAoJGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkudGFnTmFtZTtcbiAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5zZXRGb2N1cygna2V5Ym9hcmQnLCAnb25LZXlVcCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydFbnRlcicsICdTcGFjZScsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkgJiYgW3RoaXMuaW5wdXRFbGVtZW50Py5uYXRpdmVFbGVtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudF0uaW5jbHVkZXMoJGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXRoaXMuc2VhcmNoKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXMoJ2tleWJvYXJkJywgJ29uS2V5VXAnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoWydUYWInXS5pbmNsdWRlcygkZXZlbnQua2V5KSkge1xuXG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCA9PT0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaCkge1xuICAgICAgICAgIHRoaXMuc2V0Rm9jdXMoJ2tleWJvYXJkJywgJ29uS2V5VXAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYlRhcmdldCA9IHRhcmdldFRhZ05hbWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudmlzaWJsZSAmJiB0aGlzLnN1YnRyZWVGb2N1c2VkKSB7XG4gICAgICAgIGlmICh0YXJnZXRUYWdOYW1lID09PSAnQy1NVUxUSS1TRUxFQ1QtT1BUSU9OJykge1xuXG4gICAgICAgICAgaWYgKHRoaXMudGFiVGFyZ2V0ID09PSAnQy1NVUxUSS1TRUxFQ1QtT1BUSU9OJykge1xuICAgICAgICAgICAgaWYgKCRldmVudC5zaGlmdEtleSAmJiB0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0/LnZhbHVlID09PSB0aGlzLm9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb24udmlzaWJsZSAmJiAhb3B0aW9uLmRpc2FibGVkKS5zbGljZSgwKVswXS52YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzKCdrZXlib2FyZCcsICdvbktleVVwJyk7XG4gICAgICAgICAgICAgIHRoaXMudGFiVGFyZ2V0ID0gdGFyZ2V0VGFnTmFtZTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoISRldmVudC5zaGlmdEtleSAmJiB0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0/LnZhbHVlID09PSB0aGlzLm9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb24udmlzaWJsZSAmJiAhb3B0aW9uLmRpc2FibGVkKS5zbGljZSgtMSlbMF0udmFsdWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1cygna2V5Ym9hcmQnLCAnb25LZXlVcCcpO1xuICAgICAgICAgICAgICB0aGlzLnRhYlRhcmdldCA9IHRhcmdldFRhZ05hbWU7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlSXRlbSgwKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtIHx8IHRoaXMudGFiVGFyZ2V0ICE9PSB0YXJnZXRUYWdOYW1lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVPcHRpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlT3B0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRldmVudC5zaGlmdEtleSA/IHRoaXMubGlzdEtleU1hbmFnZXIuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCkgOiB0aGlzLmxpc3RLZXlNYW5hZ2VyLnNldE5leHRJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFiVGFyZ2V0ID0gdGFyZ2V0VGFnTmFtZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKSBvbktleURvd24oJGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0VGFnTmFtZSA9ICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS50YWdOYW1lO1xuICAgIGlmICgkZXZlbnQua2V5ID09PSAnRW50ZXInICYmIHRhcmdldFRhZ05hbWUgPT09ICdJTlBVVCcpIHtcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgIHRoaXMudGFiVGFyZ2V0ID0gdGFyZ2V0VGFnTmFtZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCRldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nICYmIHRhcmdldFRhZ05hbWUgIT09ICdDLU1VTFRJLVNFTEVDVC1PUFRJT04nKSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCRldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICAgIHRoaXMuc2V0Rm9jdXMoJ2tleWJvYXJkJywgJ29uS2V5VXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYXZvaWQgc2V0dGluZyBmb2N1cyB0byBvcHRpb24gd2hpbGUgb24gaW5wdXQgZWxlbWVudFxuICAgIGlmICgkZXZlbnQudGFyZ2V0ID09PSB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgkZXZlbnQua2V5ICE9PSAnVGFiJykge1xuICAgICAgdGhpcy5saXN0S2V5TWFuYWdlcj8ub25LZXlkb3duKCRldmVudCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChbdGhpcy5kcm9wZG93bi5uYXRpdmVFbGVtZW50XS5pbmNsdWRlcygkZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy52aXNpYmxlID0gIXRoaXMudmlzaWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLnNldEZvY3VzKCdtb3VzZScsICdvbkNsaWNrJyk7XG4gIH1cblxuICBwdWJsaWMgdmlzaWJsZU9wdGlvbnMgPSAwO1xuXG4gIGdldCBzdWJ0cmVlRm9jdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VidHJlZUZvY3VzZWQ7XG4gIH1cblxuICBzZXQgc3VidHJlZUZvY3VzZWQoZm9jdXNlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3N1YnRyZWVGb2N1c2VkID0gdGhpcy5kaXNhYmxlZCA/IGZhbHNlIDogZm9jdXNlZDtcbiAgICBpZiAoIWZvY3VzZWQpIHtcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICB9XG4gICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgdGhpcy52aXNpYmxlID0gZm9jdXNlZCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRoaXMudmlzaWJsZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdWJ0cmVlRm9jdXNlZCA9IHRoaXMuZm9jdXNPcmlnaW4obnVsbCk7XG5cbiAgcHJpdmF0ZSBuYXRpdmVTZWxlY3RSZWYhOiBhbnk7XG5cbiAgZm9jdXNPcmlnaW4ob3JpZ2luOiBGb2N1c09yaWdpbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIW9yaWdpbjtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2Uuc2V0U2VsZWN0aW9uTW9kZWwodGhpcy5tdWx0aXBsZSk7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5jaGFuZ2VkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuI2Rlc3Ryb3kkKSxcbiAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLm11bHRpcGxlKSxcbiAgICAgICAgZGVsYXkoMCksXG4gICAgICAgIHRhcChjaGFuZ2UgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2UuYWRkZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBjbG9zZSBkcm9wZG93biBmb3Igc2luZ2xlIHNlbGVjdCAoIW11bHRpcGxlKVxuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2Uuc2VsZWN0aW9uTW9kZWwuY2hhbmdlZFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLiNkZXN0cm95JCksXG4gICAgICAgIC8vIGRlbGF5KDApLFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLiNvcHRpb25zUmVhZHkkKSxcbiAgICAgICAgdGFwKChbY2hhbmdlLCByZWFkeV0pID0+IHtcbiAgICAgICAgICBjb25zdCB7IGFkZGVkLCByZW1vdmVkIH0gPSB7IC4uLmNoYW5nZSB9O1xuICAgICAgICAgIC8vIGFkZGVkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAvLyAgIGNvbnN0IHZhbHVlID0gdGhpcy4jb3B0aW9ucy5nZXQoa2V5KTtcbiAgICAgICAgICAvLyAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIC8vICAgICB0aGlzLm9wdGlvbnNTZWxlY3RlZC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgLy8gICB9XG4gICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgcmVtb3ZlZC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1NlbGVjdGVkLmRlbGV0ZSh2YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2Uuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNvcHRpb25zLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMub3B0aW9uc1NlbGVjdGVkLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMub3B0aW9uc1NlbGVjdGVkJC5uZXh0KEFycmF5LmZyb20odGhpcy5vcHRpb25zU2VsZWN0ZWQudmFsdWVzKCkpKTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkXTtcblxuICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50U2l6ZSgpO1xuICAgICAgICAgIHRoaXMudXBkYXRlTmF0aXZlU2VsZWN0KCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAvLyBzZXQgaW5pdGlhbCB2YWx1ZXNcbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoLi4udGhpcy4jdmFsdWUpO1xuXG4gICAgdGhpcy52YWx1ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy4jZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyQWxsT3B0aW9ucygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLnNlbGVjdCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnZhbHVlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLiNkZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgICB0YXAodmFsdWUgPT4ge1xuICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMub3B0aW9uc0FycmF5JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLiNkZXN0cm95JCksXG4gICAgICAgIHRhcChvcHRpb25zID0+IHtcbiAgICAgICAgICB0aGlzLnZpc2libGVPcHRpb25zID0gb3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udmlzaWJsZSkubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuYWN0aXZlT3B0aW9uID0gbnVsbDtcblxuICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICAgIG9wdGlvbi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydD8uc2V0UmVuZGVyZWRSYW5nZSh7IHN0YXJ0OiAwLCBlbmQ6IHRoaXMudmlzaWJsZUl0ZW1zIH0pO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydD8uc2Nyb2xsVG9JbmRleCgwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gb3B0aW9ucy5maW5kKGl0ZW0gPT4gaXRlbS52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgb3B0aW9uLnZpc2libGUgPSBmb3VuZD8udmlzaWJsZSA/PyBmYWxzZTtcbiAgICAgICAgICAgICAgb3B0aW9uLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEZvY3VzYWJsZSA9IHRoaXMuZmlyc3RGb2N1c2FibGVJdGVtO1xuICAgICAgICAgICAgaWYgKGZpcnN0Rm9jdXNhYmxlKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlSXRlbShmaXJzdEZvY3VzYWJsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5hY3RpdmVPcHRpb24pIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUl0ZW0oMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnPT4gb3B0aW9uc0FycmF5JCcsIG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMudGFiSW5kZXggPSAwO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4jZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLiNkZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuc2V0Rm9jdXNNb25pdG9yKGZhbHNlKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmFsdWUnXSkge1xuICAgICAgY29uc3QgdmFsdWVDaGFuZ2VzID0gY2hhbmdlc1sndmFsdWUnXTtcbiAgICAgIGlmICh2YWx1ZUNoYW5nZXMuY3VycmVudFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmNsZWFyQWxsT3B0aW9ucygpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnB1dEVsZW1lbnRTaXplKCk7XG4gICAgfVxuICB9XG5cbiAgbWFrZU9wdGlvbnMob3B0aW9uczogSU9wdGlvbltdKSB7XG5cbiAgICBpZiAodGhpcy5zZWFyY2ggPT09ICdleHRlcm5hbCcgJiYgdGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuI29wdGlvbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICB2YWx1ZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgIGNvbnN0IHZhbHVlID0ge1xuICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlID8/IG9wdGlvbi5sYWJlbCxcbiAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCA/PyBvcHRpb24udmFsdWUsXG4gICAgICAgIGRpc2FibGVkOiBvcHRpb24uZGlzYWJsZWQgPT09IHRydWUsXG4gICAgICAgIHZpc2libGU6IHRoaXMuc2VhcmNoID09PSAnZXh0ZXJuYWwnID8gdHJ1ZSA6IG9wdGlvbi52aXNpYmxlICE9PSBmYWxzZSxcbiAgICAgICAgdGV4dDogb3B0aW9uLnRleHQgPz8gb3B0aW9uLmxhYmVsID8/IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgc2VsZWN0ZWQ6IG9wdGlvbi5zZWxlY3RlZFxuICAgICAgICAvLyBzZWxlY3RlZDogdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2Uuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24udmFsdWUpLFxuICAgICAgICAvLyBpZDogb3B0aW9uLmlkXG4gICAgICB9O1xuICAgICAgdGhpcy4jb3B0aW9ucy5zZXQoa2V5LCB7IC4uLnZhbHVlIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKHRoaXMuc2VhcmNoVmFsdWUpO1xuXG4gICAgdGhpcy4jb3B0aW9uc1JlYWR5JC5uZXh0KHRydWUpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdtYWtlT3B0aW9ucycsIHRoaXMuI29wdGlvbnMuc2l6ZSk7XG4gICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuc2V0VmlydHVhbFNjcm9sbGVyKCk7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQ/LmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy4jZGVzdHJveSQpLFxuICAgICAgICBkZWxheSgwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXZpb3VzOiBRdWVyeUxpc3Q8TXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQ+LCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJldiA9IHByZXZpb3VzLnRvQXJyYXkoKS5tYXAob3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgY29uc3QgY3VyciA9IGN1cnJlbnQudG9BcnJheSgpLm1hcChvcHRpb24gPT4gb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJldikgPT09IEpTT04uc3RyaW5naWZ5KGN1cnIpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShuZXh0ID0+IHtcbiAgICAgICAgdGhpcy52aXNpYmxlT3B0aW9ucyA9IHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8uZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi52aXNpYmxlKS5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGVPcHRpb25zKSB7XG4gICAgICAgICAgdGhpcy5tYWtlT3B0aW9ucyh0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQudG9BcnJheSgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLnZpc2libGVPcHRpb25zID0gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5sZW5ndGg7XG4gICAgaWYgKHRoaXMudmlzaWJsZU9wdGlvbnMpIHtcbiAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLm11bHRpc2VsZWN0U3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLnNldEZvY3VzTW9uaXRvcighdGhpcy5kaXNhYmxlZCk7XG5cbiAgICB0aGlzLnNldExpc3RLZXlNYW5hZ2VyKCk7XG5cbiAgICB0aGlzLmlucHV0RWxlbWVudFNpemUoKTtcblxuICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5ub3RpZnlPbkNoYW5nZXMoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jcmVhdGVOYXRpdmVTZWxlY3QoKTtcbiAgICB9KTtcblxuICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLm11bHRpU2VsZWN0Rm9jdXMkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgob3B0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVPcHRpb24/LnZhbHVlICE9PSBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShvcHRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdGFiVGFyZ2V0ITogc3RyaW5nO1xuXG4gIHByaXZhdGUgbXVsdGlzZWxlY3RTdWJzY3JpYmUoc3Vic2NyaWJlOiBib29sZWFuID0gdHJ1ZSkge1xuXG4gICAgdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2UubXVsdGlTZWxlY3RWaXNpYmxlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLiNkZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh2aXNpYmxlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25WaXNpYmxlICE9PSB2aXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodmlzaWJsZSk7XG4gICAgICAgICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0Py5zZXRSZW5kZXJlZFJhbmdlKHsgc3RhcnQ6IDAsIGVuZDogdGhpcy52aXNpYmxlSXRlbXMgfSk7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUl0ZW0oMCk7XG4gICAgICB9KTtcblxuICB9XG5cbiAgY2xlYXJBbGxPcHRpb25zKCRldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVuYWJsZWRPcHRpb25zID0gQXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNTZWxlY3RlZC52YWx1ZXMoKSkuZmlsdGVyKG9wdGlvbiA9PiAhb3B0aW9uLmRpc2FibGVkKS5tYXAob3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCguLi5lbmFibGVkT3B0aW9ucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgaWYgKCRldmVudCkge1xuICAgICAgdGhpcy5zZXRGb2N1cygncHJvZ3JhbScsICdjbGVhckFsbE9wdGlvbnMnKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RBbGxPcHRpb25zKCkge1xuICAgIGNvbnN0IGVuYWJsZWRPcHRpb25zID0gQXJyYXkuZnJvbSh0aGlzLiNvcHRpb25zLnZhbHVlcygpKS5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi52aXNpYmxlICYmICFvcHRpb24uZGlzYWJsZWQpLm1hcChvcHRpb24gPT4gb3B0aW9uLnZhbHVlKTtcbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoLi4uZW5hYmxlZE9wdGlvbnMpO1xuICAgIHRoaXMuaW5wdXRFbGVtZW50U2l6ZSgpO1xuICB9XG5cbiAgaGFuZGxlVGFnUmVtb3ZlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCh2YWx1ZSk7XG4gICAgdGhpcy5zZXRGb2N1cygncHJvZ3JhbScsICdoYW5kbGVUYWdSZW1vdmUnKTtcbiAgfVxuXG4gIHNldEZvY3VzKG9yaWdpbjogRm9jdXNPcmlnaW4gPSAncHJvZ3JhbScsIG1ldGhvZE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gPEhUTUxFbGVtZW50Pih0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50ID8/IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICBjb25zdCBwcmV2ZW50U2Nyb2xsID0gb3JpZ2luID09PSAncHJvZ3JhbSc7XG4gICAgdGhpcy5mb2N1c01vbml0b3I/LmZvY3VzVmlhKGVsZW1lbnQsIG9yaWdpbiwgeyBwcmV2ZW50U2Nyb2xsOiBwcmV2ZW50U2Nyb2xsIH0pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdzZXRGb2N1cycsIG9yaWdpbiwgbWV0aG9kTmFtZSwgJ3ByZXZlbnRTY3JvbGw6JywgcHJldmVudFNjcm9sbCwgZWxlbWVudC50YWdOYW1lKTtcbiAgfVxuXG4gIGZpbHRlck9wdGlvbnModmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHNlYXJjaFN0cmluZyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gICAgdGhpcy4jb3B0aW9ucy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHNlYXJjaFN0cmluZyA9PT0gJycpIHtcbiAgICAgICAgaXRlbS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlYXJjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpdGVtLnZpc2libGUgPSB0aGlzLnNlYXJjaChpdGVtLCBzZWFyY2hTdHJpbmcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWFyY2ggPT09ICdleHRlcm5hbCcgfHwgIXNlYXJjaFN0cmluZykge1xuICAgICAgICAvLyBpdGVtLnZpc2libGUgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpdGVtLnZpc2libGUgPSBpdGVtLmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFN0cmluZykgPz8gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLm9wdGlvbnNBcnJheSQubmV4dChBcnJheS5mcm9tKHRoaXMuI29wdGlvbnMudmFsdWVzKCkpLmZpbHRlcigoaXRlbSkgPT4gaXRlbS52aXNpYmxlKSk7XG5cbiAgfVxuXG4gIGNyZWF0ZU5hdGl2ZVNlbGVjdCgpIHtcbiAgICBpZiAoIXRoaXMubmF0aXZlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KE11bHRpU2VsZWN0TmF0aXZlU2VsZWN0Q29tcG9uZW50KTtcbiAgICB0aGlzLnVwZGF0ZU5hdGl2ZVNlbGVjdCgpO1xuICB9XG5cbiAgdXBkYXRlTmF0aXZlU2VsZWN0KCkge1xuICAgIGlmICghdGhpcy5uYXRpdmVTZWxlY3RSZWYgfHwgIXRoaXMubmF0aXZlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5LmZyb20odGhpcy5vcHRpb25zU2VsZWN0ZWQpLm1hcChpdGVtID0+IHtcbiAgICAgIGNvbnN0IHsgc2VsZWN0ZWQsIHZhbHVlLCBsYWJlbCB9ID0gaXRlbVsxXTtcbiAgICAgIHJldHVybiB7IHNlbGVjdGVkLCB2YWx1ZSwgbGFiZWwgfTtcbiAgICB9KTtcblxuICAgIHRoaXMubmF0aXZlU2VsZWN0UmVmLmluc3RhbmNlLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZTtcbiAgICB0aGlzLm5hdGl2ZVNlbGVjdFJlZi5pbnN0YW5jZS5mb3JtID0gdGhpcy5uYXRpdmVGb3JtSWQ7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2UuaWQgPSB0aGlzLm5hdGl2ZUlkO1xuICAgIHRoaXMubmF0aXZlU2VsZWN0UmVmLmluc3RhbmNlLm5hbWUgPSB0aGlzLm5hdGl2ZU5hbWU7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2Uub3B0aW9ucyA9IFsuLi5vcHRpb25zXTtcbiAgICB0aGlzLm5hdGl2ZVNlbGVjdFJlZi5pbnN0YW5jZS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2UuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBpbnB1dEVsZW1lbnRTaXplKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaW5wdXRFbGVtZW50KSB7XG4gICAgICAgIGlmICgodGhpcy5vcHRpb25zU2VsZWN0ZWQuc2l6ZSA+IDAgfHwgdGhpcy5zZWxlY3Rpb25UeXBlID09PSAnY291bnRlcicpICYmICF0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50Py5kaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdzaXplJywgKHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoICsgMikudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3NpemUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU2VhcmNoS2V5RG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGggfHwgdGhpcy5vcHRpb25zU2VsZWN0ZWQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ0JhY2tzcGFjZScsICdEZWxldGUnXS5pbmNsdWRlcygkZXZlbnQua2V5KSkge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgbGFzdCA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gIW9wdGlvbi5kaXNhYmxlZCkucG9wKCk7XG4gICAgICBpZiAobGFzdCkge1xuICAgICAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChsYXN0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEZvY3VzTW9uaXRvcihtb25pdG9yOiBib29sZWFuKSB7XG4gICAgaWYgKG1vbml0b3IgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9jdXNNb25pdG9yU3Vic2NyaXB0aW9uID0gdGhpcy5mb2N1c01vbml0b3I/Lm1vbml0b3IodGhpcy5lbGVtZW50UmVmLCB0cnVlKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyB0byBhdm9pZCBmb2N1cyBsb3N0IG9uIHNwZWVkIHNjcm9sbGluZyB3aXRoIHZpcnR1YWxTY3JvbGxcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKG9yaWdpbikgPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnRyZWVGb2N1c2VkID0gdGhpcy5mb2N1c09yaWdpbihvcmlnaW4pO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZj8ubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTW9uaXRvcj8uc3RvcE1vbml0b3JpbmcodGhpcy5lbGVtZW50UmVmKTtcbiAgICAgIHRoaXMuZm9jdXNNb25pdG9yU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGl2ZU9wdGlvbjogKEZvY3VzYWJsZU9wdGlvbiAmIE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50KSB8IG51bGwgPSBudWxsO1xuXG4gIGhhbmRsZVNjcm9sbGVkSW5kZXhDaGFuZ2Uoc2Nyb2xsZWRJbmRleDogbnVtYmVyLCBzY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG5cbiAgICBpZiAoIXRoaXMuc2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQgPSBzY3JvbGxWaWV3cG9ydDtcbiAgICB9XG5cbiAgICBjb25zdCBhdmFpbGFibGVPcHRpb25zID0gdGhpcy5vcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnZpc2libGUpO1xuICAgIGNvbnN0IGZpcnN0VmlzaWJsZU9wdGlvbiA9IGF2YWlsYWJsZU9wdGlvbnNbc2Nyb2xsZWRJbmRleF07XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uSW5kZXggPSBhdmFpbGFibGVPcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLmFjdGl2ZU9wdGlvbj8udmFsdWUpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheSA9IHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC50b0FycmF5KCk7XG5cbiAgICBpZiAoc2Nyb2xsZWRJbmRleCA+IGFjdGl2ZU9wdGlvbkluZGV4KSB7XG4gICAgICBjb25zdCBmaXJzdFZpc2libGVJdGVtID0gb3B0aW9uc0FycmF5LmZpbmQob3B0aW9uID0+IG9wdGlvbi52YWx1ZSA9PT0gZmlyc3RWaXNpYmxlT3B0aW9uPy52YWx1ZSk7XG4gICAgICBpZiAoZmlyc3RWaXNpYmxlSXRlbSAmJiBzY3JvbGxlZEluZGV4KSB7XG4gICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShmaXJzdFZpc2libGVJdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsZWRJbmRleCArIHRoaXMudmlzaWJsZUl0ZW1zIC0gMiA8PSBhY3RpdmVPcHRpb25JbmRleCkge1xuICAgICAgY29uc3QgbGFzdFZpc2libGVJdGVtID0gb3B0aW9uc0FycmF5LmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSBmaXJzdFZpc2libGVPcHRpb24udmFsdWUpO1xuICAgICAgaWYgKGxhc3RWaXNpYmxlSXRlbSA+IC0xKSB7XG4gICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShsYXN0VmlzaWJsZUl0ZW0gKyB0aGlzLnZpc2libGVJdGVtcyAtIDIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIG9wdGlvbjogSU9wdGlvbikge1xuICAgIHJldHVybiBvcHRpb24udmFsdWU7XG4gIH1cblxuICBoYW5kbGVTZWFyY2hWYWx1ZUNoYW5nZShzZWFyY2hWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlO1xuICAgIGlmICghc2VhcmNoVmFsdWUpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRWaXJ0dWFsU2Nyb2xsZXIoKSB7XG5cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gbXVsdGlTZWxlY3RPcHRpb25UZW1wbGF0ZSBmb3IgdmlydHVhbFNjcm9sbGVyXG4gICAgdGhpcy5jb250ZW50VGVtcGxhdGVzLmZvckVhY2goKGNoaWxkOiBUZW1wbGF0ZUlkRGlyZWN0aXZlKSA9PiB7XG4gICAgICB0aGlzLnRlbXBsYXRlc1tjaGlsZC5pZF0gPSBjaGlsZC50ZW1wbGF0ZVJlZjtcbiAgICB9KTtcblxuICAgIC8vIGlmIG5vIHRlbXBsYXRlIGZvdW5kLCBnZXQgZGVmYXVsdE11bHRpU2VsZWN0T3B0aW9uVGVtcGxhdGUgZnJvbSB2aWV3XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlc1snbXVsdGlTZWxlY3RPcHRpb25UZW1wbGF0ZSddKSB7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQgPSB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc1ZpZXc7XG4gICAgfVxuXG4gICAgLy8gbXVsdGlTZWxlY3RPcHRpb25zQ29udGVudCBnZXRzIG91dCBvZiBvcmRlciBvbiBjaGFuZ2VzXG4gICAgLy8gZG8gc29ydCgpIGFuZCByZXNldCgpXG4gICAgY29uc3QgaW5kZXhPZk9wdGlvbiA9IChvcHRpb246IE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50KSA9PiB7XG4gICAgICByZXR1cm4gWy4uLm9wdGlvbi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0/LmluZGV4T2Yob3B0aW9uLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnNDaGFuZ2UkOiBPYnNlcnZhYmxlPFF1ZXJ5TGlzdDxNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudD4+ID0gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50LmNoYW5nZXM7XG5cbiAgICBjb25zdCBzb3J0ZWRPcHRpb25zJCA9IG9wdGlvbnNDaGFuZ2UkLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy4jZGVzdHJveSQpLFxuICAgICAgbWFwKG9wdGlvbnMgPT4gb3B0aW9ucy50b0FycmF5KCkpLFxuICAgICAgZmlsdGVyKG9wdGlvbnMgPT4gb3B0aW9ucy5sZW5ndGggPiAwKSxcbiAgICAgIG1hcChvcHRpb25zID0+IG9wdGlvbnMuc29ydCgoYSwgYikgPT4gaW5kZXhPZk9wdGlvbihhKSAtIGluZGV4T2ZPcHRpb24oYikpKVxuICAgICk7XG5cbiAgICBzb3J0ZWRPcHRpb25zJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoc29ydGVkT3B0aW9ucyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQucmVzZXQoc29ydGVkT3B0aW9ucyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2Nyb2xsVmlld3BvcnRWaWV3LmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy4jZGVzdHJveSQpLFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBtYXAoY2hhbmdlcyA9PiBjaGFuZ2VzLnRvQXJyYXkoKVswXSksXG4gICAgICAgIHRhcCgoc2Nyb2xsVmlld3BvcnQpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zY3JvbGxWaWV3cG9ydCkge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0ID0gc2Nyb2xsVmlld3BvcnQ7XG5cbiAgICAgICAgICAgICAgY29uc3QgY2RrVmlydHVhbFNjcm9sbENvbnRlbnRXcmFwcGVyID0gdGhpcy5zY3JvbGxWaWV3cG9ydC5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudD8uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAgIGlmIChjZGtWaXJ0dWFsU2Nyb2xsQ29udGVudFdyYXBwZXIpIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjZGtWaXJ0dWFsU2Nyb2xsQ29udGVudFdyYXBwZXIsIG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSBwYXJzZUludChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWxlZnQnKSA/PyAnMTJweCcpICogMztcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9uUmVjb3JkcykgPT4ge1xuICAgICAgICAgICAgICAgICAgbXV0YXRpb25SZWNvcmRzLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5hZGRlZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICdDLU1VTFRJLVNFTEVDVC1PUFRJT04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IHRoaXMuaXRlbU1pbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbU1pbldpZHRoID0gd2lkdGggKyBwYWRkaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoY2RrVmlydHVhbFNjcm9sbENvbnRlbnRXcmFwcGVyLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuI2Rlc3Ryb3kkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TGlzdEtleU1hbmFnZXIoKSB7XG5cbiAgICAvLyBydW4gb25jZSBvbiBtdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50IGZpcnN0IHNldFxuICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuI2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShjaGFuZ2UgPT4ge1xuXG4gICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIgPSBuZXcgRm9jdXNLZXlNYW5hZ2VyKHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudClcbiAgICAgICAgICAud2l0aEhvbWVBbmRFbmQoKVxuICAgICAgICAgIC5za2lwUHJlZGljYXRlKChvcHRpb24pID0+IChvcHRpb24uZGlzYWJsZWQgfHwgIW9wdGlvbi52aXNpYmxlKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl92aXJ0dWFsU2Nyb2xsZXIpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyLndpdGhUeXBlQWhlYWQoMzAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuY2hhbmdlXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy4jZGVzdHJveSQpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoY2hhbmdlID0+IHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UgPCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlT3B0aW9uID8gdGhpcy5saXN0S2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlT3B0aW9uKSA6IHRoaXMuc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtKSB7XG4gICAgICAgICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVPcHRpb24gPSB0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW07XG4gICAgICAgICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICB0aGlzLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldCBmaXJzdEZvY3VzYWJsZUl0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8uZmluZChvcHRpb24gPT4gb3B0aW9uLnZpc2libGUgJiYgIW9wdGlvbi5kaXNhYmxlZCk7XG4gIH1cblxuICBwcml2YXRlIHNldEZpcnN0SXRlbUFjdGl2ZSgpIHtcbiAgICBjb25zdCBmaXJzdEZvY3VzYWJsZUl0ZW0gPSB0aGlzLmZpcnN0Rm9jdXNhYmxlSXRlbTtcbiAgICBmaXJzdEZvY3VzYWJsZUl0ZW0gPyB0aGlzLmxpc3RLZXlNYW5hZ2VyPy5zZXRBY3RpdmVJdGVtKGZpcnN0Rm9jdXNhYmxlSXRlbSkgOiB0aGlzLmxpc3RLZXlNYW5hZ2VyPy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICB0aGlzLmFjdGl2ZU9wdGlvbiA9IHRoaXMubGlzdEtleU1hbmFnZXI/LmFjdGl2ZUl0ZW0gPz8gbnVsbDtcbiAgfVxuXG4gIHVwZGF0ZUFjdGl2ZUl0ZW0oaW5kZXg6IG51bWJlcik6IHZvaWQ7XG5cbiAgdXBkYXRlQWN0aXZlSXRlbTxUIGV4dGVuZHMgKE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50ICYgRm9jdXNhYmxlT3B0aW9uKT4oaXRlbTogVCk6IHZvaWQ7XG5cbiAgdXBkYXRlQWN0aXZlSXRlbShpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBmaXJzdEZvY3VzYWJsZUl0ZW0gPSB0aGlzLmZpcnN0Rm9jdXNhYmxlSXRlbSA/PyBpdGVtO1xuICAgIGZpcnN0Rm9jdXNhYmxlSXRlbSA/IHRoaXMubGlzdEtleU1hbmFnZXI/LnVwZGF0ZUFjdGl2ZUl0ZW0oZmlyc3RGb2N1c2FibGVJdGVtKSA6IHRoaXMubGlzdEtleU1hbmFnZXI/LnVwZGF0ZUFjdGl2ZUl0ZW0oMCk7XG4gICAgaWYgKHRoaXMubGlzdEtleU1hbmFnZXI/LmFjdGl2ZUl0ZW0pIHtcbiAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8uZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICBvcHRpb24uYWN0aXZlID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbS5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZU9wdGlvbiA9IHRoaXMubGlzdEtleU1hbmFnZXI/LmFjdGl2ZUl0ZW0gPz8gbnVsbDtcbiAgfVxufVxuIiwiPGMtZHJvcGRvd24gI2Ryb3Bkb3duPVwiY0Ryb3Bkb3duXCJcbiAgICAgICAgICAgIFsodmlzaWJsZSldPVwidmlzaWJsZVwiXG4gICAgICAgICAgICBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJtdWx0aXNlbGVjdENsYXNzZXNcIlxuICAgICAgICAgICAgW3BvcHBlck9wdGlvbnNdPVwicG9wcGVyanNPcHRpb25zXCJcbiAgICAgICAgICAgIGNsYXNzPVwicGlja2VyXCI+XG4gIDxkaXYgI2Ryb3Bkb3duVG9nZ2xlPVwiY0Ryb3Bkb3duVG9nZ2xlXCIgW2NhcmV0XT1cImZhbHNlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgY0Ryb3Bkb3duVG9nZ2xlPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLW11bHRpLXNlbGVjdC1zZWxlY3Rpb25cIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzZWxlY3Rpb25UeXBlID09PSAndGFncydcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihvcHRpb25zU2VsZWN0ZWQkIHwgYXN5bmMpIGFzIG9wdGlvblRhZ3NcIj5cbiAgICAgICAgICA8Yy1tdWx0aS1zZWxlY3QtdGFnXG4gICAgICAgICAgICAocmVtb3ZlKT1cImhhbmRsZVRhZ1JlbW92ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uVGFnczsgaW5kZXggYXMgaVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkID8/IGZhbHNlXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIlxuICAgICAgICAgICAgW29wdGlvbl09XCJvcHRpb25cIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXRhZ1wiXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPC9jLW11bHRpLXNlbGVjdC10YWc+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzZWxlY3Rpb25UeXBlID09PSAndGV4dCcgJiYgISFzZWxlY3RlZE9wdGlvbnNUZXh0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtc2VhcmNoXCI+e3sgc2VsZWN0ZWRPcHRpb25zVGV4dCB9fTwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic2VsZWN0aW9uVHlwZSA9PT0gJ2NvdW50ZXInXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY291bnRlclRleHRUeXBlID09PSAnc3RyaW5nJzsgZWxzZSBwbHVyYWxNYXBcIj57eyBjb3VudGVyVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwbHVyYWxNYXA+XG4gICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZE9wdGlvbnMubGVuZ3RofX0ge3sgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCB8IGkxOG5QbHVyYWw6IHNlbGVjdGlvblR5cGVDb3VudGVyVGV4dFBsdXJhbE1hcCA/PyB7IG90aGVyOiBjb3VudGVyVGV4dCB9IH19PC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwhLS0gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIXNlYXJjaCAmJiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoID09PSAwICYmIHNlbGVjdGlvblR5cGUgIT09ICdjb3VudGVyJ1wiPi0tPlxuICAgICAgPCEtLSAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLW11bHRpLXNlbGVjdC1zZWFyY2hcIj57eyBwbGFjZWhvbGRlciB9fTwvc3Bhbj4tLT5cbiAgICAgIDwhLS0gICAgICA8L25nLXRlbXBsYXRlPi0tPlxuICAgIDwvZGl2PlxuXG4gICAgPGlucHV0XG4gICAgICAjaW5wdXRFbGVtZW50XG4gICAgICAoa2V5ZG93bik9XCJoYW5kbGVTZWFyY2hLZXlEb3duKCRldmVudClcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZVNlYXJjaFZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwib3B0aW9uc1NlbGVjdGVkLnNpemUgPT09IDAgJiYgc2VsZWN0aW9uVHlwZSAhPT0gJ2NvdW50ZXInID8gcGxhY2Vob2xkZXIgOiBudWxsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCAhc2VhcmNoXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2Zvcm0tbXVsdGktc2VsZWN0LXNlYXJjaCc6IHRydWUsIGRpc2FibGVkOiAoZGlzYWJsZWQgfHwgIXNlYXJjaCkgfVwiXG4gICAgICBbbmdNb2RlbF09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIGNNdWx0aVNlbGVjdFNlYXJjaFxuICAgICAgc2l6ZT1cIjNcIlxuICAgICAgdGFiaW5kZXg9XCJ7eyBkaXNhYmxlZCA/IC0xIDogMCB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgPlxuXG4gICAgPGJ1dHRvblxuICAgICAgKGNsaWNrKT1cImNsZWFyQWxsT3B0aW9ucygkZXZlbnQpXCJcbiAgICAgICpuZ0lmPVwiY2xlYW5lciAmJiBvcHRpb25zU2VsZWN0ZWQuc2l6ZSA+IDAgJiYgIWRpc2FibGVkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCAhaXNEcm9wZG93blZpc2libGVcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIGFsbFwiXG4gICAgICBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXNlbGVjdGlvbi1jbGVhbmVyXCJcbiAgICA+PC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2ICNkcm9wZG93bk1lbnU9XCJjRHJvcGRvd25NZW51XCIgKm5nSWY9XCIhZGlzYWJsZWRcIiBbdmlzaWJsZV09XCJkcm9wZG93bi52aXNpYmxlXCIgY0Ryb3Bkb3duTWVudT5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZFbHNlXT1cIm9wdGlvbnNFbXB0eVwiIFtuZ0lmXT1cInZpc2libGVPcHRpb25zID4gMCAmJiBvcHRpb25zLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cInNlbGVjdEFsbE9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0QWxsICYmIG11bHRpcGxlICYmICF2aXJ0dWFsU2Nyb2xsZXJcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LWFsbFwiXG4gICAgICA+XG4gICAgICAgIHt7IHNlbGVjdEFsbExhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2aXJ0dWFsU2Nyb2xsZXIgPyBtdWx0aXNlbGVjdFZpcnR1YWxTY3JvbGxlciA6IG11bHRpc2VsZWN0T3B0aW9uc0RpdlwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNvcHRpb25zRW1wdHk+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtb3B0aW9ucy1lbXB0eVwiPnt7IHNlYXJjaE5vUmVzdWx0c0xhYmVsIH19PC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L2MtZHJvcGRvd24+XG5cbjxuZy10ZW1wbGF0ZSAjbXVsdGlzZWxlY3RWaXJ0dWFsU2Nyb2xsZXI+XG4gIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAjc2Nyb2xsVmlld3BvcnRcbiAgICAoc2Nyb2xsZWRJbmRleENoYW5nZSk9XCJoYW5kbGVTY3JvbGxlZEluZGV4Q2hhbmdlKCRldmVudCwgc2Nyb2xsVmlld3BvcnQpXCJcbiAgICAqbmdJZj1cIm9wdGlvbnNBcnJheSQgfCBhc3luYyBhcyBvcHRpb25zQXJyYXlcIlxuICAgIFtpdGVtU2l6ZV09XCJpdGVtU2l6ZVwiXG4gICAgW25nU3R5bGVdPVwib3B0aW9uc01heEhlaWdodCAhPT0gJ2F1dG8nID8geyAnaGVpZ2h0LnB4Jzogb3B0aW9uc01heEhlaWdodCwgJ21heEhlaWdodC5weCc6IG9wdGlvbnNNYXhIZWlnaHQsICdtaW5XaWR0aC5weCc6IGl0ZW1NaW5XaWR0aCA/PyAxOTYsIG92ZXJmbG93WDogJ2hpZGRlbicgfSA6IHsgJ21pbldpZHRoLnB4JzogaXRlbU1pbldpZHRoID8/IDE5Niwgb3ZlcmZsb3dYOiAnaGlkZGVuJ31cIlxuICAgIG1heEJ1ZmZlclB4PVwie3tpdGVtU2l6ZSAqIHZpc2libGVJdGVtc319XCJcbiAgICBtaW5CdWZmZXJQeD1cInt7aXRlbVNpemUgKiB2aXNpYmxlSXRlbXN9fVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAjY2RrVmlydHVhbEZvclxuICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNBcnJheTsgdHJhY2tCeTogdHJhY2tCeUZuOyB0ZW1wbGF0ZUNhY2hlU2l6ZTogMDsgZXZlbiBhcyBldmVuOyBvZGQgYXMgb2RkOyBpbmRleCBhcyBpbmRleDsgY291bnQgYXMgY291bnQ7IGZpcnN0IGFzIGZpcnN0OyBsYXN0IGFzIGxhc3Q7XCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBvcHRpb24sIGV2ZW4sIG9kZCwgaW5kZXgsIGNvdW50LCBmaXJzdCwgbGFzdH1cIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVzWydtdWx0aVNlbGVjdE9wdGlvblRlbXBsYXRlJ10gfHwgZGVmYXVsdE11bHRpU2VsZWN0T3B0aW9uVGVtcGxhdGVcIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbXVsdGlzZWxlY3RPcHRpb25zRGl2PlxuICA8ZGl2XG4gICAgW25nU3R5bGVdPVwib3B0aW9uc01heEhlaWdodCAhPT0gJ2F1dG8nID8geyAnbWF4SGVpZ2h0LnB4Jzogb3B0aW9uc01heEhlaWdodCwgb3ZlcmZsb3dZOiAnc2Nyb2xsJyB9IDoge31cIlxuICAgIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtb3B0aW9uc1wiXG4gID5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlTZWxlY3RPcHRpb25UZW1wbGF0ZSBsZXQtb3B0aW9uPlxuICA8Yy1tdWx0aS1zZWxlY3Qtb3B0aW9uXG4gICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXG4gICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXG4gICAgW3NlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXG4gICAgW3RleHRdPVwib3B0aW9uLnRleHRcIlxuICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgIFt2aXNpYmxlXT1cIm9wdGlvbi52aXNpYmxlXCJcbiAgPlxuICAgIHt7b3B0aW9uLnRleHR9fVxuICA8L2MtbXVsdGktc2VsZWN0LW9wdGlvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=