@coreui/angular-pro 4.0.0-alpha.8 → 4.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +13 -14
  3. package/esm2020/lib/accordion/accordion/accordion.component.mjs +3 -3
  4. package/esm2020/lib/accordion/accordion-button/accordion-button.directive.mjs +17 -4
  5. package/esm2020/lib/accordion/accordion-item/accordion-item.component.mjs +30 -13
  6. package/esm2020/lib/accordion/accordion.module.mjs +4 -4
  7. package/esm2020/lib/accordion/accordion.service.mjs +7 -7
  8. package/esm2020/lib/alert/alert-heading.directive.mjs +3 -3
  9. package/esm2020/lib/alert/alert-link.directive.mjs +3 -3
  10. package/esm2020/lib/alert/alert.component.mjs +15 -4
  11. package/esm2020/lib/alert/alert.module.mjs +4 -4
  12. package/esm2020/lib/avatar/avatar.component.mjs +3 -3
  13. package/esm2020/lib/avatar/avatar.module.mjs +4 -4
  14. package/esm2020/lib/backdrop/backdrop.service.mjs +3 -3
  15. package/esm2020/lib/badge/badge.component.mjs +3 -3
  16. package/esm2020/lib/badge/badge.module.mjs +4 -4
  17. package/esm2020/lib/breadcrumb/breadcrumb/breadcrumb.component.mjs +3 -3
  18. package/esm2020/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +3 -3
  19. package/esm2020/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +3 -3
  20. package/esm2020/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.mjs +4 -4
  21. package/esm2020/lib/breadcrumb/breadcrumb.module.mjs +4 -4
  22. package/esm2020/lib/button/button-close.directive.mjs +3 -3
  23. package/esm2020/lib/button/button.directive.mjs +7 -4
  24. package/esm2020/lib/button/button.module.mjs +4 -4
  25. package/esm2020/lib/button-group/button-group/button-group.component.mjs +3 -3
  26. package/esm2020/lib/button-group/button-group.module.mjs +4 -4
  27. package/esm2020/lib/button-group/button-toolbar/button-toolbar.component.mjs +3 -3
  28. package/esm2020/lib/callout/callout.component.mjs +3 -3
  29. package/esm2020/lib/callout/callout.module.mjs +4 -4
  30. package/esm2020/lib/card/card-body.component.mjs +3 -3
  31. package/esm2020/lib/card/card-footer.component.mjs +3 -3
  32. package/esm2020/lib/card/card-group.component.mjs +3 -3
  33. package/esm2020/lib/card/card-header-actions.component.mjs +3 -3
  34. package/esm2020/lib/card/card-header.component.mjs +3 -3
  35. package/esm2020/lib/card/card-img-overlay/card-img-overlay.component.mjs +3 -3
  36. package/esm2020/lib/card/card-img.directive.mjs +3 -3
  37. package/esm2020/lib/card/card-link.directive.mjs +3 -3
  38. package/esm2020/lib/card/card-subtitle.directive.mjs +3 -3
  39. package/esm2020/lib/card/card-text.directive.mjs +3 -3
  40. package/esm2020/lib/card/card-title.directive.mjs +3 -3
  41. package/esm2020/lib/card/card.component.mjs +3 -3
  42. package/esm2020/lib/card/card.module.mjs +4 -4
  43. package/esm2020/lib/carousel/carousel/carousel.component.mjs +82 -34
  44. package/esm2020/lib/carousel/carousel-caption/carousel-caption.component.mjs +3 -3
  45. package/esm2020/lib/carousel/carousel-control/carousel-control.component.mjs +3 -3
  46. package/esm2020/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +3 -3
  47. package/esm2020/lib/carousel/carousel-inner/carousel-inner.component.mjs +3 -3
  48. package/esm2020/lib/carousel/carousel-item/carousel-item.component.mjs +13 -5
  49. package/esm2020/lib/carousel/carousel-state.mjs +12 -6
  50. package/esm2020/lib/carousel/carousel.config.mjs +3 -3
  51. package/esm2020/lib/carousel/carousel.module.mjs +4 -4
  52. package/esm2020/lib/carousel/carousel.service.mjs +4 -4
  53. package/esm2020/lib/collapse/collapse.animations.mjs +10 -1
  54. package/esm2020/lib/collapse/collapse.directive.mjs +65 -21
  55. package/esm2020/lib/collapse/collapse.module.mjs +4 -4
  56. package/esm2020/lib/dropdown/dropdown/dropdown.component.mjs +73 -48
  57. package/esm2020/lib/dropdown/dropdown-close/dropdown-close.directive.mjs +64 -0
  58. package/esm2020/lib/dropdown/dropdown-divider/dropdown-divider.directive.mjs +3 -3
  59. package/esm2020/lib/dropdown/dropdown-header/dropdown-header.directive.mjs +3 -3
  60. package/esm2020/lib/dropdown/dropdown-item/dropdown-item-plain.directive.mjs +3 -3
  61. package/esm2020/lib/dropdown/dropdown-item/dropdown-item.directive.mjs +42 -24
  62. package/esm2020/lib/dropdown/dropdown-menu/dropdown-menu.directive.mjs +4 -4
  63. package/esm2020/lib/dropdown/dropdown.module.mjs +14 -9
  64. package/esm2020/lib/dropdown/dropdown.service.mjs +3 -3
  65. package/esm2020/lib/dropdown/public_api.mjs +2 -1
  66. package/esm2020/lib/element-cover/element-cover.component.mjs +71 -0
  67. package/esm2020/lib/element-cover/element-cover.module.mjs +30 -0
  68. package/esm2020/lib/element-cover/index.mjs +2 -0
  69. package/esm2020/lib/element-cover/public_api.mjs +3 -0
  70. package/esm2020/lib/footer/footer.component.mjs +3 -3
  71. package/esm2020/lib/footer/footer.module.mjs +4 -4
  72. package/esm2020/lib/form/form/form.directive.mjs +3 -3
  73. package/esm2020/lib/form/form-check/form-check-input.directive.mjs +7 -4
  74. package/esm2020/lib/form/form-check/form-check-label.directive.mjs +3 -3
  75. package/esm2020/lib/form/form-check/form-check.component.mjs +3 -3
  76. package/esm2020/lib/form/form-control/form-control.directive.mjs +3 -3
  77. package/esm2020/lib/form/form-feedback/form-feedback.component.mjs +3 -3
  78. package/esm2020/lib/form/form-floating/form-floating.directive.mjs +3 -3
  79. package/esm2020/lib/form/form-label/form-label.directive.mjs +3 -3
  80. package/esm2020/lib/form/form-select/form-select.directive.mjs +3 -3
  81. package/esm2020/lib/form/form-text/form-text.directive.mjs +3 -3
  82. package/esm2020/lib/form/form.module.mjs +4 -4
  83. package/esm2020/lib/form/input-group/input-group.component.mjs +3 -3
  84. package/esm2020/lib/form/input-group-text/input-group-text.directive.mjs +3 -3
  85. package/esm2020/lib/grid/col.component.mjs +3 -3
  86. package/esm2020/lib/grid/col.directive.mjs +10 -5
  87. package/esm2020/lib/grid/container.component.mjs +3 -3
  88. package/esm2020/lib/grid/grid.module.mjs +4 -4
  89. package/esm2020/lib/grid/gutter.directive.mjs +3 -3
  90. package/esm2020/lib/grid/row.component.mjs +3 -3
  91. package/esm2020/lib/grid/row.directive.mjs +3 -3
  92. package/esm2020/lib/header/header/header.component.mjs +3 -3
  93. package/esm2020/lib/header/header-brand/header-brand.component.mjs +3 -3
  94. package/esm2020/lib/header/header-divider/header-divider.component.mjs +3 -3
  95. package/esm2020/lib/header/header-nav/header-nav.component.mjs +3 -3
  96. package/esm2020/lib/header/header-text/header-text.component.mjs +3 -3
  97. package/esm2020/lib/header/header-toggler/header-toggler.directive.mjs +3 -3
  98. package/esm2020/lib/header/header.module.mjs +4 -4
  99. package/esm2020/lib/image/img.directive.mjs +3 -3
  100. package/esm2020/lib/image/img.module.mjs +4 -4
  101. package/esm2020/lib/list-group/list-group-item.directive.mjs +3 -3
  102. package/esm2020/lib/list-group/list-group.directive.mjs +3 -3
  103. package/esm2020/lib/list-group/list-group.module.mjs +4 -4
  104. package/esm2020/lib/loading-button/loading-button.component.mjs +3 -3
  105. package/esm2020/lib/loading-button/loading-button.module.mjs +4 -4
  106. package/esm2020/lib/modal/modal/modal.component.mjs +3 -3
  107. package/esm2020/lib/modal/modal-body/modal-body.component.mjs +3 -3
  108. package/esm2020/lib/modal/modal-content/modal-content.component.mjs +3 -3
  109. package/esm2020/lib/modal/modal-dialog/modal-dialog.component.mjs +3 -3
  110. package/esm2020/lib/modal/modal-dismiss/modal-toggle.directive.mjs +3 -3
  111. package/esm2020/lib/modal/modal-footer/modal-footer.component.mjs +3 -3
  112. package/esm2020/lib/modal/modal-header/modal-header.component.mjs +3 -3
  113. package/esm2020/lib/modal/modal-title/modal-title.directive.mjs +3 -3
  114. package/esm2020/lib/modal/modal.module.mjs +4 -4
  115. package/esm2020/lib/modal/modal.service.mjs +3 -3
  116. package/esm2020/lib/multi-select/multi-select/multi-select.component.mjs +3 -3
  117. package/esm2020/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +3 -3
  118. package/esm2020/lib/multi-select/multi-select-optgroup/multi-select-optgroup-label.component.mjs +3 -3
  119. package/esm2020/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +3 -3
  120. package/esm2020/lib/multi-select/multi-select-option/multi-select-option.component.mjs +3 -3
  121. package/esm2020/lib/multi-select/multi-select-tag/multi-select-tag.component.mjs +3 -3
  122. package/esm2020/lib/multi-select/multi-select.module.mjs +4 -4
  123. package/esm2020/lib/multi-select/multi-select.service.mjs +3 -3
  124. package/esm2020/lib/nav/nav-item.component.mjs +3 -3
  125. package/esm2020/lib/nav/nav-link.directive.mjs +3 -3
  126. package/esm2020/lib/nav/nav.component.mjs +5 -5
  127. package/esm2020/lib/nav/nav.module.mjs +4 -4
  128. package/esm2020/lib/navbar/navbar-brand/navbar-brand.directive.mjs +3 -3
  129. package/esm2020/lib/navbar/navbar-nav/navbar-nav.component.mjs +3 -3
  130. package/esm2020/lib/navbar/navbar-text/navbar-text.component.mjs +3 -3
  131. package/esm2020/lib/navbar/navbar-toggler/navbar-toggler.directive.mjs +3 -3
  132. package/esm2020/lib/navbar/navbar.component.mjs +3 -3
  133. package/esm2020/lib/navbar/navbar.module.mjs +4 -4
  134. package/esm2020/lib/offcanvas/offcanvas/offcanvas.component.mjs +3 -3
  135. package/esm2020/lib/offcanvas/offcanvas-body/offcanvas-body.component.mjs +3 -3
  136. package/esm2020/lib/offcanvas/offcanvas-header/offcanvas-header.component.mjs +3 -3
  137. package/esm2020/lib/offcanvas/offcanvas-title/offcanvas-title.directive.mjs +3 -3
  138. package/esm2020/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.mjs +3 -3
  139. package/esm2020/lib/offcanvas/offcanvas.module.mjs +4 -4
  140. package/esm2020/lib/offcanvas/offcanvas.service.mjs +3 -3
  141. package/esm2020/lib/pagination/page-item/page-item.component.mjs +3 -3
  142. package/esm2020/lib/pagination/page-item/page-item.directive.mjs +3 -3
  143. package/esm2020/lib/pagination/page-link/page-link.directive.mjs +3 -3
  144. package/esm2020/lib/pagination/pagination/pagination.component.mjs +3 -3
  145. package/esm2020/lib/pagination/pagination.module.mjs +5 -5
  146. package/esm2020/lib/pagination/public_api.mjs +1 -1
  147. package/esm2020/lib/placeholder/index.mjs +2 -0
  148. package/esm2020/lib/placeholder/placeholder-animation.directive.mjs +34 -0
  149. package/esm2020/lib/placeholder/placeholder.directive.mjs +51 -0
  150. package/esm2020/lib/placeholder/placeholder.module.mjs +31 -0
  151. package/esm2020/lib/placeholder/public_api.mjs +4 -0
  152. package/esm2020/lib/popover/popover/popover.component.mjs +3 -3
  153. package/esm2020/lib/popover/popover.directive.mjs +3 -3
  154. package/esm2020/lib/popover/popover.module.mjs +4 -4
  155. package/esm2020/lib/progress/progress-bar.component.mjs +3 -3
  156. package/esm2020/lib/progress/progress.component.mjs +3 -3
  157. package/esm2020/lib/progress/progress.module.mjs +4 -4
  158. package/esm2020/lib/services/class-toggle.service.mjs +3 -3
  159. package/esm2020/lib/services/intersection.service.mjs +34 -0
  160. package/esm2020/lib/services/listeners.service.mjs +3 -3
  161. package/esm2020/lib/services/public_api.mjs +2 -1
  162. package/esm2020/lib/shared/html-attr.directive.mjs +3 -3
  163. package/esm2020/lib/shared/shared.module.mjs +4 -4
  164. package/esm2020/lib/shared/template-id.directive.mjs +3 -3
  165. package/esm2020/lib/sidebar/sidebar/sidebar.component.mjs +3 -3
  166. package/esm2020/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.mjs +3 -3
  167. package/esm2020/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +3 -3
  168. package/esm2020/lib/sidebar/sidebar-footer/sidebar-footer.component.mjs +3 -3
  169. package/esm2020/lib/sidebar/sidebar-header/sidebar-header.component.mjs +3 -3
  170. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.mjs +3 -3
  171. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.mjs +3 -3
  172. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.mjs +3 -3
  173. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.mjs +3 -3
  174. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +3 -3
  175. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +6 -6
  176. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.mjs +3 -3
  177. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-title.component.mjs +3 -3
  178. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +6 -6
  179. package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav.service.mjs +6 -6
  180. package/esm2020/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.mjs +3 -3
  181. package/esm2020/lib/sidebar/sidebar-toggler/sidebar-toggler.component.mjs +3 -3
  182. package/esm2020/lib/sidebar/sidebar.module.mjs +4 -4
  183. package/esm2020/lib/sidebar/sidebar.service.mjs +3 -3
  184. package/esm2020/lib/smart-pagination/index.mjs +2 -0
  185. package/esm2020/lib/smart-pagination/public_api.mjs +3 -0
  186. package/esm2020/lib/smart-pagination/smart-pagination.component.mjs +196 -0
  187. package/esm2020/lib/smart-pagination/smart-pagination.module.mjs +30 -0
  188. package/esm2020/lib/smart-pagination/smart-pagination.type.mjs +2 -0
  189. package/esm2020/lib/smart-table/index.mjs +2 -0
  190. package/esm2020/lib/smart-table/public_api.mjs +3 -0
  191. package/esm2020/lib/smart-table/smart-table/smart-table.component.mjs +449 -0
  192. package/esm2020/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +48 -0
  193. package/esm2020/lib/smart-table/smart-table-head/smart-table-head.component.mjs +138 -0
  194. package/esm2020/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +46 -0
  195. package/esm2020/lib/smart-table/smart-table.module.mjs +72 -0
  196. package/esm2020/lib/smart-table/smart-table.type.mjs +2 -0
  197. package/esm2020/lib/spinner/spinner.component.mjs +3 -3
  198. package/esm2020/lib/spinner/spinner.module.mjs +4 -4
  199. package/esm2020/lib/table/table-active.directive.mjs +3 -3
  200. package/esm2020/lib/table/table-color.directive.mjs +3 -3
  201. package/esm2020/lib/table/table.directive.mjs +5 -5
  202. package/esm2020/lib/table/table.module.mjs +4 -4
  203. package/esm2020/lib/table/table.type.mjs +2 -0
  204. package/esm2020/lib/tabs/tab-content/tab-content.component.mjs +3 -3
  205. package/esm2020/lib/tabs/tab-content-ref.directive.mjs +3 -3
  206. package/esm2020/lib/tabs/tab-pane/tab-pane.component.mjs +3 -3
  207. package/esm2020/lib/tabs/tab.service.mjs +3 -3
  208. package/esm2020/lib/tabs/tabs.module.mjs +4 -4
  209. package/esm2020/lib/toast/toast/toast.component.mjs +3 -3
  210. package/esm2020/lib/toast/toast-body/toast-body.component.mjs +3 -3
  211. package/esm2020/lib/toast/toast-close.directive.mjs +3 -3
  212. package/esm2020/lib/toast/toast-header/toast-header.component.mjs +3 -3
  213. package/esm2020/lib/toast/toast.module.mjs +4 -4
  214. package/esm2020/lib/toast/toaster/toaster-host.directive.mjs +3 -3
  215. package/esm2020/lib/toast/toaster/toaster.component.mjs +3 -3
  216. package/esm2020/lib/toast/toaster/toaster.service.mjs +3 -3
  217. package/esm2020/lib/tooltip/tooltip/tooltip.component.mjs +3 -3
  218. package/esm2020/lib/tooltip/tooltip.directive.mjs +3 -3
  219. package/esm2020/lib/tooltip/tooltip.module.mjs +4 -4
  220. package/esm2020/lib/utilities/align.directive.mjs +3 -3
  221. package/esm2020/lib/utilities/bg-color.directive.mjs +3 -3
  222. package/esm2020/lib/utilities/border.directive.mjs +3 -3
  223. package/esm2020/lib/utilities/rounded.directive.mjs +3 -3
  224. package/esm2020/lib/utilities/text-color.directive.mjs +3 -3
  225. package/esm2020/lib/utilities/utilities.module.mjs +4 -4
  226. package/esm2020/lib/widget/widget-stat-a/widget-stat-a.component.mjs +3 -3
  227. package/esm2020/lib/widget/widget-stat-b/widget-stat-b.component.mjs +3 -3
  228. package/esm2020/lib/widget/widget-stat-c/widget-stat-c.component.mjs +3 -3
  229. package/esm2020/lib/widget/widget-stat-d/widget-stat-d.component.mjs +3 -3
  230. package/esm2020/lib/widget/widget-stat-e/widget-stat-e.component.mjs +3 -3
  231. package/esm2020/lib/widget/widget-stat-f/widget-stat-f.component.mjs +3 -3
  232. package/esm2020/lib/widget/widget.module.mjs +4 -4
  233. package/esm2020/public-api.mjs +6 -2
  234. package/fesm2015/coreui-angular-pro.mjs +2633 -1203
  235. package/fesm2015/coreui-angular-pro.mjs.map +1 -1
  236. package/fesm2020/coreui-angular-pro.mjs +2639 -1224
  237. package/fesm2020/coreui-angular-pro.mjs.map +1 -1
  238. package/lib/accordion/accordion-button/accordion-button.directive.d.ts +7 -1
  239. package/lib/accordion/accordion-item/accordion-item.component.d.ts +9 -2
  240. package/lib/accordion/accordion.service.d.ts +1 -1
  241. package/lib/alert/alert.component.d.ts +7 -1
  242. package/lib/carousel/carousel/carousel.component.d.ts +29 -5
  243. package/lib/carousel/carousel-item/carousel-item.component.d.ts +8 -2
  244. package/lib/carousel/carousel.service.d.ts +2 -0
  245. package/lib/collapse/collapse.animations.d.ts +2 -0
  246. package/lib/collapse/collapse.directive.d.ts +19 -7
  247. package/lib/dropdown/dropdown/dropdown.component.d.ts +12 -6
  248. package/lib/dropdown/dropdown-close/dropdown-close.directive.d.ts +23 -0
  249. package/lib/dropdown/dropdown-item/dropdown-item.directive.d.ts +20 -11
  250. package/lib/dropdown/dropdown.module.d.ts +3 -2
  251. package/lib/dropdown/public_api.d.ts +1 -0
  252. package/lib/element-cover/element-cover.component.d.ts +27 -0
  253. package/lib/element-cover/element-cover.module.d.ts +9 -0
  254. package/lib/element-cover/index.d.ts +1 -0
  255. package/lib/element-cover/public_api.d.ts +2 -0
  256. package/lib/form/form-check/form-check-input.directive.d.ts +1 -1
  257. package/lib/grid/col.directive.d.ts +3 -1
  258. package/lib/placeholder/index.d.ts +1 -0
  259. package/lib/placeholder/placeholder-animation.directive.d.ts +18 -0
  260. package/lib/placeholder/placeholder.directive.d.ts +22 -0
  261. package/lib/placeholder/placeholder.module.d.ts +9 -0
  262. package/lib/placeholder/public_api.d.ts +3 -0
  263. package/lib/services/intersection.service.d.ts +22 -0
  264. package/lib/services/public_api.d.ts +1 -0
  265. package/lib/smart-pagination/index.d.ts +1 -0
  266. package/lib/smart-pagination/public_api.d.ts +2 -0
  267. package/lib/smart-pagination/smart-pagination.component.d.ts +109 -0
  268. package/lib/smart-pagination/smart-pagination.module.d.ts +9 -0
  269. package/lib/smart-pagination/smart-pagination.type.d.ts +79 -0
  270. package/lib/smart-table/index.d.ts +1 -0
  271. package/lib/smart-table/public_api.d.ts +2 -0
  272. package/lib/smart-table/smart-table/smart-table.component.d.ts +124 -0
  273. package/lib/smart-table/smart-table-filter/smart-table-filter.component.d.ts +15 -0
  274. package/lib/smart-table/smart-table-head/smart-table-head.component.d.ts +36 -0
  275. package/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.d.ts +14 -0
  276. package/lib/smart-table/smart-table.module.d.ts +20 -0
  277. package/lib/smart-table/smart-table.type.d.ts +272 -0
  278. package/lib/table/table.directive.d.ts +3 -2
  279. package/lib/table/table.type.d.ts +76 -0
  280. package/package.json +2 -2
  281. package/public-api.d.ts +5 -1
@@ -0,0 +1,449 @@
1
+ import { Component, ContentChildren, EventEmitter, Input, Output } from '@angular/core';
2
+ import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';
3
+ import { TemplateIdDirective } from '../../shared';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../smart-table-filter/smart-table-filter.component";
6
+ import * as i2 from "../smart-table-head/smart-table-head.component";
7
+ import * as i3 from "../../element-cover/element-cover.component";
8
+ import * as i4 from "../../smart-pagination/smart-pagination.component";
9
+ import * as i5 from "../smart-table-items-per-page-selector/smart-table-items-per-page-selector.component";
10
+ import * as i6 from "@angular/common";
11
+ import * as i7 from "../../button/button.directive";
12
+ import * as i8 from "../../table/table.directive";
13
+ import * as i9 from "../../shared/html-attr.directive";
14
+ import * as i10 from "../../table/table-color.directive";
15
+ import * as i11 from "../../utilities/align.directive";
16
+ import * as i12 from "../../table/table-active.directive";
17
+ import * as i13 from "../../form/form-check/form-check-input.directive";
18
+ export class SmartTableComponent {
19
+ constructor(iterable) {
20
+ this.iterable = iterable;
21
+ this._activePage = 1;
22
+ this._cleaner = false;
23
+ this._clickableRows = false;
24
+ this._columnFilterValue = {};
25
+ this._footer = false;
26
+ this._header = false;
27
+ this._items = [];
28
+ this._itemsPerPage = 10;
29
+ this.itemsPerPageLabel = 'Items per page:';
30
+ this.itemsPerPageOptions = [5, 10, 20, 50];
31
+ this.noItemsLabel = 'No items found';
32
+ this._pagination = false;
33
+ this._selectable = false;
34
+ this._sorterValue = {};
35
+ this.tableFilterLabel = 'Filter:';
36
+ this.tableFilterPlaceholder = 'type string...';
37
+ this._tableFilterValue = '';
38
+ this.tableBodyProps = {};
39
+ this.tableFootProps = {};
40
+ this.tableHeadProps = {};
41
+ this.tableProps = {};
42
+ this.selectedItemsChange = new EventEmitter();
43
+ this.sorterValueChange = new EventEmitter();
44
+ this.activePageChange = new EventEmitter();
45
+ this.itemsPerPageChange = new EventEmitter();
46
+ this.rowClick = new EventEmitter();
47
+ this.columnFilterValueChange = new EventEmitter();
48
+ this.filteredItemsChange = new EventEmitter();
49
+ this.tableFilterValueChange = new EventEmitter();
50
+ this.templates = { tableDetails: null, tableData: null };
51
+ this._selectedAll = false;
52
+ this.iterableDiffer = this.iterable.find(this.items).create();
53
+ }
54
+ set activePage(value) {
55
+ this._activePage = coerceNumberProperty(value) || 1;
56
+ this.activePageChange.emit(this._activePage);
57
+ }
58
+ get activePage() {
59
+ return this._activePage;
60
+ }
61
+ set cleaner(value) {
62
+ this._cleaner = coerceBooleanProperty(value);
63
+ }
64
+ get cleaner() {
65
+ return this._cleaner;
66
+ }
67
+ set clickableRows(value) {
68
+ this._clickableRows = coerceBooleanProperty(value);
69
+ }
70
+ get clickableRows() {
71
+ return this._clickableRows;
72
+ }
73
+ set columns(value) {
74
+ this._columns = value;
75
+ }
76
+ get columns() {
77
+ return this._columns || this.rawColumnNames;
78
+ }
79
+ set columnFilterValue(value) {
80
+ this._columnFilterValue = value;
81
+ this.columnFilterValueChange.emit({ ...value });
82
+ this.tableFiltered; // emits tableFiltered change
83
+ }
84
+ get columnFilterValue() {
85
+ return this._columnFilterValue;
86
+ }
87
+ set footer(value) {
88
+ this._footer = coerceBooleanProperty(value);
89
+ }
90
+ get footer() {
91
+ return this._footer;
92
+ }
93
+ set header(value) {
94
+ this._header = coerceBooleanProperty(value);
95
+ }
96
+ get header() {
97
+ return this._header;
98
+ }
99
+ set items(value) {
100
+ this._items = this.setItems(value);
101
+ }
102
+ get items() {
103
+ return this._items;
104
+ }
105
+ set itemsPerPage(value) {
106
+ this._itemsPerPage = coerceNumberProperty(value);
107
+ }
108
+ get itemsPerPage() {
109
+ return this._itemsPerPage;
110
+ }
111
+ set pagination(value) {
112
+ this._pagination = coerceBooleanProperty(value);
113
+ }
114
+ get pagination() {
115
+ return this._pagination;
116
+ }
117
+ set selectable(value) {
118
+ this._selectable = coerceBooleanProperty(value);
119
+ }
120
+ get selectable() {
121
+ return this._selectable;
122
+ }
123
+ set sorterValue(value) {
124
+ this._sorterValue = value;
125
+ this.sorterValueChange.emit({ ...value });
126
+ }
127
+ get sorterValue() {
128
+ return this._sorterValue;
129
+ }
130
+ set tableFilterValue(value) {
131
+ this._tableFilterValue = value;
132
+ this.tableFilterValueChange.emit(value);
133
+ this.tableFiltered; // emits tableFiltered change
134
+ }
135
+ get tableFilterValue() {
136
+ return this._tableFilterValue;
137
+ }
138
+ ngAfterContentInit() {
139
+ this.columnTemplates.forEach((child) => {
140
+ this.templates[child.id] = child.templateRef;
141
+ });
142
+ }
143
+ get selectedAll() {
144
+ const selected = this.items.filter((item) => item._selected === true);
145
+ return selected.length === 0 ? false : selected.length === this.items.length ? true : 'indeterminate';
146
+ // return this._selectedAll;
147
+ }
148
+ set selectedAll(value) {
149
+ const selected = this.items.filter((item) => item._selected === true);
150
+ this.selectedItemsChange.emit(selected);
151
+ this._selectedAll = selected.length === 0 ? false : selected.length === this.items.length ? true : 'indeterminate';
152
+ }
153
+ get tableFilterState() {
154
+ return this.tableFilterValue ? this.tableFilterValue : '';
155
+ }
156
+ get columnFilterState() {
157
+ return this.columnFilterValue ? this.columnFilterValue : {};
158
+ }
159
+ get numberOfPages() {
160
+ return this._itemsPerPage ? Math.ceil(this.sortedItems.length / this._itemsPerPage) : 1;
161
+ }
162
+ get colspan() {
163
+ return this._selectable ? this.rawColumnNames.length + 1 : this.rawColumnNames.length;
164
+ }
165
+ get firstItemOnActivePageIndex() {
166
+ return this._activePage ? (this._activePage - 1) * this._itemsPerPage : 0;
167
+ }
168
+ get itemsOnActivePage() {
169
+ return this.sortedItems.slice(this.firstItemOnActivePageIndex, this.firstItemOnActivePageIndex + this._itemsPerPage);
170
+ }
171
+ get currentItems() {
172
+ return this._activePage ? this.itemsOnActivePage : this.sortedItems ?? [];
173
+ // return this.items ?? [];
174
+ }
175
+ get genCols() {
176
+ return Object.keys(this._items ? this._items[0] ?? {} : {}).filter((el) => el.charAt(0) !== '_');
177
+ }
178
+ get rawColumnNames() {
179
+ return this._columns
180
+ ? this._columns.map((column) => {
181
+ if (typeof column === 'object')
182
+ return column.key;
183
+ else
184
+ return column;
185
+ })
186
+ : this.genCols;
187
+ }
188
+ get itemsDataColumns() {
189
+ return this.rawColumnNames.filter((name) => this.genCols.includes(name));
190
+ }
191
+ get sortedItems() {
192
+ const col = this.sorterValue.column;
193
+ if (!col ||
194
+ !this.itemsDataColumns.includes(col) ||
195
+ (this.columnSorter &&
196
+ typeof this.columnSorter === 'object' &&
197
+ this.columnSorter.external)) {
198
+ return this.tableFiltered;
199
+ }
200
+ //if values in column are to be sorted by numeric value they all have to be type number
201
+ // const flip = sorterState.asc ? 1 : -1
202
+ const flip = this.sorterValue.state === 'asc' ? 1 : this.sorterValue.state === 'desc' ? -1 : 0;
203
+ // @ts-ignore
204
+ const sorted = this.tableFiltered.slice().sort((item, item2) => {
205
+ const value = item[col];
206
+ const value2 = item2[col];
207
+ const a = typeof value === 'number' ? value : String(value).toLowerCase();
208
+ const b = typeof value2 === 'number' ? value2 : String(value2).toLowerCase();
209
+ return a > b ? 1 * flip : b > a ? -1 * flip : 0;
210
+ });
211
+ return sorted;
212
+ }
213
+ get columnFiltered() {
214
+ let _items = this._items;
215
+ if (this.columnFilter &&
216
+ typeof this.columnFilter === 'object' &&
217
+ this.columnFilter.external) {
218
+ // @ts-ignore
219
+ return _items;
220
+ }
221
+ Object.entries(this.columnFilterState).forEach(([key, value]) => {
222
+ const columnFilter = String(value).toLowerCase();
223
+ if (columnFilter && this.itemsDataColumns.includes(key)) {
224
+ // @ts-ignore
225
+ _items = _items.filter((item) => {
226
+ return String(item[key]).toLowerCase().includes(columnFilter);
227
+ });
228
+ }
229
+ });
230
+ // @ts-ignore
231
+ return _items;
232
+ }
233
+ get tableFiltered() {
234
+ let items = this.columnFiltered;
235
+ if (!this.tableFilterState ||
236
+ (this.tableFilter && typeof this.tableFilter === 'object' && this.tableFilter.external)) {
237
+ this.filteredItemsChange.emit(items);
238
+ return items;
239
+ }
240
+ const filter = this.tableFilterState.toLowerCase();
241
+ const valueContainFilter = (val) => String(val).toLowerCase().includes(filter);
242
+ // @ts-ignore
243
+ items = items.filter((item) => {
244
+ return !!this.itemsDataColumns.find((key) => valueContainFilter(item[key]));
245
+ });
246
+ this.filteredItemsChange.emit(items);
247
+ return items;
248
+ }
249
+ get isFiltered() {
250
+ return this.tableFilterState || this.sorterValue?.column || Object.values(this.columnFilterState).join('');
251
+ }
252
+ setItems(items) {
253
+ if (Array.isArray(items)) {
254
+ return items.map((item, index) => {
255
+ return { ...item, _id: index };
256
+ });
257
+ }
258
+ return [];
259
+ }
260
+ handleSortChange($event) {
261
+ this.handleSorterChange($event.columnKey, $event.index);
262
+ }
263
+ isSortable(i) {
264
+ const isDataColumn = this.itemsDataColumns.includes(this.rawColumnNames[i]);
265
+ let column;
266
+ if (this.columns)
267
+ column = this.columns[i];
268
+ return (this.columnSorter &&
269
+ (!this.columns ||
270
+ typeof column !== 'object' ||
271
+ (typeof column === 'object' &&
272
+ (typeof column.sorter === 'undefined' || column.sorter))) &&
273
+ isDataColumn);
274
+ }
275
+ handleSorterChange(column, index) {
276
+ if (!this.isSortable(index)) {
277
+ return;
278
+ }
279
+ //if column changed or sort was descending change asc to true
280
+ const state = { ...this.sorterValue };
281
+ if (state.column === column) {
282
+ if (state.state === 0) {
283
+ state.state = 'asc';
284
+ }
285
+ else if (state.state === 'asc') {
286
+ state.state = 'desc';
287
+ }
288
+ else {
289
+ if (typeof this.columnSorter === 'object' && !this.columnSorter.resetable) {
290
+ state.state = 'asc';
291
+ }
292
+ else {
293
+ state.state = 0;
294
+ }
295
+ }
296
+ }
297
+ else {
298
+ state.column = column;
299
+ state.state = 'asc';
300
+ }
301
+ this.sorterValue = { ...state };
302
+ }
303
+ setActivePage($event) {
304
+ this.activePage = $event;
305
+ }
306
+ handleColumnFilterChange($event) {
307
+ const { column, value } = $event;
308
+ const isLazy = this.columnFilter && typeof this.columnFilter === 'object' && this.columnFilter.lazy === true;
309
+ // if ((isLazy && type === 'input') || (!isLazy && type === 'change')) {
310
+ if (isLazy) {
311
+ return;
312
+ }
313
+ this.setActivePage(1);
314
+ this.columnFilterValue = { ...this.columnFilterValue, [`${column}`]: value };
315
+ }
316
+ handleTableFilterChange($event) {
317
+ const isLazy = this.tableFilter && typeof this.tableFilter === 'object' && this.tableFilter.lazy === true;
318
+ // if ((isLazy && type === 'input') || (!isLazy && type === 'change')) {
319
+ if (isLazy) {
320
+ return;
321
+ }
322
+ this.setActivePage(1);
323
+ this.tableFilterValue = $event;
324
+ }
325
+ clean($event) {
326
+ this.columnFilterValue = {};
327
+ this.tableFilterValue = '';
328
+ this.sorterValue = {};
329
+ this.tableFiltered; //emits tableFiltered change
330
+ }
331
+ handleItemsPerPageChange(value) {
332
+ if (value !== this._itemsPerPage) {
333
+ this.setActivePage(1);
334
+ this._itemsPerPage = value;
335
+ this.itemsPerPageChange.emit(value);
336
+ }
337
+ }
338
+ handleRowChecked($event, item) {
339
+ item._selected = $event.target.checked;
340
+ const selected = this.items.filter((item) => item._selected === true);
341
+ this.selectedItemsChange.emit(selected);
342
+ }
343
+ handleSelectAllChange($event) {
344
+ this._items = this.items.map((item) => {
345
+ return { ...item, _selected: $event };
346
+ });
347
+ this.selectedAll = $event;
348
+ }
349
+ // tableDataCellProps(item: IItem, colName: string) {
350
+ // const props = item['_cellProps'] && {
351
+ // ...(item['_cellProps']['all'] && { ...item['_cellProps']['all'] }),
352
+ // ...(item['_cellProps'][colName] && { ...item['_cellProps'][colName] }),
353
+ // }
354
+ // console.log('tableDataCellProps', props)
355
+ // return props
356
+ // }
357
+ getColumnName($event) {
358
+ const target = $event.target;
359
+ const closest = target.closest('tr');
360
+ const children = closest ? Array.from(closest.children) : [];
361
+ const clickedCell = children.filter((child) => child.contains(target))[0];
362
+ return this.rawColumnNames[children.indexOf(clickedCell) - (this._selectable ? 1 : 0)];
363
+ }
364
+ handleRowClick(param) {
365
+ const { $event, item, i } = { ...param };
366
+ const columnName = this.getColumnName(param.$event);
367
+ this.rowClick.emit({ item: item, index: i + this.firstItemOnActivePageIndex, columnName, event: $event });
368
+ }
369
+ }
370
+ SmartTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: SmartTableComponent, deps: [{ token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
371
+ SmartTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: SmartTableComponent, selector: "c-smart-table", inputs: { activePage: "activePage", cleaner: "cleaner", clickableRows: "clickableRows", columns: "columns", columnFilter: "columnFilter", columnFilterValue: "columnFilterValue", columnSorter: "columnSorter", footer: "footer", header: "header", items: "items", itemsPerPage: "itemsPerPage", itemsPerPageLabel: "itemsPerPageLabel", itemsPerPageOptions: "itemsPerPageOptions", itemsPerPageSelect: "itemsPerPageSelect", loading: "loading", noItemsLabel: "noItemsLabel", pagination: "pagination", selectable: "selectable", sorterValue: "sorterValue", tableFilter: "tableFilter", tableFilterLabel: "tableFilterLabel", tableFilterPlaceholder: "tableFilterPlaceholder", tableFilterValue: "tableFilterValue", tableBodyProps: "tableBodyProps", tableFootProps: "tableFootProps", tableHeadProps: "tableHeadProps", tableProps: "tableProps" }, outputs: { selectedItemsChange: "selectedItemsChange", sorterValueChange: "sorterValueChange", activePageChange: "activePageChange", itemsPerPageChange: "itemsPerPageChange", rowClick: "rowClick", columnFilterValueChange: "columnFilterValueChange", filteredItemsChange: "filteredItemsChange", tableFilterValueChange: "tableFilterValueChange" }, queries: [{ propertyName: "columnTemplates", predicate: TemplateIdDirective }], exportAs: ["cSmartTable"], ngImport: i0, template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner\" class=\"row my-2 mx-0\">\r\n <ng-template [ngIf]=\"tableFilter || cleaner\">\r\n <div class=\"col-auto p-0\">\r\n <c-smart-table-filter\r\n (valueChange)=\"handleTableFilterChange($event)\"\r\n *ngIf=\"tableFilter\"\r\n [filterLabel]=\"tableFilterLabel\"\r\n [filterPlaceholder]=\"tableFilterPlaceholder\"\r\n [value]=\"tableFilterState\"\r\n >\r\n </c-smart-table-filter>\r\n </div>\r\n <div class=\"col-auto p-0\">\r\n <button\r\n (click)=\"clean($event)\"\r\n *ngIf=\"cleaner\"\r\n [disabled]=\"!isFiltered\"\r\n [ngClass]=\"{'ms-1': tableFilter}\"\r\n [tabindex]=\"0\"\r\n cButton\r\n color=\"transparent\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\"></ng-container>\r\n </button>\r\n </div>\r\n </ng-template>\r\n</div>\r\n<div class=\"position-relative\">\r\n <table [align]=\"tableProps?.align\"\r\n [borderColor]=\"tableProps?.borderColor\"\r\n [bordered]=\"tableProps?.bordered\"\r\n [borderless]=\"tableProps?.borderless\"\r\n [caption]=\"tableProps?.caption\"\r\n [color]=\"tableProps?.color\"\r\n [hover]=\"tableProps?.hover\"\r\n [responsive]=\"tableProps?.responsive\"\r\n [small]=\"tableProps?.small\"\r\n [striped]=\"tableProps?.striped\"\r\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableProps?.color\"\r\n cTable\r\n >\r\n <c-smart-table-head\r\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\r\n (selectAllChange)=\"handleSelectAllChange($event)\"\r\n (sorterStateChange)=\"handleSortChange($event)\"\r\n *ngIf=\"header\"\r\n [columnFilterState]=\"columnFilterState\"\r\n [columnFilter]=\"columnFilter\"\r\n [columns]=\"columns\"\r\n [selectAll]=\"selectedAll\"\r\n [selectable]=\"selectable\"\r\n [sorterValue]=\"sorterValue\"\r\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableHeadProps?.color\"\r\n [cAlign]=\"tableHeadProps?.align\"\r\n ></c-smart-table-head>\r\n\r\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\"></ng-container>\r\n\r\n <c-smart-table-head\r\n (selectAllChange)=\"handleSelectAllChange($event)\"\r\n (sorterStateChange)=\"handleSortChange($event)\"\r\n *ngIf=\"footer\"\r\n [columns]=\"columns\"\r\n [selectAll]=\"selectedAll\"\r\n [selectable]=\"selectable\"\r\n [sorterValue]=\"sorterValue\"\r\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableFootProps?.color\"\r\n [cAlign]=\"tableFootProps?.align\"\r\n component=\"tfoot\"\r\n ></c-smart-table-head>\r\n\r\n </table>\r\n <c-element-cover\r\n *ngIf=\"loading\"\r\n [boundaries]=\"[\r\n { sides: ['top'], query: 'td' },\r\n { sides: ['bottom'], query: 'tbody' }\r\n ]\"\r\n ></c-element-cover>\r\n</div>\r\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <c-smart-pagination\r\n (activePageChange)=\"setActivePage($event)\"\r\n *ngIf=\"pagination && numberOfPages > 1\"\r\n [activePage]=\"activePage\"\r\n [pages]=\"numberOfPages\">\r\n </c-smart-pagination>\r\n </div>\r\n <div class=\"col-auto ms-auto\">\r\n <c-smart-table-items-per-page-selector\r\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\r\n *ngIf=\"itemsPerPageSelect\"\r\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\r\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n >\r\n </c-smart-table-items-per-page-selector>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #tbodyDefaultTemplate>\r\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableBodyProps?.color\"\r\n [cAlign]=\"tableBodyProps?.align\"\r\n >\r\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\r\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\r\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\r\n (click)=\"handleRowClick({$event, item, i})\"\r\n [cTableActive]=\"item._props?.active\"\r\n [cTableColor]=\"item._props?.color\"\r\n [cAlign]=\"item._props?.align\"\r\n >\r\n <td *ngIf=\"selectable\"\r\n [cTableActive]=\"item?.['_cellProps']?._all?.active\"\r\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\r\n [cAlign]=\"item?.['_cellProps']?._all?.align\">\r\n <input (change)=\"handleRowChecked($event, item)\" [checked]=\"item._selected ?? false\" cFormCheckInput>\r\n </td>\r\n <ng-template ngFor let-columnName [ngForOf]=\"rawColumnNames\" let-i=\"index\" >\r\n <ng-container *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {item, columnName, tdContent: item[columnName] }\"></ng-container>\r\n </ng-template>\r\n </tr>\r\n <ng-template [ngIf]=\"templates['tableDetails']\">\r\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\r\n <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>\r\n <tr class=\"p-0\">\r\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\r\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\"></ng-container>\r\n </tbody>\r\n</ng-template>\r\n\r\n<ng-template #columnDefaultTemplate let-item=\"item\" let-columnName=\"columnName\" let-tdContent=\"tdContent\">\r\n <td\r\n [cTableActive]=\"item?.['_cellProps']?.[columnName]?.active ?? item?.['_cellProps']?._all?.active\"\r\n [cTableColor]=\"item?.['_cellProps']?.[columnName]?.color ?? item?.['_cellProps']?._all?.color\"\r\n [cAlign]=\"item?.['_cellProps']?.[columnName]?.align ?? item?.['_cellProps']?._all?.align\"\r\n >\r\n {{tdContent}}\r\n </td>\r\n</ng-template>\r\n\r\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\r\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\r\n<!-- <tr class=\"p-0\">-->\r\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\r\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\r\n<!-- </td>-->\r\n<!-- </tr>-->\r\n<!--</ng-template>-->\r\n\r\n<ng-template #noItemsDefaultTemplate>\r\n <tr *ngIf=\"!currentItems.length\">\r\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\r\n </tr>\r\n</ng-template>\r\n\r\n<!--todo: filterIconCustomTemplate-->\r\n<ng-template #filterIconTemplate>\r\n <svg class=\"icon icon-custom-size\" role=\"img\" viewBox=\"0 0 512 512\" width=\"18\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <polygon class=\"ci-primary\"\r\n fill=\"var(--ci-primary-color, currentColor)\"\r\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"></polygon>\r\n <polygon class=\"ci-primary\"\r\n fill=\"var(--ci-primary-color, currentColor)\"\r\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"></polygon>\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{display:block}\n"], components: [{ type: i1.SmartTableFilterComponent, selector: "c-smart-table-filter", inputs: ["filterLabel", "filterPlaceholder", "value"], outputs: ["valueChange"] }, { type: i2.SmartTableHeadComponent, selector: "c-smart-table-head", inputs: ["columnFilter", "columnFilterState", "columnSorter", "component", "columns", "selectable", "selectAll", "sorterValue"], outputs: ["columnFilterStateChange", "sorterStateChange", "selectAllChange"] }, { type: i3.ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }, { type: i4.SmartPaginationComponent, selector: "c-smart-pagination", inputs: ["activePage", "arrows", "doubleArrows", "dots", "limit", "pages", "firstButton", "lastButton", "nextButton", "previousButton", "align", "size", "role"], outputs: ["activePageChange"], exportAs: ["cSmartPagination"] }, { type: i5.SmartTableItemsPerPageSelectorComponent, selector: "c-smart-table-items-per-page-selector", inputs: ["itemsPerPage", "itemsPerPageLabel", "itemsPerPageOptions"], outputs: ["itemsPerPageChange"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.ButtonDirective, selector: "[cButton]", inputs: ["active", "color", "disabled", "shape", "size", "type", "variant"], exportAs: ["cButton"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.TableDirective, selector: "table[cTable]", inputs: ["align", "borderColor", "bordered", "borderless", "caption", "color", "hover", "responsive", "small", "striped"] }, { type: i9.HtmlAttributesDirective, selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { type: i10.TableColorDirective, selector: "[cTableColor]", inputs: ["cTableColor"] }, { type: i11.AlignDirective, selector: "[cAlign]", inputs: ["cAlign"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i12.TableActiveDirective, selector: "[cTableActive]", inputs: ["cTableActive"] }, { type: i13.FormCheckInputDirective, selector: "input[cFormCheckInput]", inputs: ["type", "indeterminate", "valid"] }] });
372
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: SmartTableComponent, decorators: [{
373
+ type: Component,
374
+ args: [{ selector: 'c-smart-table', exportAs: 'cSmartTable', template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner\" class=\"row my-2 mx-0\">\r\n <ng-template [ngIf]=\"tableFilter || cleaner\">\r\n <div class=\"col-auto p-0\">\r\n <c-smart-table-filter\r\n (valueChange)=\"handleTableFilterChange($event)\"\r\n *ngIf=\"tableFilter\"\r\n [filterLabel]=\"tableFilterLabel\"\r\n [filterPlaceholder]=\"tableFilterPlaceholder\"\r\n [value]=\"tableFilterState\"\r\n >\r\n </c-smart-table-filter>\r\n </div>\r\n <div class=\"col-auto p-0\">\r\n <button\r\n (click)=\"clean($event)\"\r\n *ngIf=\"cleaner\"\r\n [disabled]=\"!isFiltered\"\r\n [ngClass]=\"{'ms-1': tableFilter}\"\r\n [tabindex]=\"0\"\r\n cButton\r\n color=\"transparent\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\"></ng-container>\r\n </button>\r\n </div>\r\n </ng-template>\r\n</div>\r\n<div class=\"position-relative\">\r\n <table [align]=\"tableProps?.align\"\r\n [borderColor]=\"tableProps?.borderColor\"\r\n [bordered]=\"tableProps?.bordered\"\r\n [borderless]=\"tableProps?.borderless\"\r\n [caption]=\"tableProps?.caption\"\r\n [color]=\"tableProps?.color\"\r\n [hover]=\"tableProps?.hover\"\r\n [responsive]=\"tableProps?.responsive\"\r\n [small]=\"tableProps?.small\"\r\n [striped]=\"tableProps?.striped\"\r\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableProps?.color\"\r\n cTable\r\n >\r\n <c-smart-table-head\r\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\r\n (selectAllChange)=\"handleSelectAllChange($event)\"\r\n (sorterStateChange)=\"handleSortChange($event)\"\r\n *ngIf=\"header\"\r\n [columnFilterState]=\"columnFilterState\"\r\n [columnFilter]=\"columnFilter\"\r\n [columns]=\"columns\"\r\n [selectAll]=\"selectedAll\"\r\n [selectable]=\"selectable\"\r\n [sorterValue]=\"sorterValue\"\r\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableHeadProps?.color\"\r\n [cAlign]=\"tableHeadProps?.align\"\r\n ></c-smart-table-head>\r\n\r\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\"></ng-container>\r\n\r\n <c-smart-table-head\r\n (selectAllChange)=\"handleSelectAllChange($event)\"\r\n (sorterStateChange)=\"handleSortChange($event)\"\r\n *ngIf=\"footer\"\r\n [columns]=\"columns\"\r\n [selectAll]=\"selectedAll\"\r\n [selectable]=\"selectable\"\r\n [sorterValue]=\"sorterValue\"\r\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableFootProps?.color\"\r\n [cAlign]=\"tableFootProps?.align\"\r\n component=\"tfoot\"\r\n ></c-smart-table-head>\r\n\r\n </table>\r\n <c-element-cover\r\n *ngIf=\"loading\"\r\n [boundaries]=\"[\r\n { sides: ['top'], query: 'td' },\r\n { sides: ['bottom'], query: 'tbody' }\r\n ]\"\r\n ></c-element-cover>\r\n</div>\r\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <c-smart-pagination\r\n (activePageChange)=\"setActivePage($event)\"\r\n *ngIf=\"pagination && numberOfPages > 1\"\r\n [activePage]=\"activePage\"\r\n [pages]=\"numberOfPages\">\r\n </c-smart-pagination>\r\n </div>\r\n <div class=\"col-auto ms-auto\">\r\n <c-smart-table-items-per-page-selector\r\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\r\n *ngIf=\"itemsPerPageSelect\"\r\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\r\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n >\r\n </c-smart-table-items-per-page-selector>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #tbodyDefaultTemplate>\r\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableBodyProps?.color\"\r\n [cAlign]=\"tableBodyProps?.align\"\r\n >\r\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\r\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\r\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\r\n (click)=\"handleRowClick({$event, item, i})\"\r\n [cTableActive]=\"item._props?.active\"\r\n [cTableColor]=\"item._props?.color\"\r\n [cAlign]=\"item._props?.align\"\r\n >\r\n <td *ngIf=\"selectable\"\r\n [cTableActive]=\"item?.['_cellProps']?._all?.active\"\r\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\r\n [cAlign]=\"item?.['_cellProps']?._all?.align\">\r\n <input (change)=\"handleRowChecked($event, item)\" [checked]=\"item._selected ?? false\" cFormCheckInput>\r\n </td>\r\n <ng-template ngFor let-columnName [ngForOf]=\"rawColumnNames\" let-i=\"index\" >\r\n <ng-container *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {item, columnName, tdContent: item[columnName] }\"></ng-container>\r\n </ng-template>\r\n </tr>\r\n <ng-template [ngIf]=\"templates['tableDetails']\">\r\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\r\n <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>\r\n <tr class=\"p-0\">\r\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\r\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\"></ng-container>\r\n </tbody>\r\n</ng-template>\r\n\r\n<ng-template #columnDefaultTemplate let-item=\"item\" let-columnName=\"columnName\" let-tdContent=\"tdContent\">\r\n <td\r\n [cTableActive]=\"item?.['_cellProps']?.[columnName]?.active ?? item?.['_cellProps']?._all?.active\"\r\n [cTableColor]=\"item?.['_cellProps']?.[columnName]?.color ?? item?.['_cellProps']?._all?.color\"\r\n [cAlign]=\"item?.['_cellProps']?.[columnName]?.align ?? item?.['_cellProps']?._all?.align\"\r\n >\r\n {{tdContent}}\r\n </td>\r\n</ng-template>\r\n\r\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\r\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\r\n<!-- <tr class=\"p-0\">-->\r\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\r\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\r\n<!-- </td>-->\r\n<!-- </tr>-->\r\n<!--</ng-template>-->\r\n\r\n<ng-template #noItemsDefaultTemplate>\r\n <tr *ngIf=\"!currentItems.length\">\r\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\r\n </tr>\r\n</ng-template>\r\n\r\n<!--todo: filterIconCustomTemplate-->\r\n<ng-template #filterIconTemplate>\r\n <svg class=\"icon icon-custom-size\" role=\"img\" viewBox=\"0 0 512 512\" width=\"18\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <polygon class=\"ci-primary\"\r\n fill=\"var(--ci-primary-color, currentColor)\"\r\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"></polygon>\r\n <polygon class=\"ci-primary\"\r\n fill=\"var(--ci-primary-color, currentColor)\"\r\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"></polygon>\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{display:block}\n"] }]
375
+ }], ctorParameters: function () { return [{ type: i0.IterableDiffers }]; }, propDecorators: { activePage: [{
376
+ type: Input
377
+ }], cleaner: [{
378
+ type: Input
379
+ }], clickableRows: [{
380
+ type: Input
381
+ }], columns: [{
382
+ type: Input
383
+ }], columnFilter: [{
384
+ type: Input
385
+ }], columnFilterValue: [{
386
+ type: Input
387
+ }], columnSorter: [{
388
+ type: Input
389
+ }], footer: [{
390
+ type: Input
391
+ }], header: [{
392
+ type: Input
393
+ }], items: [{
394
+ type: Input
395
+ }], itemsPerPage: [{
396
+ type: Input
397
+ }], itemsPerPageLabel: [{
398
+ type: Input
399
+ }], itemsPerPageOptions: [{
400
+ type: Input
401
+ }], itemsPerPageSelect: [{
402
+ type: Input
403
+ }], loading: [{
404
+ type: Input
405
+ }], noItemsLabel: [{
406
+ type: Input
407
+ }], pagination: [{
408
+ type: Input
409
+ }], selectable: [{
410
+ type: Input
411
+ }], sorterValue: [{
412
+ type: Input
413
+ }], tableFilter: [{
414
+ type: Input
415
+ }], tableFilterLabel: [{
416
+ type: Input
417
+ }], tableFilterPlaceholder: [{
418
+ type: Input
419
+ }], tableFilterValue: [{
420
+ type: Input
421
+ }], tableBodyProps: [{
422
+ type: Input
423
+ }], tableFootProps: [{
424
+ type: Input
425
+ }], tableHeadProps: [{
426
+ type: Input
427
+ }], tableProps: [{
428
+ type: Input
429
+ }], selectedItemsChange: [{
430
+ type: Output
431
+ }], sorterValueChange: [{
432
+ type: Output
433
+ }], activePageChange: [{
434
+ type: Output
435
+ }], itemsPerPageChange: [{
436
+ type: Output
437
+ }], rowClick: [{
438
+ type: Output
439
+ }], columnFilterValueChange: [{
440
+ type: Output
441
+ }], filteredItemsChange: [{
442
+ type: Output
443
+ }], tableFilterValueChange: [{
444
+ type: Output
445
+ }], columnTemplates: [{
446
+ type: ContentChildren,
447
+ args: [TemplateIdDirective]
448
+ }] } });
449
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbWFydC10YWJsZS9zbWFydC10YWJsZS9zbWFydC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUlQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsb0JBQW9CLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQWdCL0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFRbkQsTUFBTSxPQUFPLG1CQUFtQjtJQVc5QixZQUNVLFFBQXlCO1FBQXpCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBZTNCLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBU2hCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFTMUIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFzQmhDLHVCQUFrQixHQUF1QixFQUFFLENBQUM7UUFXNUMsWUFBTyxHQUFZLEtBQUssQ0FBQztRQVN6QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBU3pCLFdBQU0sR0FBb0IsRUFBZ0MsQ0FBQztRQVMzRCxrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUUxQixzQkFBaUIsR0FBVyxpQkFBaUIsQ0FBQztRQUM5Qyx3QkFBbUIsR0FBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBR2hELGlCQUFZLEdBQThCLGdC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LE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdGLFVBQVU7c0JBRGIsS0FBSztnQkFVRixVQUFVO3NCQURiLEtBQUs7Z0JBVUYsV0FBVztzQkFEZCxLQUFLO2dCQVVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFHRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBV0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFFK0IsZUFBZTtzQkFBcEQsZUFBZTt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgSXRlcmFibGVEaWZmZXIsXHJcbiAgSXRlcmFibGVEaWZmZXJzLFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVHlwZVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHksIE51bWJlcklucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuXHJcbmltcG9ydCB7IElUYWJsZSB9IGZyb20gJy4uLy4uL3RhYmxlL3RhYmxlLnR5cGUnO1xyXG5pbXBvcnQge1xyXG4gIElDb2x1bW4sXHJcbiAgSUNvbHVtbkZpbHRlcixcclxuICBJQ29sdW1uRmlsdGVyVmFsdWUsXHJcbiAgSUl0ZW0sXHJcbiAgSUl0ZW1JbnRlcm5hbCxcclxuICBJU21hcnRUYWJsZSxcclxuICBJU29ydGVyLFxyXG4gIElTb3J0ZXJWYWx1ZSxcclxuICBJVGFibGVGaWx0ZXIsXHJcbiAgSVRhYmxlR3JvdXBQcm9wcyxcclxuICBJdGVtc1BlclBhZ2VTZWxlY3RcclxufSBmcm9tICcuLi9zbWFydC10YWJsZS50eXBlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVJZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Mtc21hcnQtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zbWFydC10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc21hcnQtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBleHBvcnRBczogJ2NTbWFydFRhYmxlJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIElTbWFydFRhYmxlLCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2FjdGl2ZVBhZ2U6IE51bWJlcklucHV0O1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9jbGVhbmVyOiBCb29sZWFuSW5wdXQ7XHJcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2NsaWNrYWJsZVJvd3M6IEJvb2xlYW5JbnB1dDtcclxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZm9vdGVyOiBCb29sZWFuSW5wdXQ7XHJcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2hlYWRlcjogQm9vbGVhbklucHV0O1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9pdGVtc1BlclBhZ2U6IE51bWJlcklucHV0O1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9wYWdpbmF0aW9uOiBCb29sZWFuSW5wdXQ7XHJcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3NlbGVjdGFibGU6IEJvb2xlYW5JbnB1dDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGl0ZXJhYmxlOiBJdGVyYWJsZURpZmZlcnNcclxuICApIHtcclxuICAgIHRoaXMuaXRlcmFibGVEaWZmZXIgPSB0aGlzLml0ZXJhYmxlLmZpbmQodGhpcy5pdGVtcykuY3JlYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGl0ZXJhYmxlRGlmZmVyOiBJdGVyYWJsZURpZmZlcjxhbnk+IHwgbnVsbDtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYWN0aXZlUGFnZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9hY3RpdmVQYWdlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpIHx8IDE7XHJcbiAgICB0aGlzLmFjdGl2ZVBhZ2VDaGFuZ2UuZW1pdCh0aGlzLl9hY3RpdmVQYWdlKTtcclxuICB9XHJcbiAgZ2V0IGFjdGl2ZVBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQYWdlO1xyXG4gIH1cclxuICBwcml2YXRlIF9hY3RpdmVQYWdlID0gMTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgY2xlYW5lcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fY2xlYW5lciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG4gIGdldCBjbGVhbmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NsZWFuZXI7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NsZWFuZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgY2xpY2thYmxlUm93cyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fY2xpY2thYmxlUm93cyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG4gIGdldCBjbGlja2FibGVSb3dzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NsaWNrYWJsZVJvd3M7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NsaWNrYWJsZVJvd3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgY29sdW1ucyh2YWx1ZSkge1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXQgY29sdW1ucygpIHtcclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zIHx8IHRoaXMucmF3Q29sdW1uTmFtZXM7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NvbHVtbnM/OiAoc3RyaW5nIHwgSUNvbHVtbilbXTtcclxuXHJcbiAgQElucHV0KCkgY29sdW1uRmlsdGVyPzogYm9vbGVhbiB8IElDb2x1bW5GaWx0ZXI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNvbHVtbkZpbHRlclZhbHVlKHZhbHVlOiBJQ29sdW1uRmlsdGVyVmFsdWUpIHtcclxuICAgIHRoaXMuX2NvbHVtbkZpbHRlclZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLmNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlLmVtaXQoeyAuLi52YWx1ZSB9KTtcclxuICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy8gZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcclxuICB9XHJcbiAgZ2V0IGNvbHVtbkZpbHRlclZhbHVlKCk6IElDb2x1bW5GaWx0ZXJWYWx1ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRmlsdGVyVmFsdWU7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NvbHVtbkZpbHRlclZhbHVlOiBJQ29sdW1uRmlsdGVyVmFsdWUgPSB7fTtcclxuXHJcbiAgQElucHV0KCkgY29sdW1uU29ydGVyPzogYm9vbGVhbiB8IElTb3J0ZXI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGZvb3Rlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZm9vdGVyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcclxuICB9XHJcbiAgZ2V0IGZvb3RlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9mb290ZXI7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2Zvb3RlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBoZWFkZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2hlYWRlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG4gIGdldCBoZWFkZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyO1xyXG4gIH1cclxuICBwcml2YXRlIF9oZWFkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgaXRlbXModmFsdWU6IElJdGVtW10pIHtcclxuICAgIHRoaXMuX2l0ZW1zID0gdGhpcy5zZXRJdGVtcyh2YWx1ZSkgYXMgQXJyYXk8VHlwZTxJSXRlbUludGVybmFsPj47XHJcbiAgfVxyXG4gIGdldCBpdGVtcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9pdGVtcztcclxuICB9XHJcbiAgcHJpdmF0ZSBfaXRlbXM6IElJdGVtSW50ZXJuYWxbXSA9IFtdIGFzIEFycmF5PFR5cGU8SUl0ZW1JbnRlcm5hbD4+O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBpdGVtc1BlclBhZ2UodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5faXRlbXNQZXJQYWdlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpO1xyXG4gIH1cclxuICBnZXQgaXRlbXNQZXJQYWdlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXNQZXJQYWdlO1xyXG4gIH1cclxuICBwcml2YXRlIF9pdGVtc1BlclBhZ2U6IG51bWJlciA9IDEwO1xyXG5cclxuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VMYWJlbDogc3RyaW5nID0gJ0l0ZW1zIHBlciBwYWdlOic7XHJcbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlT3B0aW9uczogbnVtYmVyW10gPSBbNSwgMTAsIDIwLCA1MF07XHJcbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlU2VsZWN0PzogYm9vbGVhbiB8IEl0ZW1zUGVyUGFnZVNlbGVjdDtcclxuICBASW5wdXQoKSBsb2FkaW5nPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBub0l0ZW1zTGFiZWw6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4gPSAnTm8gaXRlbXMgZm91bmQnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBwYWdpbmF0aW9uKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9wYWdpbmF0aW9uID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcclxuICB9XHJcbiAgZ2V0IHBhZ2luYXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbjtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBzZWxlY3RhYmxlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zZWxlY3RhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcclxuICB9XHJcbiAgZ2V0IHNlbGVjdGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBzb3J0ZXJWYWx1ZSh2YWx1ZTogSVNvcnRlclZhbHVlKSB7XHJcbiAgICB0aGlzLl9zb3J0ZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5zb3J0ZXJWYWx1ZUNoYW5nZS5lbWl0KHsgLi4udmFsdWUgfSk7XHJcbiAgfVxyXG4gIGdldCBzb3J0ZXJWYWx1ZSgpOiBJU29ydGVyVmFsdWUge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvcnRlclZhbHVlO1xyXG4gIH1cclxuICBwcml2YXRlIF9zb3J0ZXJWYWx1ZTogSVNvcnRlclZhbHVlID0ge307XHJcblxyXG4gIEBJbnB1dCgpIHRhYmxlRmlsdGVyPzogYm9vbGVhbiB8IElUYWJsZUZpbHRlcjtcclxuICBASW5wdXQoKSB0YWJsZUZpbHRlckxhYmVsID0gJ0ZpbHRlcjonO1xyXG4gIEBJbnB1dCgpIHRhYmxlRmlsdGVyUGxhY2Vob2xkZXIgPSAndHlwZSBzdHJpbmcuLi4nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCB0YWJsZUZpbHRlclZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3RhYmxlRmlsdGVyVmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMudGFibGVGaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcclxuICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy8gZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcclxuICB9XHJcbiAgZ2V0IHRhYmxlRmlsdGVyVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZUZpbHRlclZhbHVlO1xyXG4gIH1cclxuICBwcml2YXRlIF90YWJsZUZpbHRlclZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgQElucHV0KCkgdGFibGVCb2R5UHJvcHM/OiBJVGFibGVHcm91cFByb3BzID0ge307XHJcbiAgQElucHV0KCkgdGFibGVGb290UHJvcHM/OiBJVGFibGVHcm91cFByb3BzID0ge307XHJcbiAgQElucHV0KCkgdGFibGVIZWFkUHJvcHM/OiBJVGFibGVHcm91cFByb3BzID0ge307XHJcbiAgQElucHV0KCkgdGFibGVQcm9wcz86IElUYWJsZSA9IHt9O1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc29ydGVyVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGFjdGl2ZVBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGl0ZW1zUGVyUGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSB0YWJsZUZpbHRlclZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlSWREaXJlY3RpdmUpIGNvbHVtblRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZUlkRGlyZWN0aXZlPjtcclxuICB0ZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogKFRlbXBsYXRlUmVmPGFueT4gfCBudWxsKSB9ID0geyB0YWJsZURldGFpbHM6IG51bGwsIHRhYmxlRGF0YTogbnVsbCB9O1xyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbHVtblRlbXBsYXRlcy5mb3JFYWNoKChjaGlsZDogVGVtcGxhdGVJZERpcmVjdGl2ZSkgPT4ge1xyXG4gICAgICB0aGlzLnRlbXBsYXRlc1tjaGlsZC5pZF0gPSBjaGlsZC50ZW1wbGF0ZVJlZjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQWxsKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IHRydWUpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkLmxlbmd0aCA9PT0gMCA/IGZhbHNlIDogc2VsZWN0ZWQubGVuZ3RoID09PSB0aGlzLml0ZW1zLmxlbmd0aCA/IHRydWUgOiAnaW5kZXRlcm1pbmF0ZSc7XHJcbiAgICAvLyByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBbGw7XHJcbiAgfVxyXG4gIHNldCBzZWxlY3RlZEFsbCh2YWx1ZSkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IHRydWUpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoc2VsZWN0ZWQpO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRBbGwgPSBzZWxlY3RlZC5sZW5ndGggPT09IDAgPyBmYWxzZSA6IHNlbGVjdGVkLmxlbmd0aCA9PT0gdGhpcy5pdGVtcy5sZW5ndGggPyB0cnVlIDogJ2luZGV0ZXJtaW5hdGUnO1xyXG4gIH1cclxuICBwcml2YXRlIF9zZWxlY3RlZEFsbDogKGJvb2xlYW4gfCBzdHJpbmcpID0gZmFsc2U7XHJcblxyXG4gIGdldCB0YWJsZUZpbHRlclN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA/IHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbHVtbkZpbHRlclN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uRmlsdGVyVmFsdWUgPyB0aGlzLmNvbHVtbkZpbHRlclZhbHVlIDoge307XHJcbiAgfVxyXG5cclxuICBnZXQgbnVtYmVyT2ZQYWdlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zUGVyUGFnZSA/IE1hdGguY2VpbCh0aGlzLnNvcnRlZEl0ZW1zLmxlbmd0aCAvIHRoaXMuX2l0ZW1zUGVyUGFnZSkgOiAxO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbHNwYW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RhYmxlID8gdGhpcy5yYXdDb2x1bW5OYW1lcy5sZW5ndGggKyAxIDogdGhpcy5yYXdDb2x1bW5OYW1lcy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQYWdlID8gKHRoaXMuX2FjdGl2ZVBhZ2UgLSAxKSAqIHRoaXMuX2l0ZW1zUGVyUGFnZSA6IDA7XHJcbiAgfVxyXG5cclxuICBnZXQgaXRlbXNPbkFjdGl2ZVBhZ2UoKTogSUl0ZW1JbnRlcm5hbFtdIHtcclxuICAgIHJldHVybiB0aGlzLnNvcnRlZEl0ZW1zLnNsaWNlKFxyXG4gICAgICB0aGlzLmZpcnN0SXRlbU9uQWN0aXZlUGFnZUluZGV4LFxyXG4gICAgICB0aGlzLmZpcnN0SXRlbU9uQWN0aXZlUGFnZUluZGV4ICsgdGhpcy5faXRlbXNQZXJQYWdlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbnRJdGVtcygpOiBJSXRlbUludGVybmFsW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVBhZ2UgPyB0aGlzLml0ZW1zT25BY3RpdmVQYWdlIDogdGhpcy5zb3J0ZWRJdGVtcyA/PyBbXTtcclxuICAgIC8vIHJldHVybiB0aGlzLml0ZW1zID8/IFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdlbkNvbHMoKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5faXRlbXMgPyB0aGlzLl9pdGVtc1swXSA/PyB7fSA6IHt9KS5maWx0ZXIoKGVsKSA9PiBlbC5jaGFyQXQoMCkgIT09ICdfJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgcmF3Q29sdW1uTmFtZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uc1xyXG4gICAgICA/IHRoaXMuX2NvbHVtbnMubWFwKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29sdW1uID09PSAnb2JqZWN0JykgcmV0dXJuIGNvbHVtbi5rZXk7XHJcbiAgICAgICAgZWxzZSByZXR1cm4gY29sdW1uO1xyXG4gICAgICB9KVxyXG4gICAgICA6IHRoaXMuZ2VuQ29scztcclxuICB9XHJcblxyXG4gIGdldCBpdGVtc0RhdGFDb2x1bW5zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmF3Q29sdW1uTmFtZXMuZmlsdGVyKChuYW1lKSA9PiB0aGlzLmdlbkNvbHMuaW5jbHVkZXMobmFtZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNvcnRlZEl0ZW1zKCk6IElJdGVtSW50ZXJuYWxbXSB7XHJcbiAgICBjb25zdCBjb2wgPSB0aGlzLnNvcnRlclZhbHVlLmNvbHVtbjtcclxuICAgIGlmIChcclxuICAgICAgIWNvbCB8fFxyXG4gICAgICAhdGhpcy5pdGVtc0RhdGFDb2x1bW5zLmluY2x1ZGVzKGNvbCkgfHxcclxuICAgICAgKHRoaXMuY29sdW1uU29ydGVyICYmXHJcbiAgICAgICAgdHlwZW9mIHRoaXMuY29sdW1uU29ydGVyID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICAgIHRoaXMuY29sdW1uU29ydGVyLmV4dGVybmFsKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyZWQ7XHJcbiAgICB9XHJcbiAgICAvL2lmIHZhbHVlcyBpbiBjb2x1bW4gYXJlIHRvIGJlIHNvcnRlZCBieSBudW1lcmljIHZhbHVlIHRoZXkgYWxsIGhhdmUgdG8gYmUgdHlwZSBudW1iZXJcclxuICAgIC8vIGNvbnN0IGZsaXAgPSBzb3J0ZXJTdGF0ZS5hc2MgPyAxIDogLTFcclxuICAgIGNvbnN0IGZsaXAgPSB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnYXNjJyA/IDEgOiB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnZGVzYycgPyAtMSA6IDA7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBjb25zdCBzb3J0ZWQgPSB0aGlzLnRhYmxlRmlsdGVyZWQuc2xpY2UoKS5zb3J0KChpdGVtOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0sIGl0ZW0yOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBpdGVtW2NvbF07XHJcbiAgICAgIGNvbnN0IHZhbHVlMiA9IGl0ZW0yW2NvbF07XHJcbiAgICAgIGNvbnN0IGEgPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IGIgPSB0eXBlb2YgdmFsdWUyID09PSAnbnVtYmVyJyA/IHZhbHVlMiA6IFN0cmluZyh2YWx1ZTIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIHJldHVybiBhID4gYiA/IDEgKiBmbGlwIDogYiA+IGEgPyAtMSAqIGZsaXAgOiAwO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc29ydGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbHVtbkZpbHRlcmVkKCk6IElJdGVtSW50ZXJuYWxbXSB7XHJcbiAgICBsZXQgX2l0ZW1zID0gdGhpcy5faXRlbXM7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY29sdW1uRmlsdGVyICYmXHJcbiAgICAgIHR5cGVvZiB0aGlzLmNvbHVtbkZpbHRlciA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgdGhpcy5jb2x1bW5GaWx0ZXIuZXh0ZXJuYWxcclxuICAgICkge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHJldHVybiBfaXRlbXM7XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLmNvbHVtbkZpbHRlclN0YXRlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgY29uc3QgY29sdW1uRmlsdGVyID0gU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBpZiAoY29sdW1uRmlsdGVyICYmIHRoaXMuaXRlbXNEYXRhQ29sdW1ucy5pbmNsdWRlcyhrZXkpKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiBTdHJpbmcoaXRlbVtrZXldKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGNvbHVtbkZpbHRlcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgcmV0dXJuIF9pdGVtcztcclxuICB9XHJcblxyXG4gIGdldCB0YWJsZUZpbHRlcmVkKCk6IElJdGVtSW50ZXJuYWxbXSB7XHJcbiAgICBsZXQgaXRlbXMgPSB0aGlzLmNvbHVtbkZpbHRlcmVkO1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy50YWJsZUZpbHRlclN0YXRlIHx8XHJcbiAgICAgICh0aGlzLnRhYmxlRmlsdGVyICYmIHR5cGVvZiB0aGlzLnRhYmxlRmlsdGVyID09PSAnb2JqZWN0JyAmJiB0aGlzLnRhYmxlRmlsdGVyLmV4dGVybmFsKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtc0NoYW5nZS5lbWl0KGl0ZW1zKTtcclxuICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy50YWJsZUZpbHRlclN0YXRlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCB2YWx1ZUNvbnRhaW5GaWx0ZXIgPSAodmFsOiBhbnkpID0+IFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKTtcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKChpdGVtOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcclxuICAgICAgcmV0dXJuICEhdGhpcy5pdGVtc0RhdGFDb2x1bW5zLmZpbmQoKGtleSkgPT4gdmFsdWVDb250YWluRmlsdGVyKGl0ZW1ba2V5XSkpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkSXRlbXNDaGFuZ2UuZW1pdChpdGVtcyk7XHJcbiAgICByZXR1cm4gaXRlbXM7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNGaWx0ZXJlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyU3RhdGUgfHwgdGhpcy5zb3J0ZXJWYWx1ZT8uY29sdW1uIHx8IE9iamVjdC52YWx1ZXModGhpcy5jb2x1bW5GaWx0ZXJTdGF0ZSkuam9pbignJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEl0ZW1zKGl0ZW1zOiBJSXRlbVtdKSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcclxuICAgICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbTogSUl0ZW0sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBfaWQ6IGluZGV4IH07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIDxJSXRlbUludGVybmFsPltdO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU29ydENoYW5nZSgkZXZlbnQ6IHsgY29sdW1uS2V5OiBzdHJpbmc7IGluZGV4OiBudW1iZXI7IH0pIHtcclxuICAgIHRoaXMuaGFuZGxlU29ydGVyQ2hhbmdlKCRldmVudC5jb2x1bW5LZXksICRldmVudC5pbmRleCk7XHJcbiAgfVxyXG5cclxuICBpc1NvcnRhYmxlKGk6IG51bWJlcik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgaXNEYXRhQ29sdW1uID0gdGhpcy5pdGVtc0RhdGFDb2x1bW5zLmluY2x1ZGVzKHRoaXMucmF3Q29sdW1uTmFtZXNbaV0pO1xyXG4gICAgbGV0IGNvbHVtbjtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMpIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuY29sdW1uU29ydGVyICYmXHJcbiAgICAgICghdGhpcy5jb2x1bW5zIHx8XHJcbiAgICAgICAgdHlwZW9mIGNvbHVtbiAhPT0gJ29iamVjdCcgfHxcclxuICAgICAgICAodHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgICAgICh0eXBlb2YgY29sdW1uLnNvcnRlciA9PT0gJ3VuZGVmaW5lZCcgfHwgY29sdW1uLnNvcnRlcikpKSAmJlxyXG4gICAgICBpc0RhdGFDb2x1bW5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTb3J0ZXJDaGFuZ2UoY29sdW1uOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc1NvcnRhYmxlKGluZGV4KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvL2lmIGNvbHVtbiBjaGFuZ2VkIG9yIHNvcnQgd2FzIGRlc2NlbmRpbmcgY2hhbmdlIGFzYyB0byB0cnVlXHJcbiAgICBjb25zdCBzdGF0ZSA9IHsgLi4udGhpcy5zb3J0ZXJWYWx1ZSB9O1xyXG5cclxuICAgIGlmIChzdGF0ZS5jb2x1bW4gPT09IGNvbHVtbikge1xyXG4gICAgICBpZiAoc3RhdGUuc3RhdGUgPT09IDApIHtcclxuICAgICAgICBzdGF0ZS5zdGF0ZSA9ICdhc2MnO1xyXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXRlID09PSAnYXNjJykge1xyXG4gICAgICAgIHN0YXRlLnN0YXRlID0gJ2Rlc2MnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb2x1bW5Tb3J0ZXIgPT09ICdvYmplY3QnICYmICF0aGlzLmNvbHVtblNvcnRlci5yZXNldGFibGUpIHtcclxuICAgICAgICAgIHN0YXRlLnN0YXRlID0gJ2FzYyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHN0YXRlLnN0YXRlID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0YXRlLmNvbHVtbiA9IGNvbHVtbjtcclxuICAgICAgc3RhdGUuc3RhdGUgPSAnYXNjJztcclxuICAgIH1cclxuICAgIHRoaXMuc29ydGVyVmFsdWUgPSB7IC4uLnN0YXRlIH07XHJcbiAgfVxyXG5cclxuICBzZXRBY3RpdmVQYWdlKCRldmVudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFjdGl2ZVBhZ2UgPSAkZXZlbnQ7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDb2x1bW5GaWx0ZXJDaGFuZ2UoJGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHsgY29sdW1uLCB2YWx1ZSB9ID0gJGV2ZW50O1xyXG4gICAgY29uc3QgaXNMYXp5ID0gdGhpcy5jb2x1bW5GaWx0ZXIgJiYgdHlwZW9mIHRoaXMuY29sdW1uRmlsdGVyID09PSAnb2JqZWN0JyAmJiB0aGlzLmNvbHVtbkZpbHRlci5sYXp5ID09PSB0cnVlO1xyXG4gICAgLy8gaWYgKChpc0xhenkgJiYgdHlwZSA9PT0gJ2lucHV0JykgfHwgKCFpc0xhenkgJiYgdHlwZSA9PT0gJ2NoYW5nZScpKSB7XHJcbiAgICBpZiAoaXNMYXp5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcclxuICAgIHRoaXMuY29sdW1uRmlsdGVyVmFsdWUgPSB7IC4uLnRoaXMuY29sdW1uRmlsdGVyVmFsdWUsIFtgJHtjb2x1bW59YF06IHZhbHVlIH07XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZUZpbHRlckNoYW5nZSgkZXZlbnQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgaXNMYXp5ID0gdGhpcy50YWJsZUZpbHRlciAmJiB0eXBlb2YgdGhpcy50YWJsZUZpbHRlciA9PT0gJ29iamVjdCcgJiYgdGhpcy50YWJsZUZpbHRlci5sYXp5ID09PSB0cnVlO1xyXG4gICAgLy8gaWYgKChpc0xhenkgJiYgdHlwZSA9PT0gJ2lucHV0JykgfHwgKCFpc0xhenkgJiYgdHlwZSA9PT0gJ2NoYW5nZScpKSB7XHJcbiAgICBpZiAoaXNMYXp5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcclxuICAgIHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA9ICRldmVudDtcclxuICB9XHJcblxyXG4gIGNsZWFuKCRldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA9IHt9O1xyXG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gJyc7XHJcbiAgICB0aGlzLnNvcnRlclZhbHVlID0ge307XHJcbiAgICB0aGlzLnRhYmxlRmlsdGVyZWQ7IC8vZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcclxuICB9XHJcblxyXG4gIGhhbmRsZUl0ZW1zUGVyUGFnZUNoYW5nZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2l0ZW1zUGVyUGFnZSkge1xyXG4gICAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XHJcbiAgICAgIHRoaXMuX2l0ZW1zUGVyUGFnZSA9IHZhbHVlO1xyXG4gICAgICB0aGlzLml0ZW1zUGVyUGFnZUNoYW5nZS5lbWl0KHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVJvd0NoZWNrZWQoJGV2ZW50OiBFdmVudCwgaXRlbTogSUl0ZW1JbnRlcm5hbCkge1xyXG4gICAgaXRlbS5fc2VsZWN0ZWQgPSAoJGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IHRydWUpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudDogYW55KSB7XHJcbiAgICB0aGlzLl9pdGVtcyA9IHRoaXMuaXRlbXMubWFwKChpdGVtOiBJSXRlbUludGVybmFsKSA9PiB7XHJcbiAgICAgIHJldHVybiB7IC4uLml0ZW0sIF9zZWxlY3RlZDogJGV2ZW50IH07XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRBbGwgPSAkZXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLyB0YWJsZURhdGFDZWxsUHJvcHMoaXRlbTogSUl0ZW0sIGNvbE5hbWU6IHN0cmluZykge1xyXG4gIC8vICAgY29uc3QgcHJvcHMgPSBpdGVtWydfY2VsbFByb3BzJ10gJiYge1xyXG4gIC8vICAgICAuLi4oaXRlbVsnX2NlbGxQcm9wcyddWydhbGwnXSAmJiB7IC4uLml0ZW1bJ19jZWxsUHJvcHMnXVsnYWxsJ10gfSksXHJcbiAgLy8gICAgIC4uLihpdGVtWydfY2VsbFByb3BzJ11bY29sTmFtZV0gJiYgeyAuLi5pdGVtWydfY2VsbFByb3BzJ11bY29sTmFtZV0gfSksXHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zb2xlLmxvZygndGFibGVEYXRhQ2VsbFByb3BzJywgcHJvcHMpXHJcbiAgLy8gICByZXR1cm4gcHJvcHNcclxuICAvLyB9XHJcblxyXG4gIGdldENvbHVtbk5hbWUoJGV2ZW50OiBNb3VzZUV2ZW50KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRhcmdldCA9ICRldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIGNvbnN0IGNsb3Nlc3QgPSB0YXJnZXQuY2xvc2VzdCgndHInKTtcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gY2xvc2VzdCA/IEFycmF5LmZyb20oY2xvc2VzdC5jaGlsZHJlbikgOiBbXTtcclxuICAgIGNvbnN0IGNsaWNrZWRDZWxsID0gY2hpbGRyZW4uZmlsdGVyKChjaGlsZCkgPT4gY2hpbGQuY29udGFpbnModGFyZ2V0KSlbMF07XHJcbiAgICByZXR1cm4gdGhpcy5yYXdDb2x1bW5OYW1lc1tjaGlsZHJlbi5pbmRleE9mKGNsaWNrZWRDZWxsKSAtICh0aGlzLl9zZWxlY3RhYmxlID8gMSA6IDApXTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVJvd0NsaWNrKHBhcmFtOiB7ICRldmVudDogTW91c2VFdmVudDsgaXRlbTogSUl0ZW1JbnRlcm5hbDsgaTogbnVtYmVyIH0pIHtcclxuICAgIGNvbnN0IHsgJGV2ZW50LCBpdGVtLCBpIH0gPSB7IC4uLnBhcmFtIH07XHJcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5nZXRDb2x1bW5OYW1lKHBhcmFtLiRldmVudCk7XHJcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyBpdGVtOiBpdGVtLCBpbmRleDogaSArIHRoaXMuZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgsIGNvbHVtbk5hbWUsIGV2ZW50OiAkZXZlbnQgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgKm5nSWY9XCJpdGVtc1BlclBhZ2VTZWxlY3QgfHwgdGFibGVGaWx0ZXIgfHwgY2xlYW5lclwiIGNsYXNzPVwicm93IG15LTIgbXgtMFwiPlxyXG4gIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ0YWJsZUZpbHRlciB8fCBjbGVhbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wXCI+XHJcbiAgICAgIDxjLXNtYXJ0LXRhYmxlLWZpbHRlclxyXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVUYWJsZUZpbHRlckNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAqbmdJZj1cInRhYmxlRmlsdGVyXCJcclxuICAgICAgICBbZmlsdGVyTGFiZWxdPVwidGFibGVGaWx0ZXJMYWJlbFwiXHJcbiAgICAgICAgW2ZpbHRlclBsYWNlaG9sZGVyXT1cInRhYmxlRmlsdGVyUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJ0YWJsZUZpbHRlclN0YXRlXCJcclxuICAgICAgPlxyXG4gICAgICA8L2Mtc21hcnQtdGFibGUtZmlsdGVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wXCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAoY2xpY2spPVwiY2xlYW4oJGV2ZW50KVwiXHJcbiAgICAgICAgKm5nSWY9XCJjbGVhbmVyXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRmlsdGVyZWRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnbXMtMSc6IHRhYmxlRmlsdGVyfVwiXHJcbiAgICAgICAgW3RhYmluZGV4XT1cIjBcIlxyXG4gICAgICAgIGNCdXR0b25cclxuICAgICAgICBjb2xvcj1cInRyYW5zcGFyZW50XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWx0ZXJJY29uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgPHRhYmxlIFthbGlnbl09XCJ0YWJsZVByb3BzPy5hbGlnblwiXHJcbiAgICAgICAgIFtib3JkZXJDb2xvcl09XCJ0YWJsZVByb3BzPy5ib3JkZXJDb2xvclwiXHJcbiAgICAgICAgIFtib3JkZXJlZF09XCJ0YWJsZVByb3BzPy5ib3JkZXJlZFwiXHJcbiAgICAgICAgIFtib3JkZXJsZXNzXT1cInRhYmxlUHJvcHM/LmJvcmRlcmxlc3NcIlxyXG4gICAgICAgICBbY2FwdGlvbl09XCJ0YWJsZVByb3BzPy5jYXB0aW9uXCJcclxuICAgICAgICAgW2NvbG9yXT1cInRhYmxlUHJvcHM/LmNvbG9yXCJcclxuICAgICAgICAgW2hvdmVyXT1cInRhYmxlUHJvcHM/LmhvdmVyXCJcclxuICAgICAgICAgW3Jlc3BvbnNpdmVdPVwidGFibGVQcm9wcz8ucmVzcG9uc2l2ZVwiXHJcbiAgICAgICAgIFtzbWFsbF09XCJ0YWJsZVByb3BzPy5zbWFsbFwiXHJcbiAgICAgICAgIFtzdHJpcGVkXT1cInRhYmxlUHJvcHM/LnN0cmlwZWRcIlxyXG4gICAgICAgICBbY0h0bWxBdHRyXT1cInRhYmxlUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxyXG4gICAgICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVQcm9wcz8uY29sb3JcIlxyXG4gICAgICAgICBjVGFibGVcclxuICA+XHJcbiAgICA8Yy1zbWFydC10YWJsZS1oZWFkXHJcbiAgICAgIChjb2x1bW5GaWx0ZXJTdGF0ZUNoYW5nZSk9XCJoYW5kbGVDb2x1bW5GaWx0ZXJDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAoc29ydGVyU3RhdGVDaGFuZ2UpPVwiaGFuZGxlU29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgKm5nSWY9XCJoZWFkZXJcIlxyXG4gICAgICBbY29sdW1uRmlsdGVyU3RhdGVdPVwiY29sdW1uRmlsdGVyU3RhdGVcIlxyXG4gICAgICBbY29sdW1uRmlsdGVyXT1cImNvbHVtbkZpbHRlclwiXHJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICBbc2VsZWN0QWxsXT1cInNlbGVjdGVkQWxsXCJcclxuICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXHJcbiAgICAgIFtzb3J0ZXJWYWx1ZV09XCJzb3J0ZXJWYWx1ZVwiXHJcbiAgICAgIFtjSHRtbEF0dHJdPVwidGFibGVIZWFkUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxyXG4gICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVIZWFkUHJvcHM/LmNvbG9yXCJcclxuICAgICAgW2NBbGlnbl09XCJ0YWJsZUhlYWRQcm9wcz8uYWxpZ25cIlxyXG4gICAgPjwvYy1zbWFydC10YWJsZS1oZWFkPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0Ym9keURlZmF1bHRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxjLXNtYXJ0LXRhYmxlLWhlYWRcclxuICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJoYW5kbGVTZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgIChzb3J0ZXJTdGF0ZUNoYW5nZSk9XCJoYW5kbGVTb3J0Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAqbmdJZj1cImZvb3RlclwiXHJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICBbc2VsZWN0QWxsXT1cInNlbGVjdGVkQWxsXCJcclxuICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXHJcbiAgICAgIFtzb3J0ZXJWYWx1ZV09XCJzb3J0ZXJWYWx1ZVwiXHJcbiAgICAgIFtjSHRtbEF0dHJdPVwidGFibGVGb290UHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxyXG4gICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVGb290UHJvcHM/LmNvbG9yXCJcclxuICAgICAgW2NBbGlnbl09XCJ0YWJsZUZvb3RQcm9wcz8uYWxpZ25cIlxyXG4gICAgICBjb21wb25lbnQ9XCJ0Zm9vdFwiXHJcbiAgICA+PC9jLXNtYXJ0LXRhYmxlLWhlYWQ+XHJcblxyXG4gIDwvdGFibGU+XHJcbiAgPGMtZWxlbWVudC1jb3ZlclxyXG4gICAgKm5nSWY9XCJsb2FkaW5nXCJcclxuICAgIFtib3VuZGFyaWVzXT1cIltcclxuICAgICAgeyBzaWRlczogWyd0b3AnXSwgcXVlcnk6ICd0ZCcgfSxcclxuICAgICAgeyBzaWRlczogWydib3R0b20nXSwgcXVlcnk6ICd0Ym9keScgfVxyXG4gICAgXVwiXHJcbiAgPjwvYy1lbGVtZW50LWNvdmVyPlxyXG48L2Rpdj5cclxuPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInBhZ2luYXRpb24gfHwgaXRlbXNQZXJQYWdlU2VsZWN0XCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICA8Yy1zbWFydC1wYWdpbmF0aW9uXHJcbiAgICAgICAgKGFjdGl2ZVBhZ2VDaGFuZ2UpPVwic2V0QWN0aXZlUGFnZSgkZXZlbnQpXCJcclxuICAgICAgICAqbmdJZj1cInBhZ2luYXRpb24gJiYgbnVtYmVyT2ZQYWdlcyA+IDFcIlxyXG4gICAgICAgIFthY3RpdmVQYWdlXT1cImFjdGl2ZVBhZ2VcIlxyXG4gICAgICAgIFtwYWdlc109XCJudW1iZXJPZlBhZ2VzXCI+XHJcbiAgICAgIDwvYy1zbWFydC1wYWdpbmF0aW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXMtYXV0b1wiPlxyXG4gICAgICA8Yy1zbWFydC10YWJsZS1pdGVtcy1wZXItcGFnZS1zZWxlY3RvclxyXG4gICAgICAgIChpdGVtc1BlclBhZ2VDaGFuZ2UpPVwiaGFuZGxlSXRlbXNQZXJQYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICpuZ0lmPVwiaXRlbXNQZXJQYWdlU2VsZWN0XCJcclxuICAgICAgICBbaXRlbXNQZXJQYWdlTGFiZWxdPVwiaXRlbXNQZXJQYWdlTGFiZWxcIlxyXG4gICAgICAgIFtpdGVtc1BlclBhZ2VPcHRpb25zXT1cIml0ZW1zUGVyUGFnZU9wdGlvbnNcIlxyXG4gICAgICAgIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCJcclxuICAgICAgPlxyXG4gICAgICA8L2Mtc21hcnQtdGFibGUtaXRlbXMtcGVyLXBhZ2Utc2VsZWN0b3I+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdGJvZHlEZWZhdWx0VGVtcGxhdGU+XHJcbiAgPHRib2R5IFtjSHRtbEF0dHJdPVwidGFibGVCb2R5UHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxyXG4gICAgICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVCb2R5UHJvcHM/LmNvbG9yXCJcclxuICAgICAgICAgW2NBbGlnbl09XCJ0YWJsZUJvZHlQcm9wcz8uYWxpZ25cIlxyXG4gID5cclxuICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPVwiY3VycmVudEl0ZW1zXCIgbGV0LWNudD1cImNvdW50XCIgbGV0LWk9XCJpbmRleFwiIGxldC1pc0V2ZW49XCJldmVuXCIgbGV0LWlzT2RkPVwib2RkXCI+XHJcbiAgICA8dHIgW3RhYmluZGV4XT1cImNsaWNrYWJsZVJvd3MgPyAwIDogLTFcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntjdXJzb3I6IGNsaWNrYWJsZVJvd3MgPyAncG9pbnRlcicgOiAnYXV0byd9XCJcclxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlUm93Q2xpY2soeyRldmVudCwgaXRlbSwgaX0pXCJcclxuICAgICAgICBbY1RhYmxlQWN0aXZlXT1cIml0ZW0uX3Byb3BzPy5hY3RpdmVcIlxyXG4gICAgICAgIFtjVGFibGVDb2xvcl09XCJpdGVtLl9wcm9wcz8uY29sb3JcIlxyXG4gICAgICAgIFtjQWxpZ25dPVwiaXRlbS5fcHJvcHM/LmFsaWduXCJcclxuICAgID5cclxuICAgICAgPHRkICpuZ0lmPVwic2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICBbY1RhYmxlQWN0aXZlXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5hY3RpdmVcIlxyXG4gICAgICAgICAgW2NUYWJsZUNvbG9yXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5jb2xvclwiXHJcbiAgICAgICAgICBbY0FsaWduXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5hbGlnblwiPlxyXG4gICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwiaGFuZGxlUm93Q2hlY2tlZCgkZXZlbnQsIGl0ZW0pXCIgW2NoZWNrZWRdPVwiaXRlbS5fc2VsZWN0ZWQgPz8gZmFsc2VcIiBjRm9ybUNoZWNrSW5wdXQ+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY29sdW1uTmFtZSBbbmdGb3JPZl09XCJyYXdDb2x1bW5OYW1lc1wiIGxldC1pPVwiaW5kZXhcIiA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVEYXRhJ10gfHwgY29sdW1uRGVmYXVsdFRlbXBsYXRlOyBjb250ZXh0OiB7aXRlbSwgY29sdW1uTmFtZSwgdGRDb250ZW50OiBpdGVtW2NvbHVtbk5hbWVdIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvdHI+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidGVtcGxhdGVzWyd0YWJsZURldGFpbHMnXVwiPlxyXG4gICAgICA8IS0tICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0RldGFpbHNEZWZhdWx0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj4tLT5cclxuICAgICAgPHRyPjx0ZCBbY29sU3Bhbl09XCJjb2xzcGFuXCIgY2xhc3M9XCJwLTBcIiB0YWJpbmRleD1cIi0xXCIgW25nU3R5bGVdPVwie2JvcmRlckJvdHRvbVdpZHRoOiAwfVwiPjwvdGQ+PC90cj5cclxuICAgICAgPHRyIGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIFtuZ1N0eWxlXT1cIntib3JkZXI6IDB9XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVzWyd0YWJsZURldGFpbHMnXTsgY29udGV4dDoge2l0ZW0sIGluZGV4OiBpfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vSXRlbXNEZWZhdWx0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICA8L3Rib2R5PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNjb2x1bW5EZWZhdWx0VGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWNvbHVtbk5hbWU9XCJjb2x1bW5OYW1lXCIgbGV0LXRkQ29udGVudD1cInRkQ29udGVudFwiPlxyXG4gIDx0ZFxyXG4gICAgW2NUYWJsZUFjdGl2ZV09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uW2NvbHVtbk5hbWVdPy5hY3RpdmUgPz8gaXRlbT8uWydfY2VsbFByb3BzJ10/Ll9hbGw/LmFjdGl2ZVwiXHJcbiAgICBbY1RhYmxlQ29sb3JdPVwiaXRlbT8uWydfY2VsbFByb3BzJ10/Lltjb2x1bW5OYW1lXT8uY29sb3IgPz8gaXRlbT8uWydfY2VsbFByb3BzJ10/Ll9hbGw/LmNvbG9yXCJcclxuICAgIFtjQWxpZ25dPVwiaXRlbT8uWydfY2VsbFByb3BzJ10/Lltjb2x1bW5OYW1lXT8uYWxpZ24gPz8gaXRlbT8uWydfY2VsbFByb3BzJ10/Ll9hbGw/LmFsaWduXCJcclxuICA+XHJcbiAgICB7e3RkQ29udGVudH19XHJcbiAgPC90ZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS08bmctdGVtcGxhdGUgI3Jvd0RldGFpbHNEZWZhdWx0VGVtcGxhdGUgbGV0LWl0ZW0gbGV0LWluZGV4Pi0tPlxyXG48IS0tICA8dHI+PHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIHRhYmluZGV4PVwiLTFcIiBbbmdTdHlsZV09XCJ7Ym9yZGVyQm90dG9tV2lkdGg6IDB9XCI+PC90ZD48L3RyPi0tPlxyXG48IS0tICA8dHIgY2xhc3M9XCJwLTBcIj4tLT5cclxuPCEtLSAgICA8dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIGNsYXNzPVwicC0wXCIgW25nU3R5bGVdPVwie2JvcmRlcjogMH1cIj4tLT5cclxuPCEtLSAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXM/LnRhYmxlRGV0YWlsc1wiPjwvbmctY29udGFpbmVyPi0tPlxyXG48IS0tICAgIDwvdGQ+LS0+XHJcbjwhLS0gIDwvdHI+LS0+XHJcbjwhLS08L25nLXRlbXBsYXRlPi0tPlxyXG5cclxuPG5nLXRlbXBsYXRlICNub0l0ZW1zRGVmYXVsdFRlbXBsYXRlPlxyXG4gIDx0ciAqbmdJZj1cIiFjdXJyZW50SXRlbXMubGVuZ3RoXCI+XHJcbiAgICA8dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIGNsYXNzPVwianVzdGlmeS1jb250ZW50LWNlbnRlclwiPnt7bm9JdGVtc0xhYmVsfX08L3RkPlxyXG4gIDwvdHI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tdG9kbzogZmlsdGVySWNvbkN1c3RvbVRlbXBsYXRlLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZmlsdGVySWNvblRlbXBsYXRlPlxyXG4gIDxzdmcgY2xhc3M9XCJpY29uIGljb24tY3VzdG9tLXNpemVcIiByb2xlPVwiaW1nXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCIgd2lkdGg9XCIxOFwiXHJcbiAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICA8cG9seWdvbiBjbGFzcz1cImNpLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgZmlsbD1cInZhcigtLWNpLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcilcIlxyXG4gICAgICAgICAgICAgcG9pbnRzPVwiNDAgMTYgNDAgNTMuODI4IDEwOS4wMjQgMTM2IDE1MC44MTUgMTM2IDc2Ljg5NiA0OCA0NTkuNTEgNDggMzA0IDI0Mi4zODggMzA0IDQwMS4zNzMgMjQxLjM3MyA0NjQgMjQwIDQ2NCAyNDAgMzY4IDIwOCAzNjggMjA4IDQ5NiAyNTQuNjI3IDQ5NiAzMzYgNDE0LjYyNyAzMzYgMjUzLjYxMiA0OTYgNTMuNjEyIDQ5NiAxNiA0MCAxNlwiPjwvcG9seWdvbj5cclxuICAgIDxwb2x5Z29uIGNsYXNzPVwiY2ktcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICBmaWxsPVwidmFyKC0tY2ktcHJpbWFyeS1jb2xvciwgY3VycmVudENvbG9yKVwiXHJcbiAgICAgICAgICAgICBwb2ludHM9XCIxNjYuNDAzIDI0OC4yMjUgMjI2Ljg2NCAxODcuNzYzIDIwNC4yMzcgMTY1LjEzNSAxNDMuNzc1IDIyNS41OTcgODMuMzEzIDE2NS4xMzUgNjAuNjg3IDE4Ny43NjMgMTIxLjE0OCAyNDguMjI1IDYwLjY4NyAzMDguNjg3IDgzLjMxMyAzMzEuMzE0IDE0My43NzUgMjcwLjg1MiAyMDQuMjM3IDMzMS4zMTQgMjI2Ljg2NCAzMDguNjg3IDE2Ni40MDMgMjQ4LjIyNVwiPjwvcG9seWdvbj5cclxuICA8L3N2Zz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19