@pepperi-addons/ngx-lib 0.3.15-loader.9 → 0.4.0-angular14.11

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 (1370) hide show
  1. package/address/address.component.d.ts +30 -27
  2. package/address/address.module.d.ts +15 -2
  3. package/address/index.d.ts +5 -0
  4. package/address/public-api.d.ts +2 -2
  5. package/attachment/attachment.component.d.ts +85 -82
  6. package/attachment/attachment.module.d.ts +14 -2
  7. package/attachment/index.d.ts +5 -0
  8. package/attachment/public-api.d.ts +2 -2
  9. package/bread-crumbs/bread-crumbs.component.d.ts +27 -23
  10. package/bread-crumbs/bread-crumbs.model.d.ts +11 -11
  11. package/bread-crumbs/bread-crumbs.module.d.ts +15 -5
  12. package/bread-crumbs/index.d.ts +5 -0
  13. package/bread-crumbs/public-api.d.ts +3 -3
  14. package/button/button.component.d.ts +102 -99
  15. package/button/button.model.d.ts +14 -14
  16. package/button/button.module.d.ts +13 -2
  17. package/button/index.d.ts +5 -0
  18. package/button/public-api.d.ts +3 -3
  19. package/carousel/carousel-item.directive.d.ts +12 -9
  20. package/carousel/carousel.component.d.ts +148 -145
  21. package/carousel/carousel.module.d.ts +8 -2
  22. package/carousel/index.d.ts +5 -0
  23. package/carousel/public-api.d.ts +3 -3
  24. package/checkbox/checkbox.component.d.ts +50 -47
  25. package/checkbox/checkbox.module.d.ts +19 -5
  26. package/checkbox/index.d.ts +5 -0
  27. package/checkbox/public-api.d.ts +2 -2
  28. package/color/color-picker.component.d.ts +57 -54
  29. package/color/color.component.d.ts +30 -27
  30. package/color/color.model.d.ts +1 -1
  31. package/color/color.module.d.ts +26 -5
  32. package/color/index.d.ts +5 -0
  33. package/color/public-api.d.ts +3 -3
  34. package/core/clipboard/clipboard.directive.d.ts +5 -2
  35. package/core/clipboard/clipboard.service.d.ts +5 -2
  36. package/core/clipboard/index.d.ts +1 -1
  37. package/core/clipboard/public-api.d.ts +2 -2
  38. package/core/common/directives/auto-width.directive.d.ts +19 -16
  39. package/core/common/directives/button-blur.directive.d.ts +9 -6
  40. package/core/common/directives/button-loader.directive.d.ts +26 -23
  41. package/core/common/directives/data-qa.directive.d.ts +11 -8
  42. package/core/common/directives/index.d.ts +1 -1
  43. package/core/common/directives/menu-blur.directive.d.ts +10 -7
  44. package/core/common/directives/prevent-multi-click.directive.d.ts +7 -4
  45. package/core/common/directives/print.directive.d.ts +75 -72
  46. package/core/common/directives/public-api.d.ts +7 -7
  47. package/core/common/index.d.ts +1 -1
  48. package/core/common/model/index.d.ts +1 -1
  49. package/core/common/model/papi.model.d.ts +2 -2
  50. package/core/common/model/public-api.d.ts +3 -3
  51. package/core/common/model/utilities.model.d.ts +5 -5
  52. package/core/common/model/wapi.model.d.ts +200 -200
  53. package/core/common/pipes/common-pipes.d.ts +57 -36
  54. package/core/common/pipes/date-ago.pipe.d.ts +11 -8
  55. package/core/common/pipes/index.d.ts +1 -1
  56. package/core/common/pipes/public-api.d.ts +2 -2
  57. package/core/common/public-api.d.ts +4 -4
  58. package/core/common/services/addon.service.d.ts +41 -38
  59. package/core/common/services/color.service.d.ts +51 -48
  60. package/core/common/services/cookie.service.d.ts +53 -50
  61. package/core/common/services/data-convertor.service.d.ts +44 -41
  62. package/core/common/services/file.service.d.ts +27 -24
  63. package/core/common/services/index.d.ts +1 -1
  64. package/core/common/services/jwt-helper.service.d.ts +13 -10
  65. package/core/common/services/public-api.d.ts +11 -11
  66. package/core/common/services/session.service.d.ts +18 -15
  67. package/core/common/services/translate.service.d.ts +12 -9
  68. package/core/common/services/utilities.service.d.ts +36 -33
  69. package/core/common/services/validator.service.d.ts +31 -28
  70. package/core/common/services/window-scrolling.service.d.ts +10 -7
  71. package/core/customization/customization.model.d.ts +264 -264
  72. package/core/customization/customization.service.d.ts +159 -156
  73. package/core/customization/index.d.ts +1 -1
  74. package/core/customization/public-api.d.ts +2 -2
  75. package/core/http/index.d.ts +1 -1
  76. package/core/http/interceptors/error.interceptor.d.ts +8 -5
  77. package/core/http/interceptors/index.d.ts +11 -11
  78. package/core/http/interceptors/loader.interceptor.d.ts +11 -8
  79. package/core/http/interceptors/profiler.interceptor.d.ts +8 -5
  80. package/core/http/public-api.d.ts +2 -2
  81. package/core/http/services/http.service.d.ts +28 -25
  82. package/core/http/services/loader.service.d.ts +13 -10
  83. package/core/index.d.ts +1 -1
  84. package/core/layout/index.d.ts +1 -1
  85. package/core/layout/layout.service.d.ts +36 -33
  86. package/core/layout/public-api.d.ts +2 -2
  87. package/core/layout/rtl.directive.d.ts +21 -16
  88. package/core/portal/attach.directive.d.ts +13 -10
  89. package/core/portal/index.d.ts +1 -1
  90. package/core/portal/portal.service.d.ts +12 -9
  91. package/core/portal/public-api.d.ts +3 -3
  92. package/core/portal/target.directive.d.ts +12 -9
  93. package/core/public-api.d.ts +7 -7
  94. package/core/scroll-to/index.d.ts +1 -1
  95. package/core/scroll-to/public-api.d.ts +1 -1
  96. package/core/scroll-to/scroll-to.service.d.ts +11 -8
  97. package/date/date.component.d.ts +69 -66
  98. package/date/date.model.d.ts +31 -26
  99. package/date/date.module.d.ts +23 -5
  100. package/date/index.d.ts +5 -0
  101. package/date/public-api.d.ts +2 -2
  102. package/dialog/default-dialog.component.d.ts +12 -9
  103. package/dialog/dialog.component.d.ts +13 -10
  104. package/dialog/dialog.model.d.ts +31 -31
  105. package/dialog/dialog.module.d.ts +18 -5
  106. package/dialog/dialog.service.d.ts +27 -24
  107. package/dialog/index.d.ts +5 -0
  108. package/dialog/public-api.d.ts +4 -4
  109. package/draggable-items/draggable-item/draggable-item.component.d.ts +11 -8
  110. package/draggable-items/draggable-items.component.d.ts +36 -33
  111. package/draggable-items/draggable-items.model.d.ts +11 -11
  112. package/draggable-items/draggable-items.module.d.ts +18 -5
  113. package/draggable-items/index.d.ts +5 -0
  114. package/draggable-items/public-api.d.ts +4 -4
  115. package/esm2020/address/address.component.mjs +109 -0
  116. package/esm2020/address/address.module.mjs +54 -0
  117. package/esm2020/address/pepperi-addons-ngx-lib-address.mjs +5 -0
  118. package/esm2020/address/public-api.mjs +6 -0
  119. package/esm2020/attachment/attachment.component.mjs +220 -0
  120. package/esm2020/attachment/attachment.module.mjs +50 -0
  121. package/esm2020/attachment/pepperi-addons-ngx-lib-attachment.mjs +5 -0
  122. package/esm2020/attachment/public-api.mjs +6 -0
  123. package/esm2020/bread-crumbs/bread-crumbs.component.mjs +85 -0
  124. package/esm2020/bread-crumbs/bread-crumbs.model.mjs +7 -0
  125. package/esm2020/bread-crumbs/bread-crumbs.module.mjs +50 -0
  126. package/esm2020/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.mjs +5 -0
  127. package/esm2020/bread-crumbs/public-api.mjs +7 -0
  128. package/esm2020/button/button.component.mjs +138 -0
  129. package/esm2020/button/button.model.mjs +6 -0
  130. package/esm2020/button/button.module.mjs +46 -0
  131. package/esm2020/button/pepperi-addons-ngx-lib-button.mjs +5 -0
  132. package/esm2020/button/public-api.mjs +7 -0
  133. package/esm2020/carousel/carousel-item.directive.mjs +33 -0
  134. package/esm2020/carousel/carousel.component.mjs +745 -0
  135. package/esm2020/carousel/carousel.module.mjs +17 -0
  136. package/esm2020/carousel/pepperi-addons-ngx-lib-carousel.mjs +5 -0
  137. package/esm2020/carousel/public-api.mjs +8 -0
  138. package/esm2020/checkbox/checkbox.component.mjs +168 -0
  139. package/esm2020/checkbox/checkbox.module.mjs +63 -0
  140. package/esm2020/checkbox/pepperi-addons-ngx-lib-checkbox.mjs +5 -0
  141. package/esm2020/checkbox/public-api.mjs +6 -0
  142. package/esm2020/color/color-picker.component.mjs +224 -0
  143. package/esm2020/color/color.component.mjs +90 -0
  144. package/esm2020/color/color.model.mjs +2 -0
  145. package/esm2020/color/color.module.mjs +93 -0
  146. package/esm2020/color/pepperi-addons-ngx-lib-color.mjs +5 -0
  147. package/esm2020/color/public-api.mjs +7 -0
  148. package/esm2020/core/clipboard/clipboard.directive.mjs +24 -0
  149. package/esm2020/core/clipboard/clipboard.service.mjs +14 -0
  150. package/esm2020/core/clipboard/index.mjs +5 -0
  151. package/esm2020/core/clipboard/public-api.mjs +6 -0
  152. package/esm2020/core/common/directives/auto-width.directive.mjs +77 -0
  153. package/esm2020/core/common/directives/button-blur.directive.mjs +24 -0
  154. package/esm2020/core/common/directives/button-loader.directive.mjs +112 -0
  155. package/esm2020/core/common/directives/data-qa.directive.mjs +23 -0
  156. package/esm2020/core/common/directives/index.mjs +5 -0
  157. package/esm2020/core/common/directives/menu-blur.directive.mjs +32 -0
  158. package/esm2020/core/common/directives/prevent-multi-click.directive.mjs +27 -0
  159. package/esm2020/core/common/directives/print.directive.mjs +170 -0
  160. package/esm2020/core/common/directives/public-api.mjs +12 -0
  161. package/esm2020/core/common/index.mjs +5 -0
  162. package/esm2020/core/common/model/index.mjs +5 -0
  163. package/esm2020/core/common/model/papi.model.mjs +3 -0
  164. package/esm2020/core/common/model/public-api.mjs +7 -0
  165. package/esm2020/core/common/model/utilities.model.mjs +57 -0
  166. package/esm2020/core/common/model/wapi.model.mjs +156 -0
  167. package/esm2020/core/common/pipes/common-pipes.mjs +167 -0
  168. package/esm2020/core/common/pipes/date-ago.pipe.mjs +46 -0
  169. package/esm2020/core/common/pipes/index.mjs +5 -0
  170. package/esm2020/core/common/pipes/public-api.mjs +6 -0
  171. package/esm2020/core/common/public-api.mjs +8 -0
  172. package/esm2020/core/common/services/addon.service.mjs +148 -0
  173. package/esm2020/core/common/services/color.service.mjs +359 -0
  174. package/esm2020/core/common/services/cookie.service.mjs +153 -0
  175. package/esm2020/core/common/services/data-convertor.service.mjs +119 -0
  176. package/esm2020/core/common/services/file.service.mjs +213 -0
  177. package/esm2020/core/common/services/index.mjs +5 -0
  178. package/esm2020/core/common/services/jwt-helper.service.mjs +106 -0
  179. package/esm2020/core/common/services/public-api.mjs +15 -0
  180. package/esm2020/core/common/services/session.service.mjs +71 -0
  181. package/esm2020/core/common/services/translate.service.mjs +46 -0
  182. package/esm2020/core/common/services/utilities.service.mjs +210 -0
  183. package/esm2020/core/common/services/validator.service.mjs +272 -0
  184. package/esm2020/core/common/services/window-scrolling.service.mjs +36 -0
  185. package/esm2020/core/customization/customization.model.mjs +289 -0
  186. package/esm2020/core/customization/customization.service.mjs +771 -0
  187. package/esm2020/core/customization/index.mjs +5 -0
  188. package/esm2020/core/customization/public-api.mjs +6 -0
  189. package/esm2020/core/http/index.mjs +5 -0
  190. package/esm2020/core/http/interceptors/error.interceptor.mjs +27 -0
  191. package/esm2020/core/http/interceptors/index.mjs +24 -0
  192. package/esm2020/core/http/interceptors/loader.interceptor.mjs +33 -0
  193. package/esm2020/core/http/interceptors/profiler.interceptor.mjs +32 -0
  194. package/esm2020/core/http/public-api.mjs +6 -0
  195. package/esm2020/core/http/services/http.service.mjs +155 -0
  196. package/esm2020/core/http/services/loader.service.mjs +50 -0
  197. package/esm2020/core/index.mjs +5 -0
  198. package/esm2020/core/layout/index.mjs +5 -0
  199. package/esm2020/core/layout/layout.service.mjs +168 -0
  200. package/esm2020/core/layout/public-api.mjs +6 -0
  201. package/esm2020/core/layout/rtl.directive.mjs +44 -0
  202. package/esm2020/core/portal/attach.directive.mjs +27 -0
  203. package/esm2020/core/portal/index.mjs +5 -0
  204. package/esm2020/core/portal/portal.service.mjs +36 -0
  205. package/esm2020/core/portal/public-api.mjs +7 -0
  206. package/esm2020/core/portal/target.directive.mjs +24 -0
  207. package/esm2020/core/public-api.mjs +11 -0
  208. package/esm2020/core/scroll-to/index.mjs +5 -0
  209. package/esm2020/core/scroll-to/public-api.mjs +6 -0
  210. package/esm2020/core/scroll-to/scroll-to.service.mjs +84 -0
  211. package/esm2020/date/date.component.mjs +295 -0
  212. package/esm2020/date/date.model.mjs +54 -0
  213. package/esm2020/date/date.module.mjs +88 -0
  214. package/esm2020/date/pepperi-addons-ngx-lib-date.mjs +5 -0
  215. package/esm2020/date/public-api.mjs +6 -0
  216. package/esm2020/dialog/default-dialog.component.mjs +37 -0
  217. package/esm2020/dialog/dialog.component.mjs +36 -0
  218. package/esm2020/dialog/dialog.model.mjs +33 -0
  219. package/esm2020/dialog/dialog.module.mjs +59 -0
  220. package/esm2020/dialog/dialog.service.mjs +82 -0
  221. package/esm2020/dialog/pepperi-addons-ngx-lib-dialog.mjs +5 -0
  222. package/esm2020/dialog/public-api.mjs +8 -0
  223. package/esm2020/draggable-items/draggable-item/draggable-item.component.mjs +27 -0
  224. package/esm2020/draggable-items/draggable-items.component.mjs +102 -0
  225. package/esm2020/draggable-items/draggable-items.model.mjs +2 -0
  226. package/esm2020/draggable-items/draggable-items.module.mjs +60 -0
  227. package/esm2020/draggable-items/pepperi-addons-ngx-lib-draggable-items.mjs +5 -0
  228. package/esm2020/draggable-items/public-api.mjs +8 -0
  229. package/esm2020/field-title/field-title.component.mjs +42 -0
  230. package/esm2020/field-title/field-title.module.mjs +47 -0
  231. package/esm2020/field-title/pepperi-addons-ngx-lib-field-title.mjs +5 -0
  232. package/esm2020/field-title/public-api.mjs +6 -0
  233. package/esm2020/files-uploader/files-uploader.component.mjs +241 -0
  234. package/esm2020/files-uploader/files-uploader.module.mjs +79 -0
  235. package/esm2020/files-uploader/pepperi-addons-ngx-lib-files-uploader.mjs +5 -0
  236. package/esm2020/files-uploader/public-api.mjs +6 -0
  237. package/esm2020/form/field-generator.component.mjs +153 -0
  238. package/esm2020/form/form.component.mjs +1218 -0
  239. package/esm2020/form/form.model.mjs +2 -0
  240. package/esm2020/form/form.module.mjs +176 -0
  241. package/esm2020/form/indicators.component.mjs +23 -0
  242. package/esm2020/form/internal-button.component.mjs +184 -0
  243. package/esm2020/form/internal-carusel.component.mjs +117 -0
  244. package/esm2020/form/internal-carusel.service.mjs +32 -0
  245. package/esm2020/form/internal-field-generator.component.mjs +147 -0
  246. package/esm2020/form/internal-form.component.mjs +1214 -0
  247. package/esm2020/form/internal-list.component.mjs +510 -0
  248. package/esm2020/form/internal-menu.component.mjs +66 -0
  249. package/esm2020/form/internal-page.component.mjs +362 -0
  250. package/esm2020/form/internal-page.service.mjs +120 -0
  251. package/esm2020/form/pepperi-addons-ngx-lib-form.mjs +5 -0
  252. package/esm2020/form/public-api.mjs +7 -0
  253. package/esm2020/group-buttons/group-buttons.component.mjs +67 -0
  254. package/esm2020/group-buttons/group-buttons.module.mjs +59 -0
  255. package/esm2020/group-buttons/pepperi-addons-ngx-lib-group-buttons.mjs +5 -0
  256. package/esm2020/group-buttons/public-api.mjs +6 -0
  257. package/esm2020/icon/icon-generated-all.model.mjs +101 -0
  258. package/esm2020/icon/icon-generated.model.mjs +390 -0
  259. package/esm2020/icon/icon-registry.service.mjs +26 -0
  260. package/esm2020/icon/icon.component.mjs +91 -0
  261. package/esm2020/icon/icon.module.mjs +20 -0
  262. package/esm2020/icon/icon.service.mjs +31 -0
  263. package/esm2020/icon/pepperi-addons-ngx-lib-icon.mjs +5 -0
  264. package/esm2020/icon/public-api.mjs +11 -0
  265. package/esm2020/image/image.component.mjs +247 -0
  266. package/esm2020/image/image.module.mjs +74 -0
  267. package/esm2020/image/image.service.mjs +52 -0
  268. package/esm2020/image/pepperi-addons-ngx-lib-image.mjs +5 -0
  269. package/esm2020/image/public-api.mjs +7 -0
  270. package/esm2020/images-filmstrip/images-filmstrip.component.mjs +425 -0
  271. package/esm2020/images-filmstrip/images-filmstrip.module.mjs +138 -0
  272. package/esm2020/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.mjs +5 -0
  273. package/esm2020/images-filmstrip/public-api.mjs +6 -0
  274. package/esm2020/link/link.component.mjs +339 -0
  275. package/esm2020/link/link.module.mjs +80 -0
  276. package/esm2020/link/link.pipes.mjs +18 -0
  277. package/esm2020/link/pepperi-addons-ngx-lib-link.mjs +5 -0
  278. package/esm2020/link/public-api.mjs +6 -0
  279. package/esm2020/list/list-actions.component.mjs +44 -0
  280. package/esm2020/list/list-carousel.component.mjs +107 -0
  281. package/esm2020/list/list-chooser.component.mjs +64 -0
  282. package/esm2020/list/list-pager.component.mjs +120 -0
  283. package/esm2020/list/list-sorting.component.mjs +61 -0
  284. package/esm2020/list/list-total.component.mjs +30 -0
  285. package/esm2020/list/list-views.component.mjs +85 -0
  286. package/esm2020/list/list.component.mjs +1160 -0
  287. package/esm2020/list/list.model.mjs +4 -0
  288. package/esm2020/list/list.module.mjs +144 -0
  289. package/esm2020/list/list.pipes.mjs +47 -0
  290. package/esm2020/list/pepperi-addons-ngx-lib-list.mjs +5 -0
  291. package/esm2020/list/public-api.mjs +15 -0
  292. package/esm2020/list/virtual-scroller.mjs +1071 -0
  293. package/esm2020/menu/menu-item.component.mjs +115 -0
  294. package/esm2020/menu/menu.component.mjs +205 -0
  295. package/esm2020/menu/menu.model.mjs +19 -0
  296. package/esm2020/menu/menu.module.mjs +59 -0
  297. package/esm2020/menu/pepperi-addons-ngx-lib-menu.mjs +5 -0
  298. package/esm2020/menu/public-api.mjs +7 -0
  299. package/esm2020/ngx-lib.module.mjs +158 -0
  300. package/esm2020/page-layout/page-layout.component.mjs +35 -0
  301. package/esm2020/page-layout/page-layout.module.mjs +34 -0
  302. package/esm2020/page-layout/pepperi-addons-ngx-lib-page-layout.mjs +5 -0
  303. package/esm2020/page-layout/public-api.mjs +6 -0
  304. package/esm2020/pepperi-addons-ngx-lib.mjs +5 -0
  305. package/esm2020/plugin/pepperi-addons-ngx-lib-plugin.mjs +5 -0
  306. package/esm2020/plugin/plugin-proxy.component.mjs +97 -0
  307. package/esm2020/plugin/plugin.model.mjs +2 -0
  308. package/esm2020/plugin/public-api.mjs +6 -0
  309. package/esm2020/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.mjs +5 -0
  310. package/esm2020/profile-data-views-list/profile-data-view/profile-data-view.component.mjs +45 -0
  311. package/esm2020/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.mjs +65 -0
  312. package/esm2020/profile-data-views-list/profile-data-views-list.component.mjs +95 -0
  313. package/esm2020/profile-data-views-list/profile-data-views-list.model.mjs +2 -0
  314. package/esm2020/profile-data-views-list/profile-data-views-list.module.mjs +88 -0
  315. package/esm2020/profile-data-views-list/public-api.mjs +9 -0
  316. package/esm2020/public-api.mjs +6 -0
  317. package/esm2020/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.mjs +5 -0
  318. package/esm2020/quantity-selector/public-api.mjs +6 -0
  319. package/esm2020/quantity-selector/quantity-selector-validation.directive.mjs +47 -0
  320. package/esm2020/quantity-selector/quantity-selector.component.mjs +511 -0
  321. package/esm2020/quantity-selector/quantity-selector.module.mjs +82 -0
  322. package/esm2020/quantity-selector/quantity-selector.pipes.mjs +23 -0
  323. package/esm2020/query-builder/common/model/field.mjs +2 -0
  324. package/esm2020/query-builder/common/model/filter.mjs +2 -0
  325. package/esm2020/query-builder/common/model/legacy.mjs +2 -0
  326. package/esm2020/query-builder/common/model/operator-unit.mjs +42 -0
  327. package/esm2020/query-builder/common/model/operator.mjs +266 -0
  328. package/esm2020/query-builder/common/model/structure.mjs +2 -0
  329. package/esm2020/query-builder/common/model/type-map.mjs +27 -0
  330. package/esm2020/query-builder/common/model/type.mjs +6 -0
  331. package/esm2020/query-builder/common/services/output-query.service.mjs +114 -0
  332. package/esm2020/query-builder/common/services/query-structure.service.mjs +226 -0
  333. package/esm2020/query-builder/common/services/type-convertor.service.mjs +42 -0
  334. package/esm2020/query-builder/pepperi-addons-ngx-lib-query-builder.mjs +5 -0
  335. package/esm2020/query-builder/public-api.mjs +9 -0
  336. package/esm2020/query-builder/query-builder-item/query-builder-item.component.mjs +125 -0
  337. package/esm2020/query-builder/query-builder-section/query-builder-section.component.mjs +71 -0
  338. package/esm2020/query-builder/query-builder.component.mjs +110 -0
  339. package/esm2020/query-builder/query-builder.module.mjs +59 -0
  340. package/esm2020/query-builder/query-builder.service.mjs +102 -0
  341. package/esm2020/remote-loader/addon-block-loader.component.mjs +84 -0
  342. package/esm2020/remote-loader/addon-block-loader.service.mjs +61 -0
  343. package/esm2020/remote-loader/pepperi-addons-ngx-lib-remote-loader.mjs +5 -0
  344. package/esm2020/remote-loader/public-api.mjs +10 -0
  345. package/esm2020/remote-loader/remote-loader.component.mjs +137 -0
  346. package/esm2020/remote-loader/remote-loader.model.mjs +2 -0
  347. package/esm2020/remote-loader/remote-loader.module.mjs +60 -0
  348. package/esm2020/remote-loader/remote-loader.service.mjs +57 -0
  349. package/esm2020/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.mjs +5 -0
  350. package/esm2020/rich-html-textarea/public-api.mjs +6 -0
  351. package/esm2020/rich-html-textarea/rich-html-textarea.component.mjs +245 -0
  352. package/esm2020/rich-html-textarea/rich-html-textarea.module.mjs +95 -0
  353. package/esm2020/search/pepperi-addons-ngx-lib-search.mjs +5 -0
  354. package/esm2020/search/public-api.mjs +7 -0
  355. package/esm2020/search/search.component.mjs +317 -0
  356. package/esm2020/search/search.model.mjs +2 -0
  357. package/esm2020/search/search.module.mjs +70 -0
  358. package/esm2020/select/pepperi-addons-ngx-lib-select.mjs +5 -0
  359. package/esm2020/select/public-api.mjs +6 -0
  360. package/esm2020/select/select.component.mjs +238 -0
  361. package/esm2020/select/select.module.mjs +70 -0
  362. package/esm2020/separator/pepperi-addons-ngx-lib-separator.mjs +5 -0
  363. package/esm2020/separator/public-api.mjs +6 -0
  364. package/esm2020/separator/separator.component.mjs +63 -0
  365. package/esm2020/separator/separator.module.mjs +18 -0
  366. package/esm2020/side-bar/pepperi-addons-ngx-lib-side-bar.mjs +5 -0
  367. package/esm2020/side-bar/public-api.mjs +7 -0
  368. package/esm2020/side-bar/side-bar.component.mjs +138 -0
  369. package/esm2020/side-bar/side-bar.model.mjs +2 -0
  370. package/esm2020/side-bar/side-bar.module.mjs +51 -0
  371. package/esm2020/signature/pepperi-addons-ngx-lib-signature.mjs +5 -0
  372. package/esm2020/signature/public-api.mjs +6 -0
  373. package/esm2020/signature/signature.component.mjs +254 -0
  374. package/esm2020/signature/signature.module.mjs +90 -0
  375. package/esm2020/size-detector/pepperi-addons-ngx-lib-size-detector.mjs +5 -0
  376. package/esm2020/size-detector/public-api.mjs +6 -0
  377. package/esm2020/size-detector/size-detector.component.mjs +92 -0
  378. package/esm2020/size-detector/size-detector.module.mjs +35 -0
  379. package/esm2020/slider/pepperi-addons-ngx-lib-slider.mjs +5 -0
  380. package/esm2020/slider/public-api.mjs +6 -0
  381. package/esm2020/slider/slider.component.mjs +101 -0
  382. package/esm2020/slider/slider.module.mjs +42 -0
  383. package/esm2020/smart-filters/boolean-filter/boolean-filter.component.mjs +75 -0
  384. package/esm2020/smart-filters/common/filter-actions.component.mjs +29 -0
  385. package/esm2020/smart-filters/common/model/base-filter-component.mjs +295 -0
  386. package/esm2020/smart-filters/common/model/creator.mjs +76 -0
  387. package/esm2020/smart-filters/common/model/field.mjs +117 -0
  388. package/esm2020/smart-filters/common/model/filter.mjs +2 -0
  389. package/esm2020/smart-filters/common/model/operator.mjs +271 -0
  390. package/esm2020/smart-filters/common/model/type.mjs +2 -0
  391. package/esm2020/smart-filters/date-filter/date-filter.component.mjs +172 -0
  392. package/esm2020/smart-filters/multi-select-filter/multi-select-filter.component.mjs +200 -0
  393. package/esm2020/smart-filters/number-filter/number-filter.component.mjs +116 -0
  394. package/esm2020/smart-filters/pepperi-addons-ngx-lib-smart-filters.mjs +5 -0
  395. package/esm2020/smart-filters/public-api.mjs +19 -0
  396. package/esm2020/smart-filters/smart-filters.component.mjs +141 -0
  397. package/esm2020/smart-filters/smart-filters.module.mjs +158 -0
  398. package/esm2020/smart-filters/text-filter/text-filter.component.mjs +92 -0
  399. package/esm2020/snack-bar/default-snack-bar.component.mjs +29 -0
  400. package/esm2020/snack-bar/pepperi-addons-ngx-lib-snack-bar.mjs +5 -0
  401. package/esm2020/snack-bar/public-api.mjs +8 -0
  402. package/esm2020/snack-bar/snack-bar.component.mjs +26 -0
  403. package/esm2020/snack-bar/snack-bar.model.mjs +7 -0
  404. package/esm2020/snack-bar/snack-bar.module.mjs +63 -0
  405. package/esm2020/snack-bar/snack-bar.service.mjs +60 -0
  406. package/esm2020/textarea/pepperi-addons-ngx-lib-textarea.mjs +5 -0
  407. package/esm2020/textarea/public-api.mjs +6 -0
  408. package/esm2020/textarea/textarea.component.mjs +182 -0
  409. package/esm2020/textarea/textarea.module.mjs +82 -0
  410. package/esm2020/textbox/pepperi-addons-ngx-lib-textbox.mjs +5 -0
  411. package/esm2020/textbox/public-api.mjs +6 -0
  412. package/esm2020/textbox/textbox-validation.directive.mjs +89 -0
  413. package/esm2020/textbox/textbox.component.mjs +442 -0
  414. package/esm2020/textbox/textbox.module.mjs +72 -0
  415. package/esm2020/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.mjs +5 -0
  416. package/esm2020/textbox-icon/public-api.mjs +6 -0
  417. package/esm2020/textbox-icon/textbox-icon.component.mjs +48 -0
  418. package/esm2020/textbox-icon/textbox-icon.module.mjs +64 -0
  419. package/esm2020/top-bar/pepperi-addons-ngx-lib-top-bar.mjs +5 -0
  420. package/esm2020/top-bar/public-api.mjs +7 -0
  421. package/esm2020/top-bar/top-bar.component.mjs +112 -0
  422. package/esm2020/top-bar/top-bar.model.mjs +2 -0
  423. package/esm2020/top-bar/top-bar.module.mjs +62 -0
  424. package/fesm2015/pepperi-addons-ngx-lib-address.mjs +170 -0
  425. package/fesm2015/pepperi-addons-ngx-lib-address.mjs.map +1 -0
  426. package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs +277 -0
  427. package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs.map +1 -0
  428. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs +147 -0
  429. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs.map +1 -0
  430. package/fesm2015/pepperi-addons-ngx-lib-button.mjs +197 -0
  431. package/fesm2015/pepperi-addons-ngx-lib-button.mjs.map +1 -0
  432. package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs +804 -0
  433. package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs.map +1 -0
  434. package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs +237 -0
  435. package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs.map +1 -0
  436. package/fesm2015/pepperi-addons-ngx-lib-color.mjs +404 -0
  437. package/fesm2015/pepperi-addons-ngx-lib-color.mjs.map +1 -0
  438. package/fesm2015/pepperi-addons-ngx-lib-date.mjs +441 -0
  439. package/fesm2015/pepperi-addons-ngx-lib-date.mjs.map +1 -0
  440. package/fesm2015/pepperi-addons-ngx-lib-dialog.mjs +242 -0
  441. package/fesm2015/pepperi-addons-ngx-lib-dialog.mjs.map +1 -0
  442. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs +192 -0
  443. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs.map +1 -0
  444. package/fesm2015/pepperi-addons-ngx-lib-field-title.mjs +96 -0
  445. package/fesm2015/pepperi-addons-ngx-lib-field-title.mjs.map +1 -0
  446. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs +326 -0
  447. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs.map +1 -0
  448. package/fesm2015/pepperi-addons-ngx-lib-form.mjs +4204 -0
  449. package/fesm2015/pepperi-addons-ngx-lib-form.mjs.map +1 -0
  450. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs +132 -0
  451. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs.map +1 -0
  452. package/fesm2015/pepperi-addons-ngx-lib-icon.mjs +661 -0
  453. package/fesm2015/pepperi-addons-ngx-lib-icon.mjs.map +1 -0
  454. package/fesm2015/pepperi-addons-ngx-lib-image.mjs +374 -0
  455. package/fesm2015/pepperi-addons-ngx-lib-image.mjs.map +1 -0
  456. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs +552 -0
  457. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs.map +1 -0
  458. package/fesm2015/pepperi-addons-ngx-lib-link.mjs +438 -0
  459. package/fesm2015/pepperi-addons-ngx-lib-link.mjs.map +1 -0
  460. package/fesm2015/pepperi-addons-ngx-lib-list.mjs +2896 -0
  461. package/fesm2015/pepperi-addons-ngx-lib-list.mjs.map +1 -0
  462. package/fesm2015/pepperi-addons-ngx-lib-menu.mjs +391 -0
  463. package/fesm2015/pepperi-addons-ngx-lib-menu.mjs.map +1 -0
  464. package/fesm2015/pepperi-addons-ngx-lib-page-layout.mjs +77 -0
  465. package/fesm2015/pepperi-addons-ngx-lib-page-layout.mjs.map +1 -0
  466. package/fesm2015/pepperi-addons-ngx-lib-plugin.mjs +114 -0
  467. package/fesm2015/pepperi-addons-ngx-lib-plugin.mjs.map +1 -0
  468. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs +289 -0
  469. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs.map +1 -0
  470. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.mjs +662 -0
  471. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.mjs.map +1 -0
  472. package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs +1167 -0
  473. package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs.map +1 -0
  474. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs +404 -0
  475. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs.map +1 -0
  476. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs +344 -0
  477. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs.map +1 -0
  478. package/fesm2015/pepperi-addons-ngx-lib-search.mjs +393 -0
  479. package/fesm2015/pepperi-addons-ngx-lib-search.mjs.map +1 -0
  480. package/fesm2015/pepperi-addons-ngx-lib-select.mjs +314 -0
  481. package/fesm2015/pepperi-addons-ngx-lib-select.mjs.map +1 -0
  482. package/fesm2015/pepperi-addons-ngx-lib-separator.mjs +89 -0
  483. package/fesm2015/pepperi-addons-ngx-lib-separator.mjs.map +1 -0
  484. package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs +194 -0
  485. package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs.map +1 -0
  486. package/fesm2015/pepperi-addons-ngx-lib-signature.mjs +350 -0
  487. package/fesm2015/pepperi-addons-ngx-lib-signature.mjs.map +1 -0
  488. package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs +134 -0
  489. package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs.map +1 -0
  490. package/fesm2015/pepperi-addons-ngx-lib-slider.mjs +151 -0
  491. package/fesm2015/pepperi-addons-ngx-lib-slider.mjs.map +1 -0
  492. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs +1676 -0
  493. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -0
  494. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs +183 -0
  495. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs.map +1 -0
  496. package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs +271 -0
  497. package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs.map +1 -0
  498. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.mjs +118 -0
  499. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.mjs.map +1 -0
  500. package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs +604 -0
  501. package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs.map +1 -0
  502. package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs +180 -0
  503. package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs.map +1 -0
  504. package/fesm2015/pepperi-addons-ngx-lib.mjs +4579 -0
  505. package/fesm2015/pepperi-addons-ngx-lib.mjs.map +1 -0
  506. package/fesm2020/pepperi-addons-ngx-lib-address.mjs +170 -0
  507. package/fesm2020/pepperi-addons-ngx-lib-address.mjs.map +1 -0
  508. package/fesm2020/pepperi-addons-ngx-lib-attachment.mjs +277 -0
  509. package/fesm2020/pepperi-addons-ngx-lib-attachment.mjs.map +1 -0
  510. package/fesm2020/pepperi-addons-ngx-lib-bread-crumbs.mjs +147 -0
  511. package/fesm2020/pepperi-addons-ngx-lib-bread-crumbs.mjs.map +1 -0
  512. package/fesm2020/pepperi-addons-ngx-lib-button.mjs +197 -0
  513. package/fesm2020/pepperi-addons-ngx-lib-button.mjs.map +1 -0
  514. package/fesm2020/pepperi-addons-ngx-lib-carousel.mjs +800 -0
  515. package/fesm2020/pepperi-addons-ngx-lib-carousel.mjs.map +1 -0
  516. package/fesm2020/pepperi-addons-ngx-lib-checkbox.mjs +237 -0
  517. package/fesm2020/pepperi-addons-ngx-lib-checkbox.mjs.map +1 -0
  518. package/fesm2020/pepperi-addons-ngx-lib-color.mjs +401 -0
  519. package/fesm2020/pepperi-addons-ngx-lib-color.mjs.map +1 -0
  520. package/fesm2020/pepperi-addons-ngx-lib-date.mjs +437 -0
  521. package/fesm2020/pepperi-addons-ngx-lib-date.mjs.map +1 -0
  522. package/fesm2020/pepperi-addons-ngx-lib-dialog.mjs +237 -0
  523. package/fesm2020/pepperi-addons-ngx-lib-dialog.mjs.map +1 -0
  524. package/fesm2020/pepperi-addons-ngx-lib-draggable-items.mjs +191 -0
  525. package/fesm2020/pepperi-addons-ngx-lib-draggable-items.mjs.map +1 -0
  526. package/fesm2020/pepperi-addons-ngx-lib-field-title.mjs +96 -0
  527. package/fesm2020/pepperi-addons-ngx-lib-field-title.mjs.map +1 -0
  528. package/fesm2020/pepperi-addons-ngx-lib-files-uploader.mjs +323 -0
  529. package/fesm2020/pepperi-addons-ngx-lib-files-uploader.mjs.map +1 -0
  530. package/fesm2020/pepperi-addons-ngx-lib-form.mjs +4200 -0
  531. package/fesm2020/pepperi-addons-ngx-lib-form.mjs.map +1 -0
  532. package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs +132 -0
  533. package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs.map +1 -0
  534. package/fesm2020/pepperi-addons-ngx-lib-icon.mjs +659 -0
  535. package/fesm2020/pepperi-addons-ngx-lib-icon.mjs.map +1 -0
  536. package/fesm2020/pepperi-addons-ngx-lib-image.mjs +372 -0
  537. package/fesm2020/pepperi-addons-ngx-lib-image.mjs.map +1 -0
  538. package/fesm2020/pepperi-addons-ngx-lib-images-filmstrip.mjs +549 -0
  539. package/fesm2020/pepperi-addons-ngx-lib-images-filmstrip.mjs.map +1 -0
  540. package/fesm2020/pepperi-addons-ngx-lib-link.mjs +438 -0
  541. package/fesm2020/pepperi-addons-ngx-lib-link.mjs.map +1 -0
  542. package/fesm2020/pepperi-addons-ngx-lib-list.mjs +2882 -0
  543. package/fesm2020/pepperi-addons-ngx-lib-list.mjs.map +1 -0
  544. package/fesm2020/pepperi-addons-ngx-lib-menu.mjs +391 -0
  545. package/fesm2020/pepperi-addons-ngx-lib-menu.mjs.map +1 -0
  546. package/fesm2020/pepperi-addons-ngx-lib-page-layout.mjs +77 -0
  547. package/fesm2020/pepperi-addons-ngx-lib-page-layout.mjs.map +1 -0
  548. package/fesm2020/pepperi-addons-ngx-lib-plugin.mjs +108 -0
  549. package/fesm2020/pepperi-addons-ngx-lib-plugin.mjs.map +1 -0
  550. package/fesm2020/pepperi-addons-ngx-lib-profile-data-views-list.mjs +288 -0
  551. package/fesm2020/pepperi-addons-ngx-lib-profile-data-views-list.mjs.map +1 -0
  552. package/fesm2020/pepperi-addons-ngx-lib-quantity-selector.mjs +661 -0
  553. package/fesm2020/pepperi-addons-ngx-lib-quantity-selector.mjs.map +1 -0
  554. package/fesm2020/pepperi-addons-ngx-lib-query-builder.mjs +1156 -0
  555. package/fesm2020/pepperi-addons-ngx-lib-query-builder.mjs.map +1 -0
  556. package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs +393 -0
  557. package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs.map +1 -0
  558. package/fesm2020/pepperi-addons-ngx-lib-rich-html-textarea.mjs +344 -0
  559. package/fesm2020/pepperi-addons-ngx-lib-rich-html-textarea.mjs.map +1 -0
  560. package/fesm2020/pepperi-addons-ngx-lib-search.mjs +392 -0
  561. package/fesm2020/pepperi-addons-ngx-lib-search.mjs.map +1 -0
  562. package/fesm2020/pepperi-addons-ngx-lib-select.mjs +314 -0
  563. package/fesm2020/pepperi-addons-ngx-lib-select.mjs.map +1 -0
  564. package/fesm2020/pepperi-addons-ngx-lib-separator.mjs +89 -0
  565. package/fesm2020/pepperi-addons-ngx-lib-separator.mjs.map +1 -0
  566. package/fesm2020/pepperi-addons-ngx-lib-side-bar.mjs +194 -0
  567. package/fesm2020/pepperi-addons-ngx-lib-side-bar.mjs.map +1 -0
  568. package/fesm2020/pepperi-addons-ngx-lib-signature.mjs +350 -0
  569. package/fesm2020/pepperi-addons-ngx-lib-signature.mjs.map +1 -0
  570. package/fesm2020/pepperi-addons-ngx-lib-size-detector.mjs +134 -0
  571. package/fesm2020/pepperi-addons-ngx-lib-size-detector.mjs.map +1 -0
  572. package/fesm2020/pepperi-addons-ngx-lib-slider.mjs +150 -0
  573. package/fesm2020/pepperi-addons-ngx-lib-slider.mjs.map +1 -0
  574. package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs +1669 -0
  575. package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -0
  576. package/fesm2020/pepperi-addons-ngx-lib-snack-bar.mjs +180 -0
  577. package/fesm2020/pepperi-addons-ngx-lib-snack-bar.mjs.map +1 -0
  578. package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs +270 -0
  579. package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs.map +1 -0
  580. package/fesm2020/pepperi-addons-ngx-lib-textbox-icon.mjs +118 -0
  581. package/fesm2020/pepperi-addons-ngx-lib-textbox-icon.mjs.map +1 -0
  582. package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs +604 -0
  583. package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs.map +1 -0
  584. package/fesm2020/pepperi-addons-ngx-lib-top-bar.mjs +179 -0
  585. package/fesm2020/pepperi-addons-ngx-lib-top-bar.mjs.map +1 -0
  586. package/fesm2020/pepperi-addons-ngx-lib.mjs +4561 -0
  587. package/fesm2020/pepperi-addons-ngx-lib.mjs.map +1 -0
  588. package/field-title/field-title.component.d.ts +14 -11
  589. package/field-title/field-title.module.d.ts +15 -5
  590. package/field-title/index.d.ts +5 -0
  591. package/field-title/public-api.d.ts +2 -2
  592. package/files-uploader/files-uploader.component.d.ts +57 -53
  593. package/files-uploader/files-uploader.module.d.ts +21 -5
  594. package/files-uploader/index.d.ts +5 -0
  595. package/files-uploader/public-api.d.ts +2 -2
  596. package/form/field-generator.component.d.ts +39 -45
  597. package/form/form.component.d.ts +93 -90
  598. package/form/form.model.d.ts +20 -20
  599. package/form/form.module.d.ts +49 -5
  600. package/form/index.d.ts +5 -0
  601. package/form/indicators.component.d.ts +10 -7
  602. package/form/internal-button.component.d.ts +42 -39
  603. package/form/internal-carusel.component.d.ts +39 -38
  604. package/form/internal-carusel.service.d.ts +10 -7
  605. package/form/internal-field-generator.component.d.ts +35 -0
  606. package/form/internal-form.component.d.ts +89 -0
  607. package/form/internal-list.component.d.ts +95 -92
  608. package/form/internal-menu.component.d.ts +19 -16
  609. package/form/internal-page.component.d.ts +73 -72
  610. package/form/internal-page.service.d.ts +22 -19
  611. package/form/public-api.d.ts +3 -3
  612. package/group-buttons/group-buttons.component.d.ts +23 -20
  613. package/group-buttons/group-buttons.module.d.ts +18 -5
  614. package/group-buttons/index.d.ts +5 -0
  615. package/group-buttons/public-api.d.ts +2 -2
  616. package/icon/icon-generated-all.model.d.ts +99 -99
  617. package/icon/icon-generated.model.d.ts +394 -394
  618. package/icon/icon-registry.service.d.ts +9 -6
  619. package/icon/icon.component.d.ts +49 -46
  620. package/icon/icon.module.d.ts +7 -2
  621. package/icon/icon.service.d.ts +13 -10
  622. package/icon/index.d.ts +5 -0
  623. package/icon/public-api.d.ts +6 -6
  624. package/image/image.component.d.ts +66 -63
  625. package/image/image.module.d.ts +20 -5
  626. package/image/image.service.d.ts +14 -11
  627. package/image/index.d.ts +5 -0
  628. package/image/public-api.d.ts +3 -3
  629. package/images-filmstrip/images-filmstrip.component.d.ts +87 -87
  630. package/images-filmstrip/images-filmstrip.module.d.ts +22 -5
  631. package/images-filmstrip/index.d.ts +5 -0
  632. package/images-filmstrip/public-api.d.ts +2 -2
  633. package/index.d.ts +5 -0
  634. package/link/index.d.ts +5 -0
  635. package/link/link.component.d.ts +133 -131
  636. package/link/link.module.d.ts +22 -5
  637. package/link/link.pipes.d.ts +7 -4
  638. package/link/public-api.d.ts +2 -2
  639. package/list/index.d.ts +5 -0
  640. package/list/list-actions.component.d.ts +18 -14
  641. package/list/list-carousel.component.d.ts +40 -36
  642. package/list/list-chooser.component.d.ts +29 -25
  643. package/list/list-pager.component.d.ts +39 -35
  644. package/list/list-sorting.component.d.ts +30 -26
  645. package/list/list-total.component.d.ts +11 -7
  646. package/list/list-views.component.d.ts +35 -31
  647. package/list/list.component.d.ts +164 -161
  648. package/list/list.model.d.ts +31 -31
  649. package/list/list.module.d.ts +34 -5
  650. package/list/list.pipes.d.ts +16 -11
  651. package/list/public-api.d.ts +10 -10
  652. package/list/virtual-scroller.d.ts +183 -176
  653. package/menu/index.d.ts +5 -0
  654. package/menu/menu-item.component.d.ts +28 -25
  655. package/menu/menu.component.d.ts +46 -43
  656. package/menu/menu.model.d.ts +25 -25
  657. package/menu/menu.module.d.ts +18 -5
  658. package/menu/public-api.d.ts +3 -3
  659. package/ngx-lib.module.d.ts +23 -2
  660. package/package.json +353 -20
  661. package/page-layout/index.d.ts +5 -0
  662. package/page-layout/page-layout.component.d.ts +19 -16
  663. package/page-layout/page-layout.module.d.ts +10 -2
  664. package/page-layout/public-api.d.ts +2 -2
  665. package/plugin/index.d.ts +5 -0
  666. package/plugin/plugin-proxy.component.d.ts +25 -0
  667. package/plugin/plugin.model.d.ts +6 -0
  668. package/plugin/public-api.d.ts +2 -0
  669. package/profile-data-views-list/index.d.ts +5 -0
  670. package/profile-data-views-list/profile-data-view/profile-data-view.component.d.ts +18 -15
  671. package/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.d.ts +24 -21
  672. package/profile-data-views-list/profile-data-views-list.component.d.ts +35 -32
  673. package/profile-data-views-list/profile-data-views-list.model.d.ts +18 -18
  674. package/profile-data-views-list/profile-data-views-list.module.d.ts +23 -5
  675. package/profile-data-views-list/public-api.d.ts +5 -5
  676. package/public-api.d.ts +2 -2
  677. package/quantity-selector/index.d.ts +5 -0
  678. package/quantity-selector/public-api.d.ts +2 -2
  679. package/quantity-selector/quantity-selector-validation.directive.d.ts +16 -13
  680. package/quantity-selector/quantity-selector.component.d.ts +101 -98
  681. package/quantity-selector/quantity-selector.module.d.ts +23 -5
  682. package/quantity-selector/quantity-selector.pipes.d.ts +7 -4
  683. package/query-builder/common/model/field.d.ts +8 -8
  684. package/query-builder/common/model/filter.d.ts +6 -6
  685. package/query-builder/common/model/legacy.d.ts +29 -29
  686. package/query-builder/common/model/operator-unit.d.ts +13 -13
  687. package/query-builder/common/model/operator.d.ts +21 -21
  688. package/query-builder/common/model/structure.d.ts +4 -4
  689. package/query-builder/common/model/type-map.d.ts +12 -12
  690. package/query-builder/common/model/type.d.ts +4 -4
  691. package/query-builder/common/services/output-query.service.d.ts +47 -44
  692. package/query-builder/common/services/query-structure.service.d.ts +82 -78
  693. package/query-builder/common/services/type-convertor.service.d.ts +13 -10
  694. package/query-builder/index.d.ts +5 -0
  695. package/query-builder/public-api.d.ts +5 -5
  696. package/query-builder/query-builder-item/query-builder-item.component.d.ts +41 -38
  697. package/query-builder/query-builder-section/query-builder-section.component.d.ts +30 -27
  698. package/query-builder/query-builder.component.d.ts +39 -36
  699. package/query-builder/query-builder.module.d.ts +16 -2
  700. package/query-builder/query-builder.service.d.ts +30 -27
  701. package/remote-loader/addon-block-loader.component.d.ts +32 -29
  702. package/remote-loader/addon-block-loader.service.d.ts +16 -13
  703. package/remote-loader/index.d.ts +5 -0
  704. package/remote-loader/public-api.d.ts +6 -6
  705. package/remote-loader/remote-loader.component.d.ts +27 -24
  706. package/remote-loader/remote-loader.model.d.ts +36 -36
  707. package/remote-loader/remote-loader.module.d.ts +13 -2
  708. package/remote-loader/remote-loader.service.d.ts +17 -14
  709. package/rich-html-textarea/index.d.ts +5 -0
  710. package/rich-html-textarea/public-api.d.ts +2 -2
  711. package/rich-html-textarea/rich-html-textarea.component.d.ts +78 -75
  712. package/rich-html-textarea/rich-html-textarea.module.d.ts +25 -5
  713. package/search/index.d.ts +5 -0
  714. package/search/public-api.d.ts +3 -3
  715. package/search/search.component.d.ts +65 -61
  716. package/search/search.model.d.ts +14 -14
  717. package/search/search.module.d.ts +20 -5
  718. package/select/index.d.ts +5 -0
  719. package/select/public-api.d.ts +2 -2
  720. package/select/select.component.d.ts +53 -50
  721. package/select/select.module.d.ts +20 -5
  722. package/separator/index.d.ts +5 -0
  723. package/separator/public-api.d.ts +2 -2
  724. package/separator/separator.component.d.ts +22 -19
  725. package/separator/separator.module.d.ts +8 -2
  726. package/side-bar/index.d.ts +5 -0
  727. package/side-bar/public-api.d.ts +3 -3
  728. package/side-bar/side-bar.component.d.ts +42 -38
  729. package/side-bar/side-bar.model.d.ts +4 -4
  730. package/side-bar/side-bar.module.d.ts +16 -5
  731. package/signature/index.d.ts +5 -0
  732. package/signature/public-api.d.ts +2 -2
  733. package/signature/signature.component.d.ts +68 -65
  734. package/signature/signature.module.d.ts +24 -5
  735. package/size-detector/index.d.ts +5 -0
  736. package/size-detector/public-api.d.ts +2 -2
  737. package/size-detector/size-detector.component.d.ts +29 -26
  738. package/size-detector/size-detector.module.d.ts +11 -2
  739. package/slider/index.d.ts +5 -0
  740. package/slider/public-api.d.ts +2 -2
  741. package/slider/slider.component.d.ts +39 -36
  742. package/slider/slider.module.d.ts +12 -2
  743. package/smart-filters/boolean-filter/boolean-filter.component.d.ts +28 -25
  744. package/smart-filters/common/filter-actions.component.d.ts +12 -9
  745. package/smart-filters/common/model/base-filter-component.d.ts +73 -70
  746. package/smart-filters/common/model/creator.d.ts +6 -6
  747. package/smart-filters/common/model/field.d.ts +69 -69
  748. package/smart-filters/common/model/filter.d.ts +11 -11
  749. package/smart-filters/common/model/operator.d.ts +51 -51
  750. package/smart-filters/common/model/type.d.ts +4 -4
  751. package/smart-filters/date-filter/date-filter.component.d.ts +59 -56
  752. package/smart-filters/index.d.ts +5 -0
  753. package/smart-filters/multi-select-filter/multi-select-filter.component.d.ts +56 -53
  754. package/smart-filters/number-filter/number-filter.component.d.ts +51 -48
  755. package/smart-filters/public-api.d.ts +14 -14
  756. package/smart-filters/smart-filters.component.d.ts +35 -32
  757. package/smart-filters/smart-filters.module.d.ts +37 -5
  758. package/smart-filters/text-filter/text-filter.component.d.ts +28 -25
  759. package/snack-bar/default-snack-bar.component.d.ts +13 -10
  760. package/snack-bar/index.d.ts +5 -0
  761. package/snack-bar/public-api.d.ts +4 -4
  762. package/snack-bar/snack-bar.component.d.ts +12 -9
  763. package/snack-bar/snack-bar.model.d.ts +8 -8
  764. package/snack-bar/snack-bar.module.d.ts +19 -5
  765. package/snack-bar/snack-bar.service.d.ts +24 -21
  766. package/src/core/style/themes/black-theme.scss +1 -1
  767. package/src/core/style/themes/default-theme.scss +1 -1
  768. package/src/core/style/themes/light-theme.scss +1 -1
  769. package/src/core/style/themes/nature-theme.scss +1 -1
  770. package/textarea/index.d.ts +5 -0
  771. package/textarea/public-api.d.ts +2 -2
  772. package/textarea/textarea.component.d.ts +54 -51
  773. package/textarea/textarea.module.d.ts +23 -5
  774. package/textbox/index.d.ts +5 -0
  775. package/textbox/public-api.d.ts +2 -2
  776. package/textbox/textbox-validation.directive.d.ts +21 -18
  777. package/textbox/textbox.component.d.ts +143 -141
  778. package/textbox/textbox.module.d.ts +22 -5
  779. package/textbox-icon/index.d.ts +5 -0
  780. package/textbox-icon/public-api.d.ts +2 -2
  781. package/textbox-icon/textbox-icon.component.d.ts +13 -10
  782. package/textbox-icon/textbox-icon.module.d.ts +16 -5
  783. package/theming.scss +1 -1
  784. package/top-bar/index.d.ts +5 -0
  785. package/top-bar/public-api.d.ts +3 -3
  786. package/top-bar/top-bar.component.d.ts +39 -36
  787. package/top-bar/top-bar.model.d.ts +4 -4
  788. package/top-bar/top-bar.module.d.ts +18 -5
  789. package/address/package.json +0 -11
  790. package/address/pepperi-addons-ngx-lib-address.d.ts +0 -4
  791. package/address/pepperi-addons-ngx-lib-address.metadata.json +0 -1
  792. package/attachment/package.json +0 -11
  793. package/attachment/pepperi-addons-ngx-lib-attachment.d.ts +0 -4
  794. package/attachment/pepperi-addons-ngx-lib-attachment.metadata.json +0 -1
  795. package/bread-crumbs/package.json +0 -11
  796. package/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.d.ts +0 -4
  797. package/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.metadata.json +0 -1
  798. package/bundles/pepperi-addons-ngx-lib-address.umd.js +0 -145
  799. package/bundles/pepperi-addons-ngx-lib-address.umd.js.map +0 -1
  800. package/bundles/pepperi-addons-ngx-lib-attachment.umd.js +0 -268
  801. package/bundles/pepperi-addons-ngx-lib-attachment.umd.js.map +0 -1
  802. package/bundles/pepperi-addons-ngx-lib-bread-crumbs.umd.js +0 -145
  803. package/bundles/pepperi-addons-ngx-lib-bread-crumbs.umd.js.map +0 -1
  804. package/bundles/pepperi-addons-ngx-lib-button.umd.js +0 -182
  805. package/bundles/pepperi-addons-ngx-lib-button.umd.js.map +0 -1
  806. package/bundles/pepperi-addons-ngx-lib-carousel.umd.js +0 -812
  807. package/bundles/pepperi-addons-ngx-lib-carousel.umd.js.map +0 -1
  808. package/bundles/pepperi-addons-ngx-lib-checkbox.umd.js +0 -213
  809. package/bundles/pepperi-addons-ngx-lib-checkbox.umd.js.map +0 -1
  810. package/bundles/pepperi-addons-ngx-lib-color.umd.js +0 -326
  811. package/bundles/pepperi-addons-ngx-lib-color.umd.js.map +0 -1
  812. package/bundles/pepperi-addons-ngx-lib-date.umd.js +0 -698
  813. package/bundles/pepperi-addons-ngx-lib-date.umd.js.map +0 -1
  814. package/bundles/pepperi-addons-ngx-lib-dialog.umd.js +0 -578
  815. package/bundles/pepperi-addons-ngx-lib-dialog.umd.js.map +0 -1
  816. package/bundles/pepperi-addons-ngx-lib-draggable-items.umd.js +0 -175
  817. package/bundles/pepperi-addons-ngx-lib-draggable-items.umd.js.map +0 -1
  818. package/bundles/pepperi-addons-ngx-lib-field-title.umd.js +0 -78
  819. package/bundles/pepperi-addons-ngx-lib-field-title.umd.js.map +0 -1
  820. package/bundles/pepperi-addons-ngx-lib-files-uploader.umd.js +0 -281
  821. package/bundles/pepperi-addons-ngx-lib-files-uploader.umd.js.map +0 -1
  822. package/bundles/pepperi-addons-ngx-lib-form.umd.js +0 -3401
  823. package/bundles/pepperi-addons-ngx-lib-form.umd.js.map +0 -1
  824. package/bundles/pepperi-addons-ngx-lib-group-buttons.umd.js +0 -108
  825. package/bundles/pepperi-addons-ngx-lib-group-buttons.umd.js.map +0 -1
  826. package/bundles/pepperi-addons-ngx-lib-icon.umd.js +0 -834
  827. package/bundles/pepperi-addons-ngx-lib-icon.umd.js.map +0 -1
  828. package/bundles/pepperi-addons-ngx-lib-image.umd.js +0 -372
  829. package/bundles/pepperi-addons-ngx-lib-image.umd.js.map +0 -1
  830. package/bundles/pepperi-addons-ngx-lib-images-filmstrip.umd.js +0 -446
  831. package/bundles/pepperi-addons-ngx-lib-images-filmstrip.umd.js.map +0 -1
  832. package/bundles/pepperi-addons-ngx-lib-link.umd.js +0 -412
  833. package/bundles/pepperi-addons-ngx-lib-link.umd.js.map +0 -1
  834. package/bundles/pepperi-addons-ngx-lib-list.umd.js +0 -3274
  835. package/bundles/pepperi-addons-ngx-lib-list.umd.js.map +0 -1
  836. package/bundles/pepperi-addons-ngx-lib-menu.umd.js +0 -676
  837. package/bundles/pepperi-addons-ngx-lib-menu.umd.js.map +0 -1
  838. package/bundles/pepperi-addons-ngx-lib-page-layout.umd.js +0 -81
  839. package/bundles/pepperi-addons-ngx-lib-page-layout.umd.js.map +0 -1
  840. package/bundles/pepperi-addons-ngx-lib-profile-data-views-list.umd.js +0 -572
  841. package/bundles/pepperi-addons-ngx-lib-profile-data-views-list.umd.js.map +0 -1
  842. package/bundles/pepperi-addons-ngx-lib-quantity-selector.umd.js +0 -959
  843. package/bundles/pepperi-addons-ngx-lib-quantity-selector.umd.js.map +0 -1
  844. package/bundles/pepperi-addons-ngx-lib-query-builder.umd.js +0 -1250
  845. package/bundles/pepperi-addons-ngx-lib-query-builder.umd.js.map +0 -1
  846. package/bundles/pepperi-addons-ngx-lib-remote-loader.umd.js +0 -738
  847. package/bundles/pepperi-addons-ngx-lib-remote-loader.umd.js.map +0 -1
  848. package/bundles/pepperi-addons-ngx-lib-rich-html-textarea.umd.js +0 -296
  849. package/bundles/pepperi-addons-ngx-lib-rich-html-textarea.umd.js.map +0 -1
  850. package/bundles/pepperi-addons-ngx-lib-search.umd.js +0 -347
  851. package/bundles/pepperi-addons-ngx-lib-search.umd.js.map +0 -1
  852. package/bundles/pepperi-addons-ngx-lib-select.umd.js +0 -598
  853. package/bundles/pepperi-addons-ngx-lib-select.umd.js.map +0 -1
  854. package/bundles/pepperi-addons-ngx-lib-separator.umd.js +0 -100
  855. package/bundles/pepperi-addons-ngx-lib-separator.umd.js.map +0 -1
  856. package/bundles/pepperi-addons-ngx-lib-side-bar.umd.js +0 -184
  857. package/bundles/pepperi-addons-ngx-lib-side-bar.umd.js.map +0 -1
  858. package/bundles/pepperi-addons-ngx-lib-signature.umd.js +0 -307
  859. package/bundles/pepperi-addons-ngx-lib-signature.umd.js.map +0 -1
  860. package/bundles/pepperi-addons-ngx-lib-size-detector.umd.js +0 -134
  861. package/bundles/pepperi-addons-ngx-lib-size-detector.umd.js.map +0 -1
  862. package/bundles/pepperi-addons-ngx-lib-slider.umd.js +0 -145
  863. package/bundles/pepperi-addons-ngx-lib-slider.umd.js.map +0 -1
  864. package/bundles/pepperi-addons-ngx-lib-smart-filters.umd.js +0 -2044
  865. package/bundles/pepperi-addons-ngx-lib-smart-filters.umd.js.map +0 -1
  866. package/bundles/pepperi-addons-ngx-lib-snack-bar.umd.js +0 -202
  867. package/bundles/pepperi-addons-ngx-lib-snack-bar.umd.js.map +0 -1
  868. package/bundles/pepperi-addons-ngx-lib-textarea.umd.js +0 -232
  869. package/bundles/pepperi-addons-ngx-lib-textarea.umd.js.map +0 -1
  870. package/bundles/pepperi-addons-ngx-lib-textbox-icon.umd.js +0 -101
  871. package/bundles/pepperi-addons-ngx-lib-textbox-icon.umd.js.map +0 -1
  872. package/bundles/pepperi-addons-ngx-lib-textbox.umd.js +0 -577
  873. package/bundles/pepperi-addons-ngx-lib-textbox.umd.js.map +0 -1
  874. package/bundles/pepperi-addons-ngx-lib-top-bar.umd.js +0 -150
  875. package/bundles/pepperi-addons-ngx-lib-top-bar.umd.js.map +0 -1
  876. package/bundles/pepperi-addons-ngx-lib.umd.js +0 -5183
  877. package/bundles/pepperi-addons-ngx-lib.umd.js.map +0 -1
  878. package/button/package.json +0 -11
  879. package/button/pepperi-addons-ngx-lib-button.d.ts +0 -4
  880. package/button/pepperi-addons-ngx-lib-button.metadata.json +0 -1
  881. package/carousel/package.json +0 -11
  882. package/carousel/pepperi-addons-ngx-lib-carousel.d.ts +0 -4
  883. package/carousel/pepperi-addons-ngx-lib-carousel.metadata.json +0 -1
  884. package/checkbox/package.json +0 -14
  885. package/checkbox/pepperi-addons-ngx-lib-checkbox.d.ts +0 -4
  886. package/checkbox/pepperi-addons-ngx-lib-checkbox.metadata.json +0 -1
  887. package/color/package.json +0 -14
  888. package/color/pepperi-addons-ngx-lib-color.d.ts +0 -5
  889. package/color/pepperi-addons-ngx-lib-color.metadata.json +0 -1
  890. package/date/package.json +0 -18
  891. package/date/pepperi-addons-ngx-lib-date.d.ts +0 -5
  892. package/date/pepperi-addons-ngx-lib-date.metadata.json +0 -1
  893. package/dialog/package.json +0 -15
  894. package/dialog/pepperi-addons-ngx-lib-dialog.d.ts +0 -5
  895. package/dialog/pepperi-addons-ngx-lib-dialog.metadata.json +0 -1
  896. package/draggable-items/package.json +0 -14
  897. package/draggable-items/pepperi-addons-ngx-lib-draggable-items.d.ts +0 -4
  898. package/draggable-items/pepperi-addons-ngx-lib-draggable-items.metadata.json +0 -1
  899. package/esm2015/address/address.component.js +0 -97
  900. package/esm2015/address/address.module.js +0 -31
  901. package/esm2015/address/pepperi-addons-ngx-lib-address.js +0 -5
  902. package/esm2015/address/public-api.js +0 -6
  903. package/esm2015/attachment/attachment.component.js +0 -209
  904. package/esm2015/attachment/attachment.module.js +0 -29
  905. package/esm2015/attachment/pepperi-addons-ngx-lib-attachment.js +0 -5
  906. package/esm2015/attachment/public-api.js +0 -6
  907. package/esm2015/bread-crumbs/bread-crumbs.component.js +0 -79
  908. package/esm2015/bread-crumbs/bread-crumbs.model.js +0 -7
  909. package/esm2015/bread-crumbs/bread-crumbs.module.js +0 -35
  910. package/esm2015/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.js +0 -5
  911. package/esm2015/bread-crumbs/public-api.js +0 -7
  912. package/esm2015/button/button.component.js +0 -128
  913. package/esm2015/button/button.model.js +0 -6
  914. package/esm2015/button/button.module.js +0 -27
  915. package/esm2015/button/pepperi-addons-ngx-lib-button.js +0 -5
  916. package/esm2015/button/public-api.js +0 -7
  917. package/esm2015/carousel/carousel-item.directive.js +0 -27
  918. package/esm2015/carousel/carousel.component.js +0 -714
  919. package/esm2015/carousel/carousel.module.js +0 -12
  920. package/esm2015/carousel/pepperi-addons-ngx-lib-carousel.js +0 -5
  921. package/esm2015/carousel/public-api.js +0 -8
  922. package/esm2015/checkbox/checkbox.component.js +0 -152
  923. package/esm2015/checkbox/checkbox.module.js +0 -40
  924. package/esm2015/checkbox/pepperi-addons-ngx-lib-checkbox.js +0 -5
  925. package/esm2015/checkbox/public-api.js +0 -6
  926. package/esm2015/color/color-picker.component.js +0 -224
  927. package/esm2015/color/color.component.js +0 -78
  928. package/esm2015/color/color.model.js +0 -2
  929. package/esm2015/color/color.module.js +0 -58
  930. package/esm2015/color/pepperi-addons-ngx-lib-color.js +0 -6
  931. package/esm2015/color/public-api.js +0 -7
  932. package/esm2015/core/clipboard/clipboard.directive.js +0 -20
  933. package/esm2015/core/clipboard/clipboard.service.js +0 -12
  934. package/esm2015/core/clipboard/index.js +0 -5
  935. package/esm2015/core/clipboard/public-api.js +0 -6
  936. package/esm2015/core/common/directives/auto-width.directive.js +0 -78
  937. package/esm2015/core/common/directives/button-blur.directive.js +0 -23
  938. package/esm2015/core/common/directives/button-loader.directive.js +0 -103
  939. package/esm2015/core/common/directives/data-qa.directive.js +0 -23
  940. package/esm2015/core/common/directives/index.js +0 -5
  941. package/esm2015/core/common/directives/menu-blur.directive.js +0 -29
  942. package/esm2015/core/common/directives/prevent-multi-click.directive.js +0 -22
  943. package/esm2015/core/common/directives/print.directive.js +0 -160
  944. package/esm2015/core/common/directives/public-api.js +0 -12
  945. package/esm2015/core/common/index.js +0 -5
  946. package/esm2015/core/common/model/index.js +0 -5
  947. package/esm2015/core/common/model/papi.model.js +0 -3
  948. package/esm2015/core/common/model/public-api.js +0 -7
  949. package/esm2015/core/common/model/utilities.model.js +0 -57
  950. package/esm2015/core/common/model/wapi.model.js +0 -156
  951. package/esm2015/core/common/pipes/common-pipes.js +0 -142
  952. package/esm2015/core/common/pipes/date-ago.pipe.js +0 -45
  953. package/esm2015/core/common/pipes/index.js +0 -5
  954. package/esm2015/core/common/pipes/public-api.js +0 -6
  955. package/esm2015/core/common/public-api.js +0 -8
  956. package/esm2015/core/common/services/addon.service.js +0 -161
  957. package/esm2015/core/common/services/color.service.js +0 -357
  958. package/esm2015/core/common/services/cookie.service.js +0 -148
  959. package/esm2015/core/common/services/data-convertor.service.js +0 -118
  960. package/esm2015/core/common/services/file.service.js +0 -212
  961. package/esm2015/core/common/services/index.js +0 -5
  962. package/esm2015/core/common/services/jwt-helper.service.js +0 -104
  963. package/esm2015/core/common/services/public-api.js +0 -15
  964. package/esm2015/core/common/services/session.service.js +0 -73
  965. package/esm2015/core/common/services/translate.service.js +0 -48
  966. package/esm2015/core/common/services/utilities.service.js +0 -211
  967. package/esm2015/core/common/services/validator.service.js +0 -273
  968. package/esm2015/core/common/services/window-scrolling.service.js +0 -35
  969. package/esm2015/core/customization/customization.model.js +0 -290
  970. package/esm2015/core/customization/customization.service.js +0 -778
  971. package/esm2015/core/customization/index.js +0 -5
  972. package/esm2015/core/customization/public-api.js +0 -6
  973. package/esm2015/core/http/index.js +0 -5
  974. package/esm2015/core/http/interceptors/error.interceptor.js +0 -24
  975. package/esm2015/core/http/interceptors/index.js +0 -24
  976. package/esm2015/core/http/interceptors/loader.interceptor.js +0 -39
  977. package/esm2015/core/http/interceptors/profiler.interceptor.js +0 -29
  978. package/esm2015/core/http/public-api.js +0 -6
  979. package/esm2015/core/http/services/http.service.js +0 -161
  980. package/esm2015/core/http/services/loader.service.js +0 -49
  981. package/esm2015/core/index.js +0 -5
  982. package/esm2015/core/layout/index.js +0 -5
  983. package/esm2015/core/layout/layout.service.js +0 -169
  984. package/esm2015/core/layout/public-api.js +0 -6
  985. package/esm2015/core/layout/rtl.directive.js +0 -47
  986. package/esm2015/core/portal/attach.directive.js +0 -27
  987. package/esm2015/core/portal/index.js +0 -5
  988. package/esm2015/core/portal/portal.service.js +0 -35
  989. package/esm2015/core/portal/public-api.js +0 -7
  990. package/esm2015/core/portal/target.directive.js +0 -24
  991. package/esm2015/core/public-api.js +0 -11
  992. package/esm2015/core/scroll-to/index.js +0 -5
  993. package/esm2015/core/scroll-to/public-api.js +0 -6
  994. package/esm2015/core/scroll-to/scroll-to.service.js +0 -82
  995. package/esm2015/date/date.component.js +0 -252
  996. package/esm2015/date/date.model.js +0 -45
  997. package/esm2015/date/date.module.js +0 -51
  998. package/esm2015/date/pepperi-addons-ngx-lib-date.js +0 -6
  999. package/esm2015/date/public-api.js +0 -6
  1000. package/esm2015/dialog/default-dialog.component.js +0 -32
  1001. package/esm2015/dialog/dialog.component.js +0 -29
  1002. package/esm2015/dialog/dialog.model.js +0 -35
  1003. package/esm2015/dialog/dialog.module.js +0 -40
  1004. package/esm2015/dialog/dialog.service.js +0 -88
  1005. package/esm2015/dialog/pepperi-addons-ngx-lib-dialog.js +0 -6
  1006. package/esm2015/dialog/public-api.js +0 -8
  1007. package/esm2015/draggable-items/draggable-item/draggable-item.component.js +0 -25
  1008. package/esm2015/draggable-items/draggable-items.component.js +0 -92
  1009. package/esm2015/draggable-items/draggable-items.model.js +0 -2
  1010. package/esm2015/draggable-items/draggable-items.module.js +0 -43
  1011. package/esm2015/draggable-items/pepperi-addons-ngx-lib-draggable-items.js +0 -5
  1012. package/esm2015/draggable-items/public-api.js +0 -8
  1013. package/esm2015/field-title/field-title.component.js +0 -32
  1014. package/esm2015/field-title/field-title.module.js +0 -32
  1015. package/esm2015/field-title/pepperi-addons-ngx-lib-field-title.js +0 -5
  1016. package/esm2015/field-title/public-api.js +0 -6
  1017. package/esm2015/files-uploader/files-uploader.component.js +0 -221
  1018. package/esm2015/files-uploader/files-uploader.module.js +0 -50
  1019. package/esm2015/files-uploader/pepperi-addons-ngx-lib-files-uploader.js +0 -5
  1020. package/esm2015/files-uploader/public-api.js +0 -6
  1021. package/esm2015/form/field-generator.component.js +0 -220
  1022. package/esm2015/form/form.component.js +0 -1197
  1023. package/esm2015/form/form.model.js +0 -2
  1024. package/esm2015/form/form.module.js +0 -108
  1025. package/esm2015/form/indicators.component.js +0 -21
  1026. package/esm2015/form/internal-button.component.js +0 -166
  1027. package/esm2015/form/internal-carusel.component.js +0 -116
  1028. package/esm2015/form/internal-carusel.service.js +0 -32
  1029. package/esm2015/form/internal-list.component.js +0 -495
  1030. package/esm2015/form/internal-menu.component.js +0 -55
  1031. package/esm2015/form/internal-page.component.js +0 -351
  1032. package/esm2015/form/internal-page.service.js +0 -121
  1033. package/esm2015/form/pepperi-addons-ngx-lib-form.js +0 -14
  1034. package/esm2015/form/public-api.js +0 -7
  1035. package/esm2015/group-buttons/group-buttons.component.js +0 -58
  1036. package/esm2015/group-buttons/group-buttons.module.js +0 -38
  1037. package/esm2015/group-buttons/pepperi-addons-ngx-lib-group-buttons.js +0 -5
  1038. package/esm2015/group-buttons/public-api.js +0 -6
  1039. package/esm2015/icon/icon-generated-all.model.js +0 -101
  1040. package/esm2015/icon/icon-generated.model.js +0 -390
  1041. package/esm2015/icon/icon-registry.service.js +0 -24
  1042. package/esm2015/icon/icon.component.js +0 -125
  1043. package/esm2015/icon/icon.module.js +0 -15
  1044. package/esm2015/icon/icon.service.js +0 -32
  1045. package/esm2015/icon/pepperi-addons-ngx-lib-icon.js +0 -5
  1046. package/esm2015/icon/public-api.js +0 -11
  1047. package/esm2015/image/image.component.js +0 -229
  1048. package/esm2015/image/image.module.js +0 -49
  1049. package/esm2015/image/image.service.js +0 -57
  1050. package/esm2015/image/pepperi-addons-ngx-lib-image.js +0 -5
  1051. package/esm2015/image/public-api.js +0 -7
  1052. package/esm2015/images-filmstrip/images-filmstrip.component.js +0 -375
  1053. package/esm2015/images-filmstrip/images-filmstrip.module.js +0 -71
  1054. package/esm2015/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.js +0 -5
  1055. package/esm2015/images-filmstrip/public-api.js +0 -6
  1056. package/esm2015/link/link.component.js +0 -316
  1057. package/esm2015/link/link.module.js +0 -51
  1058. package/esm2015/link/link.pipes.js +0 -14
  1059. package/esm2015/link/pepperi-addons-ngx-lib-link.js +0 -6
  1060. package/esm2015/link/public-api.js +0 -6
  1061. package/esm2015/list/list-actions.component.js +0 -36
  1062. package/esm2015/list/list-carousel.component.js +0 -95
  1063. package/esm2015/list/list-chooser.component.js +0 -58
  1064. package/esm2015/list/list-pager.component.js +0 -113
  1065. package/esm2015/list/list-sorting.component.js +0 -55
  1066. package/esm2015/list/list-total.component.js +0 -24
  1067. package/esm2015/list/list-views.component.js +0 -72
  1068. package/esm2015/list/list.component.js +0 -1128
  1069. package/esm2015/list/list.model.js +0 -4
  1070. package/esm2015/list/list.module.js +0 -88
  1071. package/esm2015/list/list.pipes.js +0 -40
  1072. package/esm2015/list/pepperi-addons-ngx-lib-list.js +0 -7
  1073. package/esm2015/list/public-api.js +0 -15
  1074. package/esm2015/list/virtual-scroller.js +0 -1079
  1075. package/esm2015/menu/menu-item.component.js +0 -103
  1076. package/esm2015/menu/menu.component.js +0 -174
  1077. package/esm2015/menu/menu.model.js +0 -19
  1078. package/esm2015/menu/menu.module.js +0 -40
  1079. package/esm2015/menu/pepperi-addons-ngx-lib-menu.js +0 -6
  1080. package/esm2015/menu/public-api.js +0 -7
  1081. package/esm2015/ngx-lib.module.js +0 -94
  1082. package/esm2015/page-layout/page-layout.component.js +0 -42
  1083. package/esm2015/page-layout/page-layout.module.js +0 -21
  1084. package/esm2015/page-layout/pepperi-addons-ngx-lib-page-layout.js +0 -5
  1085. package/esm2015/page-layout/public-api.js +0 -6
  1086. package/esm2015/pepperi-addons-ngx-lib.js +0 -9
  1087. package/esm2015/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.js +0 -5
  1088. package/esm2015/profile-data-views-list/profile-data-view/profile-data-view.component.js +0 -39
  1089. package/esm2015/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.js +0 -60
  1090. package/esm2015/profile-data-views-list/profile-data-views-list.component.js +0 -87
  1091. package/esm2015/profile-data-views-list/profile-data-views-list.model.js +0 -2
  1092. package/esm2015/profile-data-views-list/profile-data-views-list.module.js +0 -57
  1093. package/esm2015/profile-data-views-list/public-api.js +0 -9
  1094. package/esm2015/public-api.js +0 -6
  1095. package/esm2015/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.js +0 -7
  1096. package/esm2015/quantity-selector/public-api.js +0 -6
  1097. package/esm2015/quantity-selector/quantity-selector-validation.directive.js +0 -44
  1098. package/esm2015/quantity-selector/quantity-selector.component.js +0 -473
  1099. package/esm2015/quantity-selector/quantity-selector.module.js +0 -53
  1100. package/esm2015/quantity-selector/quantity-selector.pipes.js +0 -19
  1101. package/esm2015/query-builder/common/model/field.js +0 -2
  1102. package/esm2015/query-builder/common/model/filter.js +0 -2
  1103. package/esm2015/query-builder/common/model/legacy.js +0 -2
  1104. package/esm2015/query-builder/common/model/operator-unit.js +0 -42
  1105. package/esm2015/query-builder/common/model/operator.js +0 -266
  1106. package/esm2015/query-builder/common/model/structure.js +0 -2
  1107. package/esm2015/query-builder/common/model/type-map.js +0 -27
  1108. package/esm2015/query-builder/common/model/type.js +0 -6
  1109. package/esm2015/query-builder/common/services/output-query.service.js +0 -113
  1110. package/esm2015/query-builder/common/services/query-structure.service.js +0 -229
  1111. package/esm2015/query-builder/common/services/type-convertor.service.js +0 -40
  1112. package/esm2015/query-builder/pepperi-addons-ngx-lib-query-builder.js +0 -10
  1113. package/esm2015/query-builder/public-api.js +0 -9
  1114. package/esm2015/query-builder/query-builder-item/query-builder-item.component.js +0 -118
  1115. package/esm2015/query-builder/query-builder-section/query-builder-section.component.js +0 -64
  1116. package/esm2015/query-builder/query-builder.component.js +0 -108
  1117. package/esm2015/query-builder/query-builder.module.js +0 -35
  1118. package/esm2015/query-builder/query-builder.service.js +0 -103
  1119. package/esm2015/remote-loader/addon-block-loader.component.js +0 -78
  1120. package/esm2015/remote-loader/addon-block-loader.service.js +0 -62
  1121. package/esm2015/remote-loader/pepperi-addons-ngx-lib-remote-loader.js +0 -5
  1122. package/esm2015/remote-loader/public-api.js +0 -10
  1123. package/esm2015/remote-loader/remote-loader.component.js +0 -118
  1124. package/esm2015/remote-loader/remote-loader.model.js +0 -2
  1125. package/esm2015/remote-loader/remote-loader.module.js +0 -38
  1126. package/esm2015/remote-loader/remote-loader.service.js +0 -66
  1127. package/esm2015/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.js +0 -5
  1128. package/esm2015/rich-html-textarea/public-api.js +0 -6
  1129. package/esm2015/rich-html-textarea/rich-html-textarea.component.js +0 -220
  1130. package/esm2015/rich-html-textarea/rich-html-textarea.module.js +0 -57
  1131. package/esm2015/search/pepperi-addons-ngx-lib-search.js +0 -5
  1132. package/esm2015/search/public-api.js +0 -7
  1133. package/esm2015/search/search.component.js +0 -274
  1134. package/esm2015/search/search.model.js +0 -2
  1135. package/esm2015/search/search.module.js +0 -45
  1136. package/esm2015/select/pepperi-addons-ngx-lib-select.js +0 -5
  1137. package/esm2015/select/public-api.js +0 -6
  1138. package/esm2015/select/select.component.js +0 -212
  1139. package/esm2015/select/select.module.js +0 -43
  1140. package/esm2015/separator/pepperi-addons-ngx-lib-separator.js +0 -5
  1141. package/esm2015/separator/public-api.js +0 -6
  1142. package/esm2015/separator/separator.component.js +0 -63
  1143. package/esm2015/separator/separator.module.js +0 -13
  1144. package/esm2015/side-bar/pepperi-addons-ngx-lib-side-bar.js +0 -5
  1145. package/esm2015/side-bar/public-api.js +0 -7
  1146. package/esm2015/side-bar/side-bar.component.js +0 -131
  1147. package/esm2015/side-bar/side-bar.model.js +0 -2
  1148. package/esm2015/side-bar/side-bar.module.js +0 -34
  1149. package/esm2015/signature/pepperi-addons-ngx-lib-signature.js +0 -5
  1150. package/esm2015/signature/public-api.js +0 -6
  1151. package/esm2015/signature/signature.component.js +0 -234
  1152. package/esm2015/signature/signature.module.js +0 -55
  1153. package/esm2015/size-detector/pepperi-addons-ngx-lib-size-detector.js +0 -5
  1154. package/esm2015/size-detector/public-api.js +0 -6
  1155. package/esm2015/size-detector/size-detector.component.js +0 -89
  1156. package/esm2015/size-detector/size-detector.module.js +0 -22
  1157. package/esm2015/slider/pepperi-addons-ngx-lib-slider.js +0 -5
  1158. package/esm2015/slider/public-api.js +0 -6
  1159. package/esm2015/slider/slider.component.js +0 -96
  1160. package/esm2015/slider/slider.module.js +0 -25
  1161. package/esm2015/smart-filters/boolean-filter/boolean-filter.component.js +0 -71
  1162. package/esm2015/smart-filters/common/filter-actions.component.js +0 -26
  1163. package/esm2015/smart-filters/common/model/base-filter-component.js +0 -292
  1164. package/esm2015/smart-filters/common/model/creator.js +0 -76
  1165. package/esm2015/smart-filters/common/model/field.js +0 -117
  1166. package/esm2015/smart-filters/common/model/filter.js +0 -2
  1167. package/esm2015/smart-filters/common/model/operator.js +0 -271
  1168. package/esm2015/smart-filters/common/model/type.js +0 -2
  1169. package/esm2015/smart-filters/date-filter/date-filter.component.js +0 -164
  1170. package/esm2015/smart-filters/multi-select-filter/multi-select-filter.component.js +0 -191
  1171. package/esm2015/smart-filters/number-filter/number-filter.component.js +0 -110
  1172. package/esm2015/smart-filters/pepperi-addons-ngx-lib-smart-filters.js +0 -5
  1173. package/esm2015/smart-filters/public-api.js +0 -19
  1174. package/esm2015/smart-filters/smart-filters.component.js +0 -130
  1175. package/esm2015/smart-filters/smart-filters.module.js +0 -91
  1176. package/esm2015/smart-filters/text-filter/text-filter.component.js +0 -86
  1177. package/esm2015/snack-bar/default-snack-bar.component.js +0 -28
  1178. package/esm2015/snack-bar/pepperi-addons-ngx-lib-snack-bar.js +0 -6
  1179. package/esm2015/snack-bar/public-api.js +0 -8
  1180. package/esm2015/snack-bar/snack-bar.component.js +0 -26
  1181. package/esm2015/snack-bar/snack-bar.model.js +0 -7
  1182. package/esm2015/snack-bar/snack-bar.module.js +0 -42
  1183. package/esm2015/snack-bar/snack-bar.service.js +0 -63
  1184. package/esm2015/textarea/pepperi-addons-ngx-lib-textarea.js +0 -5
  1185. package/esm2015/textarea/public-api.js +0 -6
  1186. package/esm2015/textarea/textarea.component.js +0 -161
  1187. package/esm2015/textarea/textarea.module.js +0 -51
  1188. package/esm2015/textbox/pepperi-addons-ngx-lib-textbox.js +0 -6
  1189. package/esm2015/textbox/public-api.js +0 -6
  1190. package/esm2015/textbox/textbox-validation.directive.js +0 -86
  1191. package/esm2015/textbox/textbox.component.js +0 -412
  1192. package/esm2015/textbox/textbox.module.js +0 -45
  1193. package/esm2015/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.js +0 -5
  1194. package/esm2015/textbox-icon/public-api.js +0 -6
  1195. package/esm2015/textbox-icon/textbox-icon.component.js +0 -41
  1196. package/esm2015/textbox-icon/textbox-icon.module.js +0 -47
  1197. package/esm2015/top-bar/pepperi-addons-ngx-lib-top-bar.js +0 -5
  1198. package/esm2015/top-bar/public-api.js +0 -7
  1199. package/esm2015/top-bar/top-bar.component.js +0 -99
  1200. package/esm2015/top-bar/top-bar.model.js +0 -2
  1201. package/esm2015/top-bar/top-bar.module.js +0 -41
  1202. package/fesm2015/pepperi-addons-ngx-lib-address.js +0 -136
  1203. package/fesm2015/pepperi-addons-ngx-lib-address.js.map +0 -1
  1204. package/fesm2015/pepperi-addons-ngx-lib-attachment.js +0 -246
  1205. package/fesm2015/pepperi-addons-ngx-lib-attachment.js.map +0 -1
  1206. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.js +0 -128
  1207. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.js.map +0 -1
  1208. package/fesm2015/pepperi-addons-ngx-lib-button.js +0 -169
  1209. package/fesm2015/pepperi-addons-ngx-lib-button.js.map +0 -1
  1210. package/fesm2015/pepperi-addons-ngx-lib-carousel.js +0 -760
  1211. package/fesm2015/pepperi-addons-ngx-lib-carousel.js.map +0 -1
  1212. package/fesm2015/pepperi-addons-ngx-lib-checkbox.js +0 -200
  1213. package/fesm2015/pepperi-addons-ngx-lib-checkbox.js.map +0 -1
  1214. package/fesm2015/pepperi-addons-ngx-lib-color.js +0 -353
  1215. package/fesm2015/pepperi-addons-ngx-lib-color.js.map +0 -1
  1216. package/fesm2015/pepperi-addons-ngx-lib-date.js +0 -350
  1217. package/fesm2015/pepperi-addons-ngx-lib-date.js.map +0 -1
  1218. package/fesm2015/pepperi-addons-ngx-lib-dialog.js +0 -223
  1219. package/fesm2015/pepperi-addons-ngx-lib-dialog.js.map +0 -1
  1220. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.js +0 -166
  1221. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.js.map +0 -1
  1222. package/fesm2015/pepperi-addons-ngx-lib-field-title.js +0 -73
  1223. package/fesm2015/pepperi-addons-ngx-lib-field-title.js.map +0 -1
  1224. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.js +0 -276
  1225. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.js.map +0 -1
  1226. package/fesm2015/pepperi-addons-ngx-lib-form.js +0 -2854
  1227. package/fesm2015/pepperi-addons-ngx-lib-form.js.map +0 -1
  1228. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.js +0 -104
  1229. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.js.map +0 -1
  1230. package/fesm2015/pepperi-addons-ngx-lib-icon.js +0 -688
  1231. package/fesm2015/pepperi-addons-ngx-lib-icon.js.map +0 -1
  1232. package/fesm2015/pepperi-addons-ngx-lib-image.js +0 -337
  1233. package/fesm2015/pepperi-addons-ngx-lib-image.js.map +0 -1
  1234. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.js +0 -438
  1235. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.js.map +0 -1
  1236. package/fesm2015/pepperi-addons-ngx-lib-link.js +0 -384
  1237. package/fesm2015/pepperi-addons-ngx-lib-link.js.map +0 -1
  1238. package/fesm2015/pepperi-addons-ngx-lib-list.js +0 -2770
  1239. package/fesm2015/pepperi-addons-ngx-lib-list.js.map +0 -1
  1240. package/fesm2015/pepperi-addons-ngx-lib-menu.js +0 -338
  1241. package/fesm2015/pepperi-addons-ngx-lib-menu.js.map +0 -1
  1242. package/fesm2015/pepperi-addons-ngx-lib-page-layout.js +0 -70
  1243. package/fesm2015/pepperi-addons-ngx-lib-page-layout.js.map +0 -1
  1244. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.js +0 -247
  1245. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.js.map +0 -1
  1246. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.js +0 -592
  1247. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.js.map +0 -1
  1248. package/fesm2015/pepperi-addons-ngx-lib-query-builder.js +0 -1128
  1249. package/fesm2015/pepperi-addons-ngx-lib-query-builder.js.map +0 -1
  1250. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.js +0 -358
  1251. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.js.map +0 -1
  1252. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.js +0 -284
  1253. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.js.map +0 -1
  1254. package/fesm2015/pepperi-addons-ngx-lib-search.js +0 -326
  1255. package/fesm2015/pepperi-addons-ngx-lib-search.js.map +0 -1
  1256. package/fesm2015/pepperi-addons-ngx-lib-select.js +0 -263
  1257. package/fesm2015/pepperi-addons-ngx-lib-select.js.map +0 -1
  1258. package/fesm2015/pepperi-addons-ngx-lib-separator.js +0 -85
  1259. package/fesm2015/pepperi-addons-ngx-lib-separator.js.map +0 -1
  1260. package/fesm2015/pepperi-addons-ngx-lib-side-bar.js +0 -172
  1261. package/fesm2015/pepperi-addons-ngx-lib-side-bar.js.map +0 -1
  1262. package/fesm2015/pepperi-addons-ngx-lib-signature.js +0 -296
  1263. package/fesm2015/pepperi-addons-ngx-lib-signature.js.map +0 -1
  1264. package/fesm2015/pepperi-addons-ngx-lib-size-detector.js +0 -119
  1265. package/fesm2015/pepperi-addons-ngx-lib-size-detector.js.map +0 -1
  1266. package/fesm2015/pepperi-addons-ngx-lib-slider.js +0 -129
  1267. package/fesm2015/pepperi-addons-ngx-lib-slider.js.map +0 -1
  1268. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.js +0 -1595
  1269. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.js.map +0 -1
  1270. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.js +0 -166
  1271. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.js.map +0 -1
  1272. package/fesm2015/pepperi-addons-ngx-lib-textarea.js +0 -219
  1273. package/fesm2015/pepperi-addons-ngx-lib-textarea.js.map +0 -1
  1274. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.js +0 -96
  1275. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.js.map +0 -1
  1276. package/fesm2015/pepperi-addons-ngx-lib-textbox.js +0 -547
  1277. package/fesm2015/pepperi-addons-ngx-lib-textbox.js.map +0 -1
  1278. package/fesm2015/pepperi-addons-ngx-lib-top-bar.js +0 -146
  1279. package/fesm2015/pepperi-addons-ngx-lib-top-bar.js.map +0 -1
  1280. package/fesm2015/pepperi-addons-ngx-lib.js +0 -4461
  1281. package/fesm2015/pepperi-addons-ngx-lib.js.map +0 -1
  1282. package/field-title/package.json +0 -11
  1283. package/field-title/pepperi-addons-ngx-lib-field-title.d.ts +0 -4
  1284. package/field-title/pepperi-addons-ngx-lib-field-title.metadata.json +0 -1
  1285. package/files-uploader/package.json +0 -15
  1286. package/files-uploader/pepperi-addons-ngx-lib-files-uploader.d.ts +0 -4
  1287. package/files-uploader/pepperi-addons-ngx-lib-files-uploader.metadata.json +0 -1
  1288. package/form/package.json +0 -15
  1289. package/form/pepperi-addons-ngx-lib-form.d.ts +0 -13
  1290. package/form/pepperi-addons-ngx-lib-form.metadata.json +0 -1
  1291. package/group-buttons/package.json +0 -11
  1292. package/group-buttons/pepperi-addons-ngx-lib-group-buttons.d.ts +0 -4
  1293. package/group-buttons/pepperi-addons-ngx-lib-group-buttons.metadata.json +0 -1
  1294. package/icon/package.json +0 -11
  1295. package/icon/pepperi-addons-ngx-lib-icon.d.ts +0 -4
  1296. package/icon/pepperi-addons-ngx-lib-icon.metadata.json +0 -1
  1297. package/image/package.json +0 -14
  1298. package/image/pepperi-addons-ngx-lib-image.d.ts +0 -4
  1299. package/image/pepperi-addons-ngx-lib-image.metadata.json +0 -1
  1300. package/images-filmstrip/package.json +0 -17
  1301. package/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.d.ts +0 -4
  1302. package/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.metadata.json +0 -1
  1303. package/link/package.json +0 -14
  1304. package/link/pepperi-addons-ngx-lib-link.d.ts +0 -5
  1305. package/link/pepperi-addons-ngx-lib-link.metadata.json +0 -1
  1306. package/list/package.json +0 -15
  1307. package/list/pepperi-addons-ngx-lib-list.d.ts +0 -6
  1308. package/list/pepperi-addons-ngx-lib-list.metadata.json +0 -1
  1309. package/menu/package.json +0 -11
  1310. package/menu/pepperi-addons-ngx-lib-menu.d.ts +0 -5
  1311. package/menu/pepperi-addons-ngx-lib-menu.metadata.json +0 -1
  1312. package/page-layout/package.json +0 -11
  1313. package/page-layout/pepperi-addons-ngx-lib-page-layout.d.ts +0 -4
  1314. package/page-layout/pepperi-addons-ngx-lib-page-layout.metadata.json +0 -1
  1315. package/pepperi-addons-ngx-lib.d.ts +0 -8
  1316. package/pepperi-addons-ngx-lib.metadata.json +0 -1
  1317. package/profile-data-views-list/package.json +0 -15
  1318. package/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.d.ts +0 -4
  1319. package/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.metadata.json +0 -1
  1320. package/quantity-selector/package.json +0 -15
  1321. package/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.d.ts +0 -6
  1322. package/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.metadata.json +0 -1
  1323. package/query-builder/package.json +0 -14
  1324. package/query-builder/pepperi-addons-ngx-lib-query-builder.d.ts +0 -9
  1325. package/query-builder/pepperi-addons-ngx-lib-query-builder.metadata.json +0 -1
  1326. package/remote-loader/package.json +0 -14
  1327. package/remote-loader/pepperi-addons-ngx-lib-remote-loader.d.ts +0 -4
  1328. package/remote-loader/pepperi-addons-ngx-lib-remote-loader.metadata.json +0 -1
  1329. package/rich-html-textarea/package.json +0 -15
  1330. package/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.d.ts +0 -4
  1331. package/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.metadata.json +0 -1
  1332. package/search/package.json +0 -14
  1333. package/search/pepperi-addons-ngx-lib-search.d.ts +0 -4
  1334. package/search/pepperi-addons-ngx-lib-search.metadata.json +0 -1
  1335. package/select/package.json +0 -14
  1336. package/select/pepperi-addons-ngx-lib-select.d.ts +0 -4
  1337. package/select/pepperi-addons-ngx-lib-select.metadata.json +0 -1
  1338. package/separator/package.json +0 -11
  1339. package/separator/pepperi-addons-ngx-lib-separator.d.ts +0 -4
  1340. package/separator/pepperi-addons-ngx-lib-separator.metadata.json +0 -1
  1341. package/side-bar/package.json +0 -11
  1342. package/side-bar/pepperi-addons-ngx-lib-side-bar.d.ts +0 -4
  1343. package/side-bar/pepperi-addons-ngx-lib-side-bar.metadata.json +0 -1
  1344. package/signature/package.json +0 -15
  1345. package/signature/pepperi-addons-ngx-lib-signature.d.ts +0 -4
  1346. package/signature/pepperi-addons-ngx-lib-signature.metadata.json +0 -1
  1347. package/size-detector/package.json +0 -14
  1348. package/size-detector/pepperi-addons-ngx-lib-size-detector.d.ts +0 -4
  1349. package/size-detector/pepperi-addons-ngx-lib-size-detector.metadata.json +0 -1
  1350. package/slider/package.json +0 -11
  1351. package/slider/pepperi-addons-ngx-lib-slider.d.ts +0 -4
  1352. package/slider/pepperi-addons-ngx-lib-slider.metadata.json +0 -1
  1353. package/smart-filters/package.json +0 -20
  1354. package/smart-filters/pepperi-addons-ngx-lib-smart-filters.d.ts +0 -4
  1355. package/smart-filters/pepperi-addons-ngx-lib-smart-filters.metadata.json +0 -1
  1356. package/snack-bar/package.json +0 -15
  1357. package/snack-bar/pepperi-addons-ngx-lib-snack-bar.d.ts +0 -5
  1358. package/snack-bar/pepperi-addons-ngx-lib-snack-bar.metadata.json +0 -1
  1359. package/textarea/package.json +0 -14
  1360. package/textarea/pepperi-addons-ngx-lib-textarea.d.ts +0 -4
  1361. package/textarea/pepperi-addons-ngx-lib-textarea.metadata.json +0 -1
  1362. package/textbox/package.json +0 -14
  1363. package/textbox/pepperi-addons-ngx-lib-textbox.d.ts +0 -5
  1364. package/textbox/pepperi-addons-ngx-lib-textbox.metadata.json +0 -1
  1365. package/textbox-icon/package.json +0 -11
  1366. package/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.d.ts +0 -4
  1367. package/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.metadata.json +0 -1
  1368. package/top-bar/package.json +0 -11
  1369. package/top-bar/pepperi-addons-ngx-lib-top-bar.d.ts +0 -4
  1370. package/top-bar/pepperi-addons-ngx-lib-top-bar.metadata.json +0 -1
@@ -0,0 +1,1071 @@
1
+ import { Component, ContentChild, ElementRef, EventEmitter, Inject, Input, NgModule, Optional, Output, ViewChild, } from '@angular/core';
2
+ import { PLATFORM_ID } from '@angular/core';
3
+ import { isPlatformServer } from '@angular/common';
4
+ import { CommonModule } from '@angular/common';
5
+ import * as tween from '@tweenjs/tween.js';
6
+ import * as i0 from "@angular/core";
7
+ export function VIRTUAL_SCROLLER_DEFAULT_OPTIONS_FACTORY() {
8
+ return {
9
+ checkResizeInterval: 1000,
10
+ modifyOverflowStyleOfParentScroll: true,
11
+ resizeBypassRefreshThreshold: 5,
12
+ scrollAnimationTime: 750,
13
+ scrollDebounceTime: 0,
14
+ scrollThrottlingTime: 0,
15
+ stripedTable: false
16
+ };
17
+ }
18
+ export class VirtualScrollerComponent {
19
+ constructor(element, renderer, zone, changeDetectorRef, platformId, options) {
20
+ this.element = element;
21
+ this.renderer = renderer;
22
+ this.zone = zone;
23
+ this.changeDetectorRef = changeDetectorRef;
24
+ this.window = window;
25
+ this._disable = false;
26
+ this.executeRefreshOutsideAngularZone = false;
27
+ this._enableUnequalChildrenSizes = false;
28
+ this.RTL = false;
29
+ this.useMarginInsteadOfTranslate = false;
30
+ this.ssrViewportWidth = 1920;
31
+ this.ssrViewportHeight = 1080;
32
+ this._items = [];
33
+ this.compareItems = (item1, item2) => item1 === item2;
34
+ this.vsChildRectChange = new EventEmitter();
35
+ this.vsUpdate = new EventEmitter();
36
+ this.vsChange = new EventEmitter();
37
+ this.vsStart = new EventEmitter();
38
+ this.vsEnd = new EventEmitter();
39
+ this.calculatedScrollbarWidth = 0;
40
+ this.calculatedScrollbarHeight = 0;
41
+ this.padding = 0;
42
+ this.previousViewPort = {};
43
+ this.cachedPageSize = 0;
44
+ this.previousScrollNumberElements = 0;
45
+ this.isAngularUniversalSSR = isPlatformServer(platformId);
46
+ this.checkResizeInterval = options.checkResizeInterval;
47
+ this.modifyOverflowStyleOfParentScroll = options.modifyOverflowStyleOfParentScroll;
48
+ this.resizeBypassRefreshThreshold = options.resizeBypassRefreshThreshold;
49
+ this.scrollAnimationTime = options.scrollAnimationTime;
50
+ this.scrollDebounceTime = options.scrollDebounceTime;
51
+ this.scrollThrottlingTime = options.scrollThrottlingTime;
52
+ this.scrollbarHeight = options.scrollbarHeight;
53
+ this.scrollbarWidth = options.scrollbarWidth;
54
+ this.stripedTable = options.stripedTable;
55
+ this.horizontal = false;
56
+ this.resetWrapGroupDimensions();
57
+ }
58
+ get viewPortInfo() {
59
+ const pageInfo = this.previousViewPort || {};
60
+ return {
61
+ startIndex: pageInfo.startIndex || 0,
62
+ endIndex: pageInfo.endIndex || 0,
63
+ scrollStartPosition: pageInfo.scrollStartPosition || 0,
64
+ scrollEndPosition: pageInfo.scrollEndPosition || 0,
65
+ scrollDirection: pageInfo.scrollDirection || 'forward',
66
+ maxScrollPosition: pageInfo.maxScrollPosition || 0,
67
+ startIndexWithBuffer: pageInfo.startIndexWithBuffer || 0,
68
+ endIndexWithBuffer: pageInfo.endIndexWithBuffer || 0,
69
+ };
70
+ }
71
+ get disable() {
72
+ return this._disable;
73
+ }
74
+ set disable(value) {
75
+ if (this._disable === value) {
76
+ return;
77
+ }
78
+ this._disable = value;
79
+ if (this._disable) {
80
+ this.removeScrollEventHandlers();
81
+ }
82
+ else {
83
+ this.addScrollEventHandlers();
84
+ }
85
+ }
86
+ get enableUnequalChildrenSizes() {
87
+ return this._enableUnequalChildrenSizes;
88
+ }
89
+ set enableUnequalChildrenSizes(value) {
90
+ if (this._enableUnequalChildrenSizes === value) {
91
+ return;
92
+ }
93
+ this._enableUnequalChildrenSizes = value;
94
+ this.minMeasuredChildWidth = undefined;
95
+ this.minMeasuredChildHeight = undefined;
96
+ }
97
+ get bufferAmount() {
98
+ if (typeof (this._bufferAmount) === 'number' && this._bufferAmount > 0) {
99
+ return this._bufferAmount;
100
+ }
101
+ else {
102
+ return this.enableUnequalChildrenSizes ? 5 : 1;
103
+ }
104
+ }
105
+ set bufferAmount(value) {
106
+ this._bufferAmount = value;
107
+ }
108
+ get scrollThrottlingTime() {
109
+ return this._scrollThrottlingTime;
110
+ }
111
+ set scrollThrottlingTime(value) {
112
+ this._scrollThrottlingTime = value;
113
+ this.updateOnScrollFunction();
114
+ }
115
+ get scrollDebounceTime() {
116
+ return this._scrollDebounceTime;
117
+ }
118
+ set scrollDebounceTime(value) {
119
+ this._scrollDebounceTime = value;
120
+ this.updateOnScrollFunction();
121
+ }
122
+ updateOnScrollFunction() {
123
+ if (this.scrollDebounceTime) {
124
+ this.onScroll = this.debounce(() => {
125
+ this.refresh_internal(false);
126
+ }, this.scrollDebounceTime);
127
+ }
128
+ else if (this.scrollThrottlingTime) {
129
+ this.onScroll = this.throttleTrailing(() => {
130
+ this.refresh_internal(false);
131
+ }, this.scrollThrottlingTime);
132
+ }
133
+ else {
134
+ this.onScroll = () => {
135
+ this.refresh_internal(false);
136
+ };
137
+ }
138
+ }
139
+ get checkResizeInterval() {
140
+ return this._checkResizeInterval;
141
+ }
142
+ set checkResizeInterval(value) {
143
+ if (this._checkResizeInterval === value) {
144
+ return;
145
+ }
146
+ this._checkResizeInterval = value;
147
+ this.addScrollEventHandlers();
148
+ }
149
+ get items() {
150
+ return this._items;
151
+ }
152
+ set items(value) {
153
+ if (value === this._items) {
154
+ return;
155
+ }
156
+ this._items = value || [];
157
+ this.refresh_internal(true);
158
+ }
159
+ get horizontal() {
160
+ return this._horizontal;
161
+ }
162
+ set horizontal(value) {
163
+ this._horizontal = value;
164
+ this.updateDirection();
165
+ }
166
+ revertParentOverscroll() {
167
+ const scrollElement = this.getScrollElement();
168
+ if (scrollElement && this.oldParentScrollOverflow) {
169
+ scrollElement.style['overflow-y'] = this.oldParentScrollOverflow.y;
170
+ scrollElement.style['overflow-x'] = this.oldParentScrollOverflow.x;
171
+ }
172
+ this.oldParentScrollOverflow = undefined;
173
+ }
174
+ get parentScroll() {
175
+ return this._parentScroll;
176
+ }
177
+ set parentScroll(value) {
178
+ if (this._parentScroll === value) {
179
+ return;
180
+ }
181
+ this.revertParentOverscroll();
182
+ this._parentScroll = value;
183
+ this.addScrollEventHandlers();
184
+ const scrollElement = this.getScrollElement();
185
+ if (this.modifyOverflowStyleOfParentScroll && scrollElement !== this.element.nativeElement) {
186
+ this.oldParentScrollOverflow = { x: scrollElement.style['overflow-x'], y: scrollElement.style['overflow-y'] };
187
+ scrollElement.style['overflow-y'] = this.horizontal ? 'visible' : 'auto';
188
+ scrollElement.style['overflow-x'] = this.horizontal ? 'auto' : 'visible';
189
+ }
190
+ }
191
+ ngOnInit() {
192
+ this.addScrollEventHandlers();
193
+ }
194
+ ngOnDestroy() {
195
+ this.removeScrollEventHandlers();
196
+ this.revertParentOverscroll();
197
+ }
198
+ ngOnChanges(changes) {
199
+ const indexLengthChanged = this.cachedItemsLength !== this.items.length;
200
+ this.cachedItemsLength = this.items.length;
201
+ const firstRun = !changes.items || !changes.items.previousValue || changes.items.previousValue.length === 0;
202
+ this.refresh_internal(indexLengthChanged || firstRun);
203
+ }
204
+ ngDoCheck() {
205
+ if (this.cachedItemsLength !== this.items.length) {
206
+ this.cachedItemsLength = this.items.length;
207
+ this.refresh_internal(true);
208
+ return;
209
+ }
210
+ if (this.previousViewPort && this.viewPortItems && this.viewPortItems.length > 0) {
211
+ let itemsArrayChanged = false;
212
+ for (let i = 0; i < this.viewPortItems.length; ++i) {
213
+ if (!this.compareItems(this.items[this.previousViewPort.startIndexWithBuffer + i], this.viewPortItems[i])) {
214
+ itemsArrayChanged = true;
215
+ break;
216
+ }
217
+ }
218
+ if (itemsArrayChanged) {
219
+ this.refresh_internal(true);
220
+ }
221
+ }
222
+ }
223
+ refresh() {
224
+ this.refresh_internal(true);
225
+ }
226
+ invalidateAllCachedMeasurements() {
227
+ this.wrapGroupDimensions = {
228
+ maxChildSizePerWrapGroup: [],
229
+ numberOfKnownWrapGroupChildSizes: 0,
230
+ sumOfKnownWrapGroupChildWidths: 0,
231
+ sumOfKnownWrapGroupChildHeights: 0
232
+ };
233
+ this.minMeasuredChildWidth = undefined;
234
+ this.minMeasuredChildHeight = undefined;
235
+ this.refresh_internal(false);
236
+ }
237
+ invalidateCachedMeasurementForItem(item) {
238
+ if (this.enableUnequalChildrenSizes) {
239
+ const index = this.items && this.items.indexOf(item);
240
+ if (index >= 0) {
241
+ this.invalidateCachedMeasurementAtIndex(index);
242
+ }
243
+ }
244
+ else {
245
+ this.minMeasuredChildWidth = undefined;
246
+ this.minMeasuredChildHeight = undefined;
247
+ }
248
+ this.refresh_internal(false);
249
+ }
250
+ invalidateCachedMeasurementAtIndex(index) {
251
+ if (this.enableUnequalChildrenSizes) {
252
+ const cachedMeasurement = this.wrapGroupDimensions.maxChildSizePerWrapGroup[index];
253
+ if (cachedMeasurement) {
254
+ this.wrapGroupDimensions.maxChildSizePerWrapGroup[index] = undefined;
255
+ --this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;
256
+ this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths -= cachedMeasurement.childWidth || 0;
257
+ this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights -= cachedMeasurement.childHeight || 0;
258
+ }
259
+ }
260
+ else {
261
+ this.minMeasuredChildWidth = undefined;
262
+ this.minMeasuredChildHeight = undefined;
263
+ }
264
+ this.refresh_internal(false);
265
+ }
266
+ scrollInto(item, alignToBeginning = true, additionalOffset = 0, animationMilliseconds = undefined, animationCompletedCallback = undefined) {
267
+ const index = this.items.indexOf(item);
268
+ if (index === -1) {
269
+ return;
270
+ }
271
+ this.scrollToIndex(index, alignToBeginning, additionalOffset, animationMilliseconds, animationCompletedCallback);
272
+ }
273
+ scrollToIndex(index, alignToBeginning = true, additionalOffset = 0, animationMilliseconds = undefined, animationCompletedCallback = undefined) {
274
+ let maxRetries = 5;
275
+ const retryIfNeeded = () => {
276
+ --maxRetries;
277
+ if (maxRetries <= 0) {
278
+ if (animationCompletedCallback) {
279
+ animationCompletedCallback();
280
+ }
281
+ return;
282
+ }
283
+ const dimensions = this.calculateDimensions();
284
+ const desiredStartIndex = Math.min(Math.max(index, 0), dimensions.itemCount - 1);
285
+ if (this.previousViewPort.startIndex === desiredStartIndex) {
286
+ if (animationCompletedCallback) {
287
+ animationCompletedCallback();
288
+ }
289
+ return;
290
+ }
291
+ this.scrollToIndex_internal(index, alignToBeginning, additionalOffset, 0, retryIfNeeded);
292
+ };
293
+ this.scrollToIndex_internal(index, alignToBeginning, additionalOffset, animationMilliseconds, retryIfNeeded);
294
+ }
295
+ scrollToIndex_internal(index, alignToBeginning = true, additionalOffset = 0, animationMilliseconds = undefined, animationCompletedCallback = undefined) {
296
+ animationMilliseconds = animationMilliseconds === undefined ? this.scrollAnimationTime : animationMilliseconds;
297
+ const dimensions = this.calculateDimensions();
298
+ let scroll = this.calculatePadding(index, dimensions) + additionalOffset;
299
+ if (!alignToBeginning) {
300
+ scroll -= dimensions.wrapGroupsPerPage * dimensions[this._childScrollDim];
301
+ }
302
+ this.scrollToPosition(scroll, animationMilliseconds, animationCompletedCallback);
303
+ }
304
+ scrollToPosition(scrollPosition, animationMilliseconds = undefined, animationCompletedCallback = undefined) {
305
+ scrollPosition += this.getElementsOffset();
306
+ animationMilliseconds = animationMilliseconds === undefined ? this.scrollAnimationTime : animationMilliseconds;
307
+ const scrollElement = this.getScrollElement();
308
+ let animationRequest;
309
+ if (this.currentTween) {
310
+ this.currentTween.stop();
311
+ this.currentTween = undefined;
312
+ }
313
+ if (!animationMilliseconds) {
314
+ this.renderer.setProperty(scrollElement, this._scrollType, scrollPosition);
315
+ this.refresh_internal(false, animationCompletedCallback);
316
+ return;
317
+ }
318
+ const tweenConfigObj = { scrollPosition: scrollElement[this._scrollType] };
319
+ const newTween = new tween.Tween(tweenConfigObj)
320
+ .to({ scrollPosition }, animationMilliseconds)
321
+ .easing(tween.Easing.Quadratic.Out)
322
+ .onUpdate((data) => {
323
+ if (isNaN(data.scrollPosition)) {
324
+ return;
325
+ }
326
+ this.renderer.setProperty(scrollElement, this._scrollType, data.scrollPosition);
327
+ this.refresh_internal(false);
328
+ })
329
+ .onStop(() => {
330
+ cancelAnimationFrame(animationRequest);
331
+ })
332
+ .start();
333
+ const animate = (time) => {
334
+ if (!newTween["isPlaying"]()) {
335
+ return;
336
+ }
337
+ newTween.update(time);
338
+ if (tweenConfigObj.scrollPosition === scrollPosition) {
339
+ this.refresh_internal(false, animationCompletedCallback);
340
+ return;
341
+ }
342
+ this.zone.runOutsideAngular(() => {
343
+ animationRequest = requestAnimationFrame(animate);
344
+ });
345
+ };
346
+ animate();
347
+ this.currentTween = newTween;
348
+ }
349
+ getElementSize(element) {
350
+ const result = element.getBoundingClientRect();
351
+ const styles = getComputedStyle(element);
352
+ const marginTop = parseInt(styles['margin-top'], 10) || 0;
353
+ const marginBottom = parseInt(styles['margin-bottom'], 10) || 0;
354
+ const marginLeft = parseInt(styles['margin-left'], 10) || 0;
355
+ const marginRight = parseInt(styles['margin-right'], 10) || 0;
356
+ return {
357
+ top: result.top + marginTop,
358
+ bottom: result.bottom + marginBottom,
359
+ left: result.left + marginLeft,
360
+ right: result.right + marginRight,
361
+ width: result.width + marginLeft + marginRight,
362
+ height: result.height + marginTop + marginBottom
363
+ };
364
+ }
365
+ checkScrollElementResized() {
366
+ const boundingRect = this.getElementSize(this.getScrollElement());
367
+ let sizeChanged;
368
+ if (!this.previousScrollBoundingRect) {
369
+ sizeChanged = true;
370
+ }
371
+ else {
372
+ const widthChange = Math.abs(boundingRect.width - this.previousScrollBoundingRect.width);
373
+ const heightChange = Math.abs(boundingRect.height - this.previousScrollBoundingRect.height);
374
+ sizeChanged = widthChange > this.resizeBypassRefreshThreshold || heightChange > this.resizeBypassRefreshThreshold;
375
+ }
376
+ if (sizeChanged) {
377
+ this.previousScrollBoundingRect = boundingRect;
378
+ if (boundingRect.width > 0 && boundingRect.height > 0) {
379
+ this.refresh_internal(false);
380
+ }
381
+ }
382
+ }
383
+ updateDirection() {
384
+ if (this.horizontal) {
385
+ this._childScrollDim = 'childWidth';
386
+ this._invisiblePaddingProperty = 'scaleX';
387
+ this._marginDir = 'margin-left';
388
+ this._offsetType = 'offsetLeft';
389
+ this._pageOffsetType = 'pageXOffset';
390
+ this._scrollType = 'scrollLeft';
391
+ this._translateDir = 'translateX';
392
+ }
393
+ else {
394
+ this._childScrollDim = 'childHeight';
395
+ this._invisiblePaddingProperty = 'scaleY';
396
+ this._marginDir = 'margin-top';
397
+ this._offsetType = 'offsetTop';
398
+ this._pageOffsetType = 'pageYOffset';
399
+ this._scrollType = 'scrollTop';
400
+ this._translateDir = 'translateY';
401
+ }
402
+ }
403
+ debounce(func, wait, ...args) {
404
+ const throttled = this.throttleTrailing(func, wait);
405
+ const result = function () {
406
+ throttled['cancel']();
407
+ throttled.apply(this, args);
408
+ };
409
+ result['cancel'] = function () {
410
+ throttled['cancel']();
411
+ };
412
+ return result;
413
+ }
414
+ throttleTrailing(func, wait, ...args) {
415
+ let timeout = undefined;
416
+ let _arguments = args;
417
+ const result = function () {
418
+ const _this = this;
419
+ _arguments = args;
420
+ if (timeout) {
421
+ return;
422
+ }
423
+ if (wait <= 0) {
424
+ func.apply(_this, _arguments);
425
+ }
426
+ else {
427
+ timeout = setTimeout(function () {
428
+ timeout = undefined;
429
+ func.apply(_this, _arguments);
430
+ }, wait);
431
+ }
432
+ };
433
+ result['cancel'] = function () {
434
+ if (timeout) {
435
+ clearTimeout(timeout);
436
+ timeout = undefined;
437
+ }
438
+ };
439
+ return result;
440
+ }
441
+ refresh_internal(itemsArrayModified, refreshCompletedCallback = undefined, maxRunTimes = 2) {
442
+ //note: maxRunTimes is to force it to keep recalculating if the previous iteration caused a re-render (different sliced items in viewport or scrollPosition changed).
443
+ //The default of 2x max will probably be accurate enough without causing too large a performance bottleneck
444
+ //The code would typically quit out on the 2nd iteration anyways. The main time it'd think more than 2 runs would be necessary would be for vastly different sized child items or if this is the 1st time the items array was initialized.
445
+ //Without maxRunTimes, If the user is actively scrolling this code would become an infinite loop until they stopped scrolling. This would be okay, except each scroll event would start an additional infinte loop. We want to short-circuit it to prevent this.
446
+ if (itemsArrayModified && this.previousViewPort && this.previousViewPort.scrollStartPosition > 0) {
447
+ //if items were prepended, scroll forward to keep same items visible
448
+ const oldViewPort = this.previousViewPort;
449
+ const oldViewPortItems = this.viewPortItems;
450
+ const oldRefreshCompletedCallback = refreshCompletedCallback;
451
+ refreshCompletedCallback = () => {
452
+ const scrollLengthDelta = this.previousViewPort.scrollLength - oldViewPort.scrollLength;
453
+ if (scrollLengthDelta > 0 && this.viewPortItems) {
454
+ const oldStartItem = oldViewPortItems[0];
455
+ const oldStartItemIndex = this.items.findIndex(x => this.compareItems(oldStartItem, x));
456
+ if (oldStartItemIndex > this.previousViewPort.startIndexWithBuffer) {
457
+ let itemOrderChanged = false;
458
+ for (let i = 1; i < this.viewPortItems.length; ++i) {
459
+ if (!this.compareItems(this.items[oldStartItemIndex + i], oldViewPortItems[i])) {
460
+ itemOrderChanged = true;
461
+ break;
462
+ }
463
+ }
464
+ if (!itemOrderChanged) {
465
+ this.scrollToPosition(this.previousViewPort.scrollStartPosition + scrollLengthDelta, 0, oldRefreshCompletedCallback);
466
+ return;
467
+ }
468
+ }
469
+ }
470
+ if (oldRefreshCompletedCallback) {
471
+ oldRefreshCompletedCallback();
472
+ }
473
+ };
474
+ }
475
+ this.zone.runOutsideAngular(() => {
476
+ requestAnimationFrame(() => {
477
+ if (itemsArrayModified) {
478
+ this.resetWrapGroupDimensions();
479
+ }
480
+ const viewport = this.calculateViewport();
481
+ const startChanged = itemsArrayModified || viewport.startIndex !== this.previousViewPort.startIndex;
482
+ const endChanged = itemsArrayModified || viewport.endIndex !== this.previousViewPort.endIndex;
483
+ const scrollLengthChanged = viewport.scrollLength !== this.previousViewPort.scrollLength;
484
+ const paddingChanged = viewport.padding !== this.previousViewPort.padding;
485
+ const scrollPositionChanged = viewport.scrollStartPosition !== this.previousViewPort.scrollStartPosition || viewport.scrollEndPosition !== this.previousViewPort.scrollEndPosition || viewport.maxScrollPosition !== this.previousViewPort.maxScrollPosition;
486
+ const scrollDirection = this.previousViewPort.endIndex <= viewport.endIndex ? 'forward' : 'backward';
487
+ this.previousViewPort = viewport;
488
+ if (scrollLengthChanged) {
489
+ this.renderer.setStyle(this.invisiblePaddingElementRef.nativeElement, 'transform', `${this._invisiblePaddingProperty}(${viewport.scrollLength})`);
490
+ this.renderer.setStyle(this.invisiblePaddingElementRef.nativeElement, 'webkitTransform', `${this._invisiblePaddingProperty}(${viewport.scrollLength})`);
491
+ }
492
+ if (paddingChanged) {
493
+ if (this.useMarginInsteadOfTranslate) {
494
+ this.renderer.setStyle(this.contentElementRef.nativeElement, this._marginDir, `${viewport.padding}px`);
495
+ }
496
+ else {
497
+ this.renderer.setStyle(this.contentElementRef.nativeElement, 'transform', `${this._translateDir}(${viewport.padding}px)`);
498
+ this.renderer.setStyle(this.contentElementRef.nativeElement, 'webkitTransform', `${this._translateDir}(${viewport.padding}px)`);
499
+ }
500
+ }
501
+ if (this.headerElementRef) {
502
+ const scrollPosition = this.getScrollElement()[this._scrollType];
503
+ const containerOffset = this.getElementsOffset();
504
+ const offset = Math.max(scrollPosition - viewport.padding - containerOffset + this.headerElementRef.nativeElement.clientHeight, 0);
505
+ this.renderer.setStyle(this.headerElementRef.nativeElement, 'transform', `${this._translateDir}(${offset}px)`);
506
+ this.renderer.setStyle(this.headerElementRef.nativeElement, 'webkitTransform', `${this._translateDir}(${offset}px)`);
507
+ }
508
+ const changeEventArg = (startChanged || endChanged) ? {
509
+ startIndex: viewport.startIndex,
510
+ endIndex: viewport.endIndex,
511
+ scrollStartPosition: viewport.scrollStartPosition,
512
+ scrollEndPosition: viewport.scrollEndPosition,
513
+ scrollDirection: scrollDirection,
514
+ startIndexWithBuffer: viewport.startIndexWithBuffer,
515
+ endIndexWithBuffer: viewport.endIndexWithBuffer,
516
+ maxScrollPosition: viewport.maxScrollPosition,
517
+ } : undefined;
518
+ if (startChanged || endChanged || scrollPositionChanged) {
519
+ const handleChanged = () => {
520
+ // update the scroll list to trigger re-render of components in viewport
521
+ this.viewPortItems = viewport.startIndexWithBuffer >= 0 && viewport.endIndexWithBuffer >= 0 ? this.items.slice(viewport.startIndexWithBuffer, viewport.endIndexWithBuffer + 1) : [];
522
+ this.vsUpdate.emit(this.viewPortItems);
523
+ if (startChanged) {
524
+ this.vsStart.emit(changeEventArg);
525
+ }
526
+ if (endChanged) {
527
+ this.vsEnd.emit(changeEventArg);
528
+ }
529
+ if (startChanged || endChanged) {
530
+ this.changeDetectorRef.markForCheck();
531
+ this.vsChange.emit(changeEventArg);
532
+ }
533
+ if (maxRunTimes > 0) {
534
+ this.refresh_internal(false, refreshCompletedCallback, maxRunTimes - 1);
535
+ return;
536
+ }
537
+ if (refreshCompletedCallback) {
538
+ refreshCompletedCallback();
539
+ }
540
+ };
541
+ if (this.executeRefreshOutsideAngularZone) {
542
+ handleChanged();
543
+ }
544
+ else {
545
+ this.zone.run(handleChanged);
546
+ }
547
+ }
548
+ else {
549
+ if (maxRunTimes > 0 && (scrollLengthChanged || paddingChanged)) {
550
+ this.refresh_internal(false, refreshCompletedCallback, maxRunTimes - 1);
551
+ return;
552
+ }
553
+ if (refreshCompletedCallback) {
554
+ refreshCompletedCallback();
555
+ }
556
+ }
557
+ });
558
+ });
559
+ }
560
+ getScrollElement() {
561
+ return this.parentScroll instanceof Window ? document.scrollingElement || document.documentElement || document.body : this.parentScroll || this.element.nativeElement;
562
+ }
563
+ addScrollEventHandlers() {
564
+ if (this.isAngularUniversalSSR) {
565
+ return;
566
+ }
567
+ const scrollElement = this.getScrollElement();
568
+ this.removeScrollEventHandlers();
569
+ this.zone.runOutsideAngular(() => {
570
+ if (this.parentScroll instanceof Window) {
571
+ this.disposeScrollHandler = this.renderer.listen('window', 'scroll', this.onScroll);
572
+ this.disposeResizeHandler = this.renderer.listen('window', 'resize', this.onScroll);
573
+ }
574
+ else {
575
+ this.disposeScrollHandler = this.renderer.listen(scrollElement, 'scroll', this.onScroll);
576
+ if (this._checkResizeInterval > 0) {
577
+ this.checkScrollElementResizedTimer = setInterval(() => { this.checkScrollElementResized(); }, this._checkResizeInterval);
578
+ }
579
+ }
580
+ });
581
+ }
582
+ removeScrollEventHandlers() {
583
+ if (this.checkScrollElementResizedTimer) {
584
+ clearInterval(this.checkScrollElementResizedTimer);
585
+ }
586
+ if (this.disposeScrollHandler) {
587
+ this.disposeScrollHandler();
588
+ this.disposeScrollHandler = undefined;
589
+ }
590
+ if (this.disposeResizeHandler) {
591
+ this.disposeResizeHandler();
592
+ this.disposeResizeHandler = undefined;
593
+ }
594
+ }
595
+ getElementsOffset() {
596
+ if (this.isAngularUniversalSSR) {
597
+ return 0;
598
+ }
599
+ let offset = 0;
600
+ if (this.containerElementRef && this.containerElementRef.nativeElement) {
601
+ offset += this.containerElementRef.nativeElement[this._offsetType];
602
+ }
603
+ if (this.parentScroll) {
604
+ const scrollElement = this.getScrollElement();
605
+ const elementClientRect = this.getElementSize(this.element.nativeElement);
606
+ const scrollClientRect = this.getElementSize(scrollElement);
607
+ if (this.horizontal) {
608
+ offset += elementClientRect.left - scrollClientRect.left;
609
+ }
610
+ else {
611
+ offset += elementClientRect.top - scrollClientRect.top;
612
+ }
613
+ if (!(this.parentScroll instanceof Window)) {
614
+ offset += scrollElement[this._scrollType];
615
+ }
616
+ }
617
+ return offset;
618
+ }
619
+ countItemsPerWrapGroup() {
620
+ if (this.isAngularUniversalSSR) {
621
+ return Math.round(this.horizontal ? this.ssrViewportHeight / this.ssrChildHeight : this.ssrViewportWidth / this.ssrChildWidth);
622
+ }
623
+ const propertyName = this.horizontal ? 'offsetLeft' : 'offsetTop';
624
+ const children = ((this.containerElementRef && this.containerElementRef.nativeElement) || this.contentElementRef.nativeElement).children;
625
+ const childrenLength = children ? children.length : 0;
626
+ if (childrenLength === 0) {
627
+ return 1;
628
+ }
629
+ const firstOffset = children[0][propertyName];
630
+ let result = 1;
631
+ while (result < childrenLength && firstOffset === children[result][propertyName]) {
632
+ ++result;
633
+ }
634
+ return result;
635
+ }
636
+ getScrollStartPosition() {
637
+ let windowScrollValue = undefined;
638
+ if (this.parentScroll instanceof Window) {
639
+ windowScrollValue = window[this._pageOffsetType];
640
+ }
641
+ return windowScrollValue || this.getScrollElement()[this._scrollType] || 0;
642
+ }
643
+ resetWrapGroupDimensions() {
644
+ const oldWrapGroupDimensions = this.wrapGroupDimensions;
645
+ this.invalidateAllCachedMeasurements();
646
+ if (!this.enableUnequalChildrenSizes || !oldWrapGroupDimensions || oldWrapGroupDimensions.numberOfKnownWrapGroupChildSizes === 0) {
647
+ return;
648
+ }
649
+ const itemsPerWrapGroup = this.countItemsPerWrapGroup();
650
+ for (let wrapGroupIndex = 0; wrapGroupIndex < oldWrapGroupDimensions.maxChildSizePerWrapGroup.length; ++wrapGroupIndex) {
651
+ const oldWrapGroupDimension = oldWrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex];
652
+ if (!oldWrapGroupDimension || !oldWrapGroupDimension.items || !oldWrapGroupDimension.items.length) {
653
+ continue;
654
+ }
655
+ if (oldWrapGroupDimension.items.length !== itemsPerWrapGroup) {
656
+ return;
657
+ }
658
+ let itemsChanged = false;
659
+ const arrayStartIndex = itemsPerWrapGroup * wrapGroupIndex;
660
+ for (let i = 0; i < itemsPerWrapGroup; ++i) {
661
+ if (!this.compareItems(oldWrapGroupDimension.items[i], this.items[arrayStartIndex + i])) {
662
+ itemsChanged = true;
663
+ break;
664
+ }
665
+ }
666
+ if (!itemsChanged) {
667
+ ++this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;
668
+ this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths += oldWrapGroupDimension.childWidth || 0;
669
+ this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights += oldWrapGroupDimension.childHeight || 0;
670
+ this.wrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex] = oldWrapGroupDimension;
671
+ }
672
+ }
673
+ }
674
+ calculateDimensions() {
675
+ const scrollElement = this.getScrollElement();
676
+ const maxCalculatedScrollBarSize = 25; // Note: Formula to auto-calculate doesn't work for ParentScroll, so we default to this if not set by consuming application
677
+ this.calculatedScrollbarHeight = Math.max(Math.min(scrollElement.offsetHeight - scrollElement.clientHeight, maxCalculatedScrollBarSize), this.calculatedScrollbarHeight);
678
+ this.calculatedScrollbarWidth = Math.max(Math.min(scrollElement.offsetWidth - scrollElement.clientWidth, maxCalculatedScrollBarSize), this.calculatedScrollbarWidth);
679
+ let viewportWidth = scrollElement.offsetWidth - (this.scrollbarWidth || this.calculatedScrollbarWidth || (this.horizontal ? 0 : maxCalculatedScrollBarSize));
680
+ let viewportHeight = scrollElement.offsetHeight - (this.scrollbarHeight || this.calculatedScrollbarHeight || (this.horizontal ? maxCalculatedScrollBarSize : 0));
681
+ const content = (this.containerElementRef && this.containerElementRef.nativeElement) || this.contentElementRef.nativeElement;
682
+ const itemsPerWrapGroup = this.countItemsPerWrapGroup();
683
+ let wrapGroupsPerPage;
684
+ let defaultChildWidth;
685
+ let defaultChildHeight;
686
+ if (this.isAngularUniversalSSR) {
687
+ viewportWidth = this.ssrViewportWidth;
688
+ viewportHeight = this.ssrViewportHeight;
689
+ defaultChildWidth = this.ssrChildWidth;
690
+ defaultChildHeight = this.ssrChildHeight;
691
+ const itemsPerRow = Math.max(Math.ceil(viewportWidth / defaultChildWidth), 1);
692
+ const itemsPerCol = Math.max(Math.ceil(viewportHeight / defaultChildHeight), 1);
693
+ wrapGroupsPerPage = this.horizontal ? itemsPerRow : itemsPerCol;
694
+ }
695
+ else if (!this.enableUnequalChildrenSizes) {
696
+ if (content.children.length > 0) {
697
+ if (!this.childWidth || !this.childHeight) {
698
+ if (!this.minMeasuredChildWidth && viewportWidth > 0) {
699
+ this.minMeasuredChildWidth = viewportWidth;
700
+ }
701
+ if (!this.minMeasuredChildHeight && viewportHeight > 0) {
702
+ this.minMeasuredChildHeight = viewportHeight;
703
+ }
704
+ }
705
+ const child = content.children[0];
706
+ const clientRect = this.getElementSize(child);
707
+ this.minMeasuredChildWidth = Math.min(this.minMeasuredChildWidth, clientRect.width);
708
+ this.minMeasuredChildHeight = Math.min(this.minMeasuredChildHeight, clientRect.height);
709
+ // Added for getting the child height (for card view, return all the clientRect object).
710
+ if (this._lastChildRect?.height !== clientRect?.height ||
711
+ this._lastChildRect?.width !== clientRect?.width) {
712
+ this._lastChildRect = clientRect;
713
+ this.vsChildRectChange.emit(clientRect);
714
+ }
715
+ }
716
+ defaultChildWidth = this.childWidth || this.minMeasuredChildWidth || viewportWidth;
717
+ defaultChildHeight = this.childHeight || this.minMeasuredChildHeight || viewportHeight;
718
+ const itemsPerRow = Math.max(Math.ceil(viewportWidth / defaultChildWidth), 1);
719
+ const itemsPerCol = Math.max(Math.ceil(viewportHeight / defaultChildHeight), 1);
720
+ wrapGroupsPerPage = this.horizontal ? itemsPerRow : itemsPerCol;
721
+ }
722
+ else {
723
+ let scrollOffset = scrollElement[this._scrollType] - (this.previousViewPort ? this.previousViewPort.padding : 0);
724
+ let arrayStartIndex = this.previousViewPort.startIndexWithBuffer || 0;
725
+ let wrapGroupIndex = Math.ceil(arrayStartIndex / itemsPerWrapGroup);
726
+ let maxWidthForWrapGroup = 0;
727
+ let maxHeightForWrapGroup = 0;
728
+ let sumOfVisibleMaxWidths = 0;
729
+ let sumOfVisibleMaxHeights = 0;
730
+ wrapGroupsPerPage = 0;
731
+ for (let i = 0; i < content.children.length; ++i) {
732
+ ++arrayStartIndex;
733
+ const child = content.children[i];
734
+ const clientRect = this.getElementSize(child);
735
+ maxWidthForWrapGroup = Math.max(maxWidthForWrapGroup, clientRect.width);
736
+ maxHeightForWrapGroup = Math.max(maxHeightForWrapGroup, clientRect.height);
737
+ if (arrayStartIndex % itemsPerWrapGroup === 0) {
738
+ const oldValue = this.wrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex];
739
+ if (oldValue) {
740
+ --this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;
741
+ this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths -= oldValue.childWidth || 0;
742
+ this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights -= oldValue.childHeight || 0;
743
+ }
744
+ ++this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;
745
+ const items = this.items.slice(arrayStartIndex - itemsPerWrapGroup, arrayStartIndex);
746
+ this.wrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex] = {
747
+ childWidth: maxWidthForWrapGroup,
748
+ childHeight: maxHeightForWrapGroup,
749
+ items: items
750
+ };
751
+ this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths += maxWidthForWrapGroup;
752
+ this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights += maxHeightForWrapGroup;
753
+ if (this.horizontal) {
754
+ let maxVisibleWidthForWrapGroup = Math.min(maxWidthForWrapGroup, Math.max(viewportWidth - sumOfVisibleMaxWidths, 0));
755
+ if (scrollOffset > 0) {
756
+ const scrollOffsetToRemove = Math.min(scrollOffset, maxVisibleWidthForWrapGroup);
757
+ maxVisibleWidthForWrapGroup -= scrollOffsetToRemove;
758
+ scrollOffset -= scrollOffsetToRemove;
759
+ }
760
+ sumOfVisibleMaxWidths += maxVisibleWidthForWrapGroup;
761
+ if (maxVisibleWidthForWrapGroup > 0 && viewportWidth >= sumOfVisibleMaxWidths) {
762
+ ++wrapGroupsPerPage;
763
+ }
764
+ }
765
+ else {
766
+ let maxVisibleHeightForWrapGroup = Math.min(maxHeightForWrapGroup, Math.max(viewportHeight - sumOfVisibleMaxHeights, 0));
767
+ if (scrollOffset > 0) {
768
+ const scrollOffsetToRemove = Math.min(scrollOffset, maxVisibleHeightForWrapGroup);
769
+ maxVisibleHeightForWrapGroup -= scrollOffsetToRemove;
770
+ scrollOffset -= scrollOffsetToRemove;
771
+ }
772
+ sumOfVisibleMaxHeights += maxVisibleHeightForWrapGroup;
773
+ if (maxVisibleHeightForWrapGroup > 0 && viewportHeight >= sumOfVisibleMaxHeights) {
774
+ ++wrapGroupsPerPage;
775
+ }
776
+ }
777
+ ++wrapGroupIndex;
778
+ maxWidthForWrapGroup = 0;
779
+ maxHeightForWrapGroup = 0;
780
+ }
781
+ }
782
+ const averageChildWidth = this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths / this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;
783
+ const averageChildHeight = this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights / this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;
784
+ defaultChildWidth = this.childWidth || averageChildWidth || viewportWidth;
785
+ defaultChildHeight = this.childHeight || averageChildHeight || viewportHeight;
786
+ if (this.horizontal) {
787
+ if (viewportWidth > sumOfVisibleMaxWidths) {
788
+ wrapGroupsPerPage += Math.ceil((viewportWidth - sumOfVisibleMaxWidths) / defaultChildWidth);
789
+ }
790
+ }
791
+ else {
792
+ if (viewportHeight > sumOfVisibleMaxHeights) {
793
+ wrapGroupsPerPage += Math.ceil((viewportHeight - sumOfVisibleMaxHeights) / defaultChildHeight);
794
+ }
795
+ }
796
+ }
797
+ const itemCount = this.items.length;
798
+ const itemsPerPage = itemsPerWrapGroup * wrapGroupsPerPage;
799
+ const pageCount_fractional = itemCount / itemsPerPage;
800
+ const numberOfWrapGroups = Math.ceil(itemCount / itemsPerWrapGroup);
801
+ let scrollLength = 0;
802
+ const defaultScrollLengthPerWrapGroup = this.horizontal ? defaultChildWidth : defaultChildHeight;
803
+ if (this.enableUnequalChildrenSizes) {
804
+ let numUnknownChildSizes = 0;
805
+ for (let i = 0; i < numberOfWrapGroups; ++i) {
806
+ const childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[i] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[i][this._childScrollDim];
807
+ if (childSize) {
808
+ scrollLength += childSize;
809
+ }
810
+ else {
811
+ ++numUnknownChildSizes;
812
+ }
813
+ }
814
+ scrollLength += Math.round(numUnknownChildSizes * defaultScrollLengthPerWrapGroup);
815
+ }
816
+ else {
817
+ scrollLength = numberOfWrapGroups * defaultScrollLengthPerWrapGroup;
818
+ }
819
+ if (this.headerElementRef) {
820
+ scrollLength += this.headerElementRef.nativeElement.clientHeight;
821
+ }
822
+ const viewportLength = this.horizontal ? viewportWidth : viewportHeight;
823
+ const maxScrollPosition = Math.max(scrollLength - viewportLength, 0);
824
+ return {
825
+ childHeight: defaultChildHeight,
826
+ childWidth: defaultChildWidth,
827
+ itemCount: itemCount,
828
+ itemsPerPage: itemsPerPage,
829
+ itemsPerWrapGroup: itemsPerWrapGroup,
830
+ maxScrollPosition: maxScrollPosition,
831
+ pageCount_fractional: pageCount_fractional,
832
+ scrollLength: scrollLength,
833
+ viewportLength: viewportLength,
834
+ wrapGroupsPerPage: wrapGroupsPerPage,
835
+ };
836
+ }
837
+ calculatePadding(arrayStartIndexWithBuffer, dimensions) {
838
+ if (dimensions.itemCount === 0) {
839
+ return 0;
840
+ }
841
+ const defaultScrollLengthPerWrapGroup = dimensions[this._childScrollDim];
842
+ const startingWrapGroupIndex = Math.floor(arrayStartIndexWithBuffer / dimensions.itemsPerWrapGroup) || 0;
843
+ if (!this.enableUnequalChildrenSizes) {
844
+ return defaultScrollLengthPerWrapGroup * startingWrapGroupIndex;
845
+ }
846
+ let numUnknownChildSizes = 0;
847
+ let result = 0;
848
+ for (let i = 0; i < startingWrapGroupIndex; ++i) {
849
+ const childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[i] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[i][this._childScrollDim];
850
+ if (childSize) {
851
+ result += childSize;
852
+ }
853
+ else {
854
+ ++numUnknownChildSizes;
855
+ }
856
+ }
857
+ result += Math.round(numUnknownChildSizes * defaultScrollLengthPerWrapGroup);
858
+ return result;
859
+ }
860
+ calculatePageInfo(scrollPosition, dimensions) {
861
+ let scrollPercentage = 0;
862
+ if (this.enableUnequalChildrenSizes) {
863
+ const numberOfWrapGroups = Math.ceil(dimensions.itemCount / dimensions.itemsPerWrapGroup);
864
+ let totalScrolledLength = 0;
865
+ const defaultScrollLengthPerWrapGroup = dimensions[this._childScrollDim];
866
+ for (let i = 0; i < numberOfWrapGroups; ++i) {
867
+ const childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[i] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[i][this._childScrollDim];
868
+ if (childSize) {
869
+ totalScrolledLength += childSize;
870
+ }
871
+ else {
872
+ totalScrolledLength += defaultScrollLengthPerWrapGroup;
873
+ }
874
+ if (scrollPosition < totalScrolledLength) {
875
+ scrollPercentage = i / numberOfWrapGroups;
876
+ break;
877
+ }
878
+ }
879
+ }
880
+ else {
881
+ scrollPercentage = scrollPosition / dimensions.scrollLength;
882
+ }
883
+ const startingArrayIndex_fractional = Math.min(Math.max(scrollPercentage * dimensions.pageCount_fractional, 0), dimensions.pageCount_fractional) * dimensions.itemsPerPage;
884
+ const maxStart = dimensions.itemCount - dimensions.itemsPerPage - 1;
885
+ let arrayStartIndex = Math.min(Math.floor(startingArrayIndex_fractional), maxStart);
886
+ arrayStartIndex -= arrayStartIndex % dimensions.itemsPerWrapGroup; // round down to start of wrapGroup
887
+ if (this.stripedTable) {
888
+ const bufferBoundary = 2 * dimensions.itemsPerWrapGroup;
889
+ if (arrayStartIndex % bufferBoundary !== 0) {
890
+ arrayStartIndex = Math.max(arrayStartIndex - arrayStartIndex % bufferBoundary, 0);
891
+ }
892
+ }
893
+ let arrayEndIndex = Math.ceil(startingArrayIndex_fractional) + dimensions.itemsPerPage - 1;
894
+ const endIndexWithinWrapGroup = (arrayEndIndex + 1) % dimensions.itemsPerWrapGroup;
895
+ if (endIndexWithinWrapGroup > 0) {
896
+ arrayEndIndex += dimensions.itemsPerWrapGroup - endIndexWithinWrapGroup; // round up to end of wrapGroup
897
+ }
898
+ if (isNaN(arrayStartIndex)) {
899
+ arrayStartIndex = 0;
900
+ }
901
+ if (isNaN(arrayEndIndex)) {
902
+ arrayEndIndex = 0;
903
+ }
904
+ arrayStartIndex = Math.min(Math.max(arrayStartIndex, 0), dimensions.itemCount - 1);
905
+ arrayEndIndex = Math.min(Math.max(arrayEndIndex, 0), dimensions.itemCount - 1);
906
+ const bufferSize = this.bufferAmount * dimensions.itemsPerWrapGroup;
907
+ const startIndexWithBuffer = Math.min(Math.max(arrayStartIndex - bufferSize, 0), dimensions.itemCount - 1);
908
+ const endIndexWithBuffer = Math.min(Math.max(arrayEndIndex + bufferSize, 0), dimensions.itemCount - 1);
909
+ return {
910
+ startIndex: arrayStartIndex,
911
+ endIndex: arrayEndIndex,
912
+ startIndexWithBuffer: startIndexWithBuffer,
913
+ endIndexWithBuffer: endIndexWithBuffer,
914
+ scrollStartPosition: scrollPosition,
915
+ scrollEndPosition: scrollPosition + dimensions.viewportLength,
916
+ maxScrollPosition: dimensions.maxScrollPosition
917
+ };
918
+ }
919
+ calculateViewport() {
920
+ const dimensions = this.calculateDimensions();
921
+ const offset = this.getElementsOffset();
922
+ let scrollStartPosition = this.getScrollStartPosition();
923
+ if (scrollStartPosition > (dimensions.scrollLength + offset) && !(this.parentScroll instanceof Window)) {
924
+ scrollStartPosition = dimensions.scrollLength;
925
+ }
926
+ else {
927
+ scrollStartPosition -= offset;
928
+ }
929
+ scrollStartPosition = Math.max(0, scrollStartPosition);
930
+ const pageInfo = this.calculatePageInfo(scrollStartPosition, dimensions);
931
+ const newPadding = this.calculatePadding(pageInfo.startIndexWithBuffer, dimensions);
932
+ const newScrollLength = dimensions.scrollLength;
933
+ return {
934
+ startIndex: pageInfo.startIndex,
935
+ endIndex: pageInfo.endIndex,
936
+ startIndexWithBuffer: pageInfo.startIndexWithBuffer,
937
+ endIndexWithBuffer: pageInfo.endIndexWithBuffer,
938
+ padding: Math.round(newPadding),
939
+ scrollLength: Math.round(newScrollLength),
940
+ scrollStartPosition: pageInfo.scrollStartPosition,
941
+ scrollEndPosition: pageInfo.scrollEndPosition,
942
+ maxScrollPosition: pageInfo.maxScrollPosition
943
+ };
944
+ }
945
+ }
946
+ VirtualScrollerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: VirtualScrollerComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }, { token: 'virtual-scroller-default-options', optional: true }], target: i0.ɵɵFactoryTarget.Component });
947
+ VirtualScrollerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: { disable: "disable", executeRefreshOutsideAngularZone: "executeRefreshOutsideAngularZone", enableUnequalChildrenSizes: "enableUnequalChildrenSizes", RTL: "RTL", useMarginInsteadOfTranslate: "useMarginInsteadOfTranslate", modifyOverflowStyleOfParentScroll: "modifyOverflowStyleOfParentScroll", stripedTable: "stripedTable", scrollbarWidth: "scrollbarWidth", scrollbarHeight: "scrollbarHeight", childWidth: "childWidth", childHeight: "childHeight", ssrChildWidth: "ssrChildWidth", ssrChildHeight: "ssrChildHeight", ssrViewportWidth: "ssrViewportWidth", ssrViewportHeight: "ssrViewportHeight", bufferAmount: "bufferAmount", scrollAnimationTime: "scrollAnimationTime", resizeBypassRefreshThreshold: "resizeBypassRefreshThreshold", scrollThrottlingTime: "scrollThrottlingTime", scrollDebounceTime: "scrollDebounceTime", checkResizeInterval: "checkResizeInterval", items: "items", compareItems: "compareItems", horizontal: "horizontal", parentScroll: "parentScroll" }, outputs: { vsChildRectChange: "vsChildRectChange", vsUpdate: "vsUpdate", vsChange: "vsChange", vsStart: "vsStart", vsEnd: "vsEnd" }, host: { properties: { "class.horizontal": "horizontal", "class.vertical": "!horizontal", "class.selfScroll": "!parentScroll", "class.rtl": "RTL" } }, queries: [{ propertyName: "headerElementRef", first: true, predicate: ["header"], descendants: true, read: ElementRef }, { propertyName: "containerElementRef", first: true, predicate: ["container"], descendants: true, read: ElementRef }], viewQueries: [{ propertyName: "contentElementRef", first: true, predicate: ["content"], descendants: true, read: ElementRef, static: true }, { propertyName: "invisiblePaddingElementRef", first: true, predicate: ["invisiblePadding"], descendants: true, read: ElementRef, static: true }], exportAs: ["virtualScroller"], usesOnChanges: true, ngImport: i0, template: `
948
+ <div class="total-padding" #invisiblePadding></div>
949
+ <div class="scrollable-content" #content>
950
+ <ng-content></ng-content>
951
+ </div>
952
+ `, isInline: true, styles: [":host{position:relative;display:block;-webkit-overflow-scrolling:touch}:host.horizontal.selfScroll{overflow-y:visible;overflow-x:auto}:host.horizontal.selfScroll.rtl{transform:scaleX(-1)}:host.vertical.selfScroll{overflow-y:auto;overflow-x:visible}.scrollable-content{top:0;left:0;width:100%;height:100%;max-width:100vw;max-height:100vh;position:absolute}.scrollable-content ::ng-deep>*{box-sizing:border-box}:host.horizontal{white-space:nowrap}:host.horizontal .scrollable-content{display:flex}:host.horizontal .scrollable-content ::ng-deep>*{flex-shrink:0;flex-grow:0;white-space:initial}:host.horizontal.rtl .scrollable-content ::ng-deep>*{transform:scaleX(-1)}.total-padding{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0;opacity:0}:host.horizontal .total-padding{height:100%}\n"] });
953
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: VirtualScrollerComponent, decorators: [{
954
+ type: Component,
955
+ args: [{ selector: 'virtual-scroller,[virtualScroller]', exportAs: 'virtualScroller', template: `
956
+ <div class="total-padding" #invisiblePadding></div>
957
+ <div class="scrollable-content" #content>
958
+ <ng-content></ng-content>
959
+ </div>
960
+ `, host: {
961
+ '[class.horizontal]': "horizontal",
962
+ '[class.vertical]': "!horizontal",
963
+ '[class.selfScroll]': "!parentScroll",
964
+ '[class.rtl]': "RTL"
965
+ }, styles: [":host{position:relative;display:block;-webkit-overflow-scrolling:touch}:host.horizontal.selfScroll{overflow-y:visible;overflow-x:auto}:host.horizontal.selfScroll.rtl{transform:scaleX(-1)}:host.vertical.selfScroll{overflow-y:auto;overflow-x:visible}.scrollable-content{top:0;left:0;width:100%;height:100%;max-width:100vw;max-height:100vh;position:absolute}.scrollable-content ::ng-deep>*{box-sizing:border-box}:host.horizontal{white-space:nowrap}:host.horizontal .scrollable-content{display:flex}:host.horizontal .scrollable-content ::ng-deep>*{flex-shrink:0;flex-grow:0;white-space:initial}:host.horizontal.rtl .scrollable-content ::ng-deep>*{transform:scaleX(-1)}.total-padding{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0;opacity:0}:host.horizontal .total-padding{height:100%}\n"] }]
966
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
967
+ type: Inject,
968
+ args: [PLATFORM_ID]
969
+ }] }, { type: undefined, decorators: [{
970
+ type: Optional
971
+ }, {
972
+ type: Inject,
973
+ args: ['virtual-scroller-default-options']
974
+ }] }]; }, propDecorators: { disable: [{
975
+ type: Input
976
+ }], executeRefreshOutsideAngularZone: [{
977
+ type: Input
978
+ }], enableUnequalChildrenSizes: [{
979
+ type: Input
980
+ }], RTL: [{
981
+ type: Input
982
+ }], useMarginInsteadOfTranslate: [{
983
+ type: Input
984
+ }], modifyOverflowStyleOfParentScroll: [{
985
+ type: Input
986
+ }], stripedTable: [{
987
+ type: Input
988
+ }], scrollbarWidth: [{
989
+ type: Input
990
+ }], scrollbarHeight: [{
991
+ type: Input
992
+ }], childWidth: [{
993
+ type: Input
994
+ }], childHeight: [{
995
+ type: Input
996
+ }], ssrChildWidth: [{
997
+ type: Input
998
+ }], ssrChildHeight: [{
999
+ type: Input
1000
+ }], ssrViewportWidth: [{
1001
+ type: Input
1002
+ }], ssrViewportHeight: [{
1003
+ type: Input
1004
+ }], bufferAmount: [{
1005
+ type: Input
1006
+ }], scrollAnimationTime: [{
1007
+ type: Input
1008
+ }], resizeBypassRefreshThreshold: [{
1009
+ type: Input
1010
+ }], scrollThrottlingTime: [{
1011
+ type: Input
1012
+ }], scrollDebounceTime: [{
1013
+ type: Input
1014
+ }], checkResizeInterval: [{
1015
+ type: Input
1016
+ }], items: [{
1017
+ type: Input
1018
+ }], compareItems: [{
1019
+ type: Input
1020
+ }], horizontal: [{
1021
+ type: Input
1022
+ }], parentScroll: [{
1023
+ type: Input
1024
+ }], vsChildRectChange: [{
1025
+ type: Output
1026
+ }], vsUpdate: [{
1027
+ type: Output
1028
+ }], vsChange: [{
1029
+ type: Output
1030
+ }], vsStart: [{
1031
+ type: Output
1032
+ }], vsEnd: [{
1033
+ type: Output
1034
+ }], contentElementRef: [{
1035
+ type: ViewChild,
1036
+ args: ['content', { read: ElementRef, static: true }]
1037
+ }], invisiblePaddingElementRef: [{
1038
+ type: ViewChild,
1039
+ args: ['invisiblePadding', { read: ElementRef, static: true }]
1040
+ }], headerElementRef: [{
1041
+ type: ContentChild,
1042
+ args: ['header', { read: ElementRef, static: false }]
1043
+ }], containerElementRef: [{
1044
+ type: ContentChild,
1045
+ args: ['container', { read: ElementRef, static: false }]
1046
+ }] } });
1047
+ export class VirtualScrollerModule {
1048
+ }
1049
+ VirtualScrollerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: VirtualScrollerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1050
+ VirtualScrollerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.2", ngImport: i0, type: VirtualScrollerModule, declarations: [VirtualScrollerComponent], imports: [CommonModule], exports: [VirtualScrollerComponent] });
1051
+ VirtualScrollerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: VirtualScrollerModule, providers: [
1052
+ {
1053
+ provide: 'virtual-scroller-default-options',
1054
+ useFactory: VIRTUAL_SCROLLER_DEFAULT_OPTIONS_FACTORY
1055
+ }
1056
+ ], imports: [CommonModule] });
1057
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: VirtualScrollerModule, decorators: [{
1058
+ type: NgModule,
1059
+ args: [{
1060
+ exports: [VirtualScrollerComponent],
1061
+ declarations: [VirtualScrollerComponent],
1062
+ imports: [CommonModule],
1063
+ providers: [
1064
+ {
1065
+ provide: 'virtual-scroller-default-options',
1066
+ useFactory: VIRTUAL_SCROLLER_DEFAULT_OPTIONS_FACTORY
1067
+ }
1068
+ ]
1069
+ }]
1070
+ }] });
1071
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1zY3JvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWIvbGlzdC92aXJ0dWFsLXNjcm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEVBS1IsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxLQUFLLEtBQUssTUFBTSxtQkFBbUIsQ0FBQTs7QUFjMUMsTUFBTSxVQUFVLHdDQUF3QztJQUN2RCxPQUFPO1FBQ04sbUJBQW1CLEVBQUUsSUFBSTtRQUN6QixpQ0FBaUMsRUFBRSxJQUFJO1FBQ3ZDLDRCQUE0QixFQUFFLENBQUM7UUFDL0IsbUJBQW1CLEVBQUUsR0FBRztRQUN4QixrQkFBa0IsRUFBRSxDQUFDO1FBQ3JCLG9CQUFvQixFQUFFLENBQUM7UUFDdkIsWUFBWSxFQUFFLEtBQUs7S0FDbkIsQ0FBQztBQUNILENBQUM7QUFzSEQsTUFBTSxPQUFPLHdCQUF3QjtJQThicEMsWUFDb0IsT0FBbUIsRUFDbkIsUUFBbUIsRUFDbkIsSUFBWSxFQUNyQixpQkFBb0MsRUFDekIsVUFBZSxFQUVwQyxPQUFzQztRQU5uQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBaGN4QyxXQUFNLEdBQUcsTUFBTSxDQUFDO1FBZ0JiLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFtQnBCLHFDQUFnQyxHQUFHLEtBQUssQ0FBQztRQUV0QyxnQ0FBMkIsR0FBRyxLQUFLLENBQUM7UUFnQnZDLFFBQUcsR0FBRyxLQUFLLENBQUM7UUFHWixnQ0FBMkIsR0FBRyxLQUFLLENBQUM7UUEyQnBDLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUd4QixzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUEyRXRCLFdBQU0sR0FBVSxFQUFFLENBQUM7UUFldEIsaUJBQVksR0FBd0MsQ0FBQyxLQUFVLEVBQUUsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDO1FBZ0RoRyxzQkFBaUIsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUc3RSxhQUFRLEdBQXdCLElBQUksWUFBWSxFQUFTLENBQUM7UUFHMUQsYUFBUSxHQUE0QixJQUFJLFlBQVksRUFBYSxDQUFDO1FBR2xFLFlBQU8sR0FBNEIsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUdqRSxVQUFLLEdBQTRCLElBQUksWUFBWSxFQUFhLENBQUM7UUF3VjVELDZCQUF3QixHQUFHLENBQUMsQ0FBQztRQUM3Qiw4QkFBeUIsR0FBRyxDQUFDLENBQUM7UUFFOUIsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLHFCQUFnQixHQUFtQixFQUFFLENBQUM7UUFrZXRDLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLGlDQUE0QixHQUFHLENBQUMsQ0FBQztRQXJtQjFDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBQ3ZELElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxPQUFPLENBQUMsaUNBQWlDLENBQUM7UUFDbkYsSUFBSSxDQUFDLDRCQUE0QixHQUFHLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQztRQUN6RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBQ3ZELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDckQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztRQUN6RCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUV6QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBbGRELElBQVcsWUFBWTtRQUN0QixNQUFNLFFBQVEsR0FBYyxJQUFJLENBQUMsZ0JBQWdCLElBQVMsRUFBRSxDQUFDO1FBQzdELE9BQU87WUFDTixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsSUFBSSxDQUFDO1lBQ3BDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUM7WUFDaEMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLG1CQUFtQixJQUFJLENBQUM7WUFDdEQsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixJQUFJLENBQUM7WUFDbEQsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlLElBQUksU0FBUztZQUN0RCxpQkFBaUIsRUFBRSxRQUFRLENBQUMsaUJBQWlCLElBQUksQ0FBQztZQUNsRCxvQkFBb0IsRUFBRSxRQUFRLENBQUMsb0JBQW9CLElBQUksQ0FBQztZQUN4RCxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCLElBQUksQ0FBQztTQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUdELElBQ1csT0FBTztRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdEIsQ0FBQztJQUNELElBQVcsT0FBTyxDQUFDLEtBQWM7UUFDaEMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRTtZQUM1QixPQUFPO1NBQ1A7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7U0FDakM7YUFBTTtZQUNOLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQzlCO0lBQ0YsQ0FBQztJQU1ELElBQ1csMEJBQTBCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFXLDBCQUEwQixDQUFDLEtBQWM7UUFDbkQsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEtBQUssS0FBSyxFQUFFO1lBQy9DLE9BQU87U0FDUDtRQUVELElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0lBQ3pDLENBQUM7SUF1Q0QsSUFDVyxZQUFZO1FBQ3RCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUU7WUFDdkUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQzFCO2FBQU07WUFDTixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDL0M7SUFDRixDQUFDO0lBQ0QsSUFBVyxZQUFZLENBQUMsS0FBYTtRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBU0QsSUFDVyxvQkFBb0I7UUFDOUIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQVcsb0JBQW9CLENBQUMsS0FBYTtRQUM1QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFHRCxJQUNXLGtCQUFrQjtRQUM1QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBVyxrQkFBa0IsQ0FBQyxLQUFhO1FBQzFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUdTLHNCQUFzQjtRQUMvQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUM1QixJQUFJLENBQUMsUUFBUSxHQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzVCO2FBQ0ksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFO2dCQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQzlCO2FBQ0k7WUFDSixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQztTQUNGO0lBQ0YsQ0FBQztJQUlELElBQ1csbUJBQW1CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFXLG1CQUFtQixDQUFDLEtBQWE7UUFDM0MsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssS0FBSyxFQUFFO1lBQ3hDLE9BQU87U0FDUDtRQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUdELElBQ1csS0FBSztRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBVyxLQUFLLENBQUMsS0FBWTtRQUM1QixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzFCLE9BQU87U0FDUDtRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQU1ELElBQ1csVUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDekIsQ0FBQztJQUNELElBQVcsVUFBVSxDQUFDLEtBQWM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFUyxzQkFBc0I7UUFDL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUMsSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ2xELGFBQWEsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztZQUNuRSxhQUFhLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzFDLENBQUM7SUFJRCxJQUNXLFlBQVk7UUFDdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFXLFlBQVksQ0FBQyxLQUF1QjtRQUM5QyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxFQUFFO1lBQ2pDLE9BQU87U0FDUDtRQUVELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGlDQUFpQyxJQUFJLGFBQWEsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtZQUMzRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzlHLGFBQWEsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDekUsYUFBYSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUN6RTtJQUNGLENBQUM7SUErQk0sUUFBUTtRQUNkLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTSxXQUFXO1FBQ2pCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBWTtRQUM5QixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN4RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFM0MsTUFBTSxRQUFRLEdBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUNySCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLElBQUksUUFBUSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLFNBQVM7UUFDZixJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNqRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLE9BQU87U0FDUDtRQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pGLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMxRyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7b0JBQ3pCLE1BQU07aUJBQ047YUFDRDtZQUNELElBQUksaUJBQWlCLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QjtTQUNEO0lBQ0YsQ0FBQztJQUVNLE9BQU87UUFDYixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVNLCtCQUErQjtRQUNyQyxJQUFJLENBQUMsbUJBQW1CLEdBQUc7WUFDMUIsd0JBQXdCLEVBQUUsRUFBRTtZQUM1QixnQ0FBZ0MsRUFBRSxDQUFDO1lBQ25DLDhCQUE4QixFQUFFLENBQUM7WUFDakMsK0JBQStCLEVBQUUsQ0FBQztTQUNsQyxDQUFDO1FBRUYsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO1FBRXhDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sa0NBQWtDLENBQUMsSUFBUztRQUNsRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JELElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtnQkFDZixJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0M7U0FDRDthQUFNO1lBQ04sSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztZQUN2QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxrQ0FBa0MsQ0FBQyxLQUFhO1FBQ3RELElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQ3BDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25GLElBQUksaUJBQWlCLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUM7Z0JBQ3JFLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdDQUFnQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsOEJBQThCLElBQUksaUJBQWlCLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztnQkFDN0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLCtCQUErQixJQUFJLGlCQUFpQixDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7YUFDL0Y7U0FDRDthQUFNO1lBQ04sSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztZQUN2QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxVQUFVLENBQUMsSUFBUyxFQUFFLGdCQUFnQixHQUFHLElBQUksRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsd0JBQWdDLFNBQVMsRUFBRSw2QkFBeUMsU0FBUztRQUN4SyxNQUFNLEtBQUssR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNqQixPQUFPO1NBQ1A7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFTSxhQUFhLENBQUMsS0FBYSxFQUFFLGdCQUFnQixHQUFHLElBQUksRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsd0JBQWdDLFNBQVMsRUFBRSw2QkFBeUMsU0FBUztRQUMvSyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFbkIsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO1lBQzFCLEVBQUUsVUFBVSxDQUFDO1lBQ2IsSUFBSSxVQUFVLElBQUksQ0FBQyxFQUFFO2dCQUNwQixJQUFJLDBCQUEwQixFQUFFO29CQUMvQiwwQkFBMEIsRUFBRSxDQUFDO2lCQUM3QjtnQkFDRCxPQUFPO2FBQ1A7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM5QyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEtBQUssaUJBQWlCLEVBQUU7Z0JBQzNELElBQUksMEJBQTBCLEVBQUU7b0JBQy9CLDBCQUEwQixFQUFFLENBQUM7aUJBQzdCO2dCQUNELE9BQU87YUFDUDtZQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzFGLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDOUcsQ0FBQztJQUVTLHNCQUFzQixDQUFDLEtBQWEsRUFBRSxnQkFBZ0IsR0FBRyxJQUFJLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLHdCQUFnQyxTQUFTLEVBQUUsNkJBQXlDLFNBQVM7UUFDM0wscUJBQXFCLEdBQUcscUJBQXFCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBRS9HLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7UUFDekUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3RCLE1BQU0sSUFBSSxVQUFVLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUMxRTtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsY0FBc0IsRUFBRSx3QkFBZ0MsU0FBUyxFQUFFLDZCQUF5QyxTQUFTO1FBQzVJLGNBQWMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUUzQyxxQkFBcUIsR0FBRyxxQkFBcUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7UUFFL0csTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFOUMsSUFBSSxnQkFBd0IsQ0FBQztRQUU3QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztTQUM5QjtRQUVELElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLDBCQUEwQixDQUFDLENBQUM7WUFDekQsT0FBTztTQUNQO1FBRUQsTUFBTSxjQUFjLEdBQUcsRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBRTNFLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7YUFDOUMsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUscUJBQXFCLENBQUM7YUFDN0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQzthQUNsQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQy9CLE9BQU87YUFDUDtZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNoRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNaLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxFQUFFLENBQUM7UUFFVixNQUFNLE9BQU8sR0FBRyxDQUFDLElBQWEsRUFBRSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRTtnQkFDN0IsT0FBTzthQUNQO1lBRUQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixJQUFJLGNBQWMsQ0FBQyxjQUFjLEtBQUssY0FBYyxFQUFFO2dCQUNyRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLDBCQUEwQixDQUFDLENBQUM7Z0JBQ3pELE9BQU87YUFDUDtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO2dCQUNoQyxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGLE9BQU8sRUFBRSxDQUFDO1FBQ1YsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQThCUyxjQUFjLENBQUMsT0FBb0I7UUFDNUMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDL0MsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUQsT0FBTztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLFNBQVM7WUFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsWUFBWTtZQUNwQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVO1lBQzlCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLFdBQVc7WUFDakMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLFdBQVc7WUFDOUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLFlBQVk7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFHUyx5QkFBeUI7UUFDbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLElBQUksV0FBb0IsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQ3JDLFdBQVcsR0FBRyxJQUFJLENBQUM7U0FDbkI7YUFBTTtZQUNOLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1RixXQUFXLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDO1NBQ2xIO1FBRUQsSUFBSSxXQUFXLEVBQUU7WUFDaEIsSUFBSSxDQUFDLDBCQUEwQixHQUFHLFlBQVksQ0FBQztZQUMvQyxJQUFJLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDN0I7U0FDRDtJQUNGLENBQUM7SUFTUyxlQUFlO1FBQ3hCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQztZQUNwQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsUUFBUSxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsYUFBYSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1NBQ2xDO2FBQ0k7WUFDSixJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQztZQUNyQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsUUFBUSxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsYUFBYSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1NBQ2xDO0lBQ0YsQ0FBQztJQUVTLFFBQVEsQ0FBQyxJQUFnQixFQUFFLElBQVksRUFBRSxHQUFHLElBQUk7UUFDekQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRztZQUNkLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3RCLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRztZQUNsQixTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxJQUFnQixFQUFFLElBQVksRUFBRSxHQUFHLElBQUk7UUFDakUsSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3hCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUN0QixNQUFNLE1BQU0sR0FBRztZQUNkLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQztZQUNuQixVQUFVLEdBQUcsSUFBSSxDQUFBO1lBRWpCLElBQUksT0FBTyxFQUFFO2dCQUNaLE9BQU87YUFDUDtZQUVELElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtnQkFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM5QjtpQkFBTTtnQkFDTixPQUFPLEdBQUcsVUFBVSxDQUFDO29CQUNwQixPQUFPLEdBQUcsU0FBUyxDQUFDO29CQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDL0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ1Q7UUFDRixDQUFDLENBQUM7UUFDRixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUc7WUFDbEIsSUFBSSxPQUFPLEVBQUU7Z0JBQ1osWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN0QixPQUFPLEdBQUcsU0FBUyxDQUFDO2FBQ3BCO1FBQ0YsQ0FBQyxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBYVMsZ0JBQWdCLENBQUMsa0JBQTJCLEVBQUUsMkJBQXVDLFNBQVMsRUFBRSxXQUFXLEdBQUcsQ0FBQztRQUN4SCxxS0FBcUs7UUFDckssMkdBQTJHO1FBQzNHLDBPQUEwTztRQUMxTyxnUUFBZ1E7UUFFaFEsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRTtZQUNqRyxvRUFBb0U7WUFDcEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUU1QyxNQUFNLDJCQUEyQixHQUFHLHdCQUF3QixDQUFDO1lBQzdELHdCQUF3QixHQUFHLEdBQUcsRUFBRTtnQkFDL0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7Z0JBQ3hGLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7b0JBQ2hELE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDeEYsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUU7d0JBQ25FLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO3dCQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7NEJBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDL0UsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dDQUN4QixNQUFNOzZCQUNOO3lCQUNEO3dCQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRTs0QkFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsMkJBQTJCLENBQUMsQ0FBQzs0QkFDckgsT0FBTzt5QkFDUDtxQkFDRDtpQkFDRDtnQkFFRCxJQUFJLDJCQUEyQixFQUFFO29CQUNoQywyQkFBMkIsRUFBRSxDQUFDO2lCQUM5QjtZQUNGLENBQUMsQ0FBQztTQUNGO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDaEMscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUUxQixJQUFJLGtCQUFrQixFQUFFO29CQUN2QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztpQkFDaEM7Z0JBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBRTFDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztnQkFDcEcsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO2dCQUM5RixNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQztnQkFDekYsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2dCQUMxRSxNQUFNLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLElBQUksUUFBUSxDQUFDLGlCQUFpQixLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsSUFBSSxRQUFRLENBQUMsaUJBQWlCLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDO2dCQUU3UCxNQUFNLGVBQWUsR0FBd0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztnQkFDMUgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztnQkFFakMsSUFBSSxtQkFBbUIsRUFBRTtvQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMseUJBQXlCLElBQUksUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7b0JBQ2xKLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLENBQUMseUJBQXlCLElBQUksUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7aUJBQ3hKO2dCQUVELElBQUksY0FBYyxFQUFFO29CQUNuQixJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRTt3QkFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7cUJBQ3ZHO3lCQUNJO3dCQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQzt3QkFDMUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUM7cUJBQ2hJO2lCQUNEO2dCQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO29CQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ2pFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDbkksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLE1BQU0sS0FBSyxDQUFDLENBQUM7b0JBQy9HLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLE1BQU0sS0FBSyxDQUFDLENBQUM7aUJBQ3JIO2dCQUVELE1BQU0sY0FBYyxHQUFjLENBQUMsWUFBWSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO29CQUMvQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7b0JBQzNCLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxtQkFBbUI7b0JBQ2pELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7b0JBQzdDLGVBQWUsRUFBRSxlQUFlO29CQUNoQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsb0JBQW9CO29CQUNuRCxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO29CQUMvQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsaUJBQWlCO2lCQUM3QyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBR2QsSUFBSSxZQUFZLElBQUksVUFBVSxJQUFJLHFCQUFxQixFQUFFO29CQUN4RCxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7d0JBQzFCLHdFQUF3RTt3QkFDeEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDcEwsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUV2QyxJQUFJLFlBQVksRUFBRTs0QkFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7eUJBQ2xDO3dCQUVELElBQUksVUFBVSxFQUFFOzRCQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO3lCQUNoQzt3QkFFRCxJQUFJLFlBQVksSUFBSSxVQUFVLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs0QkFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7eUJBQ25DO3dCQUVELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTs0QkFDcEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQ3hFLE9BQU87eUJBQ1A7d0JBRUQsSUFBSSx3QkFBd0IsRUFBRTs0QkFDN0Isd0JBQXdCLEVBQUUsQ0FBQzt5QkFDM0I7b0JBQ0YsQ0FBQyxDQUFDO29CQUdGLElBQUksSUFBSSxDQUFDLGdDQUFnQyxFQUFFO3dCQUMxQyxhQUFhLEVBQUUsQ0FBQztxQkFDaEI7eUJBQ0k7d0JBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7cUJBQzdCO2lCQUNEO3FCQUFNO29CQUNOLElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLGNBQWMsQ0FBQyxFQUFFO3dCQUMvRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLHdCQUF3QixFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDeEUsT0FBTztxQkFDUDtvQkFFRCxJQUFJLHdCQUF3QixFQUFFO3dCQUM3Qix3QkFBd0IsRUFBRSxDQUFDO3FCQUMzQjtpQkFDRDtZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFlBQVksWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDdkssQ0FBQztJQUVTLHNCQUFzQjtRQUMvQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixPQUFPO1NBQ1A7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU5QyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUVqQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNoQyxJQUFJLElBQUksQ0FBQyxZQUFZLFlBQVksTUFBTSxFQUFFO2dCQUN4QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNwRjtpQkFDSTtnQkFDSixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3pGLElBQUksSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLDhCQUE4QixHQUFRLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztpQkFDL0g7YUFDRDtRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVTLHlCQUF5QjtRQUNsQyxJQUFJLElBQUksQ0FBQyw4QkFBOEIsRUFBRTtZQUN4QyxhQUFhLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDbkQ7UUFFRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM5QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztTQUN0QztJQUNGLENBQUM7SUFFUyxpQkFBaUI7UUFDMUIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDL0IsT0FBTyxDQUFDLENBQUM7U0FDVDtRQUVELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVmLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUU7WUFDdkUsTUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ25FO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1RCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2FBQ3pEO2lCQUNJO2dCQUNKLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDO2FBQ3ZEO1lBRUQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksWUFBWSxNQUFNLENBQUMsRUFBRTtnQkFDM0MsTUFBTSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDMUM7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVTLHNCQUFzQjtRQUMvQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDL0g7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUNsRSxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDO1FBRXpJLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksY0FBYyxLQUFLLENBQUMsRUFBRTtZQUN6QixPQUFPLENBQUMsQ0FBQztTQUNUO1FBRUQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLE9BQU8sTUFBTSxHQUFHLGNBQWMsSUFBSSxXQUFXLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2pGLEVBQUUsTUFBTSxDQUFDO1NBQ1Q7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFUyxzQkFBc0I7UUFDL0IsSUFBSSxpQkFBaUIsR0FBRyxTQUFTLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsWUFBWSxZQUFZLE1BQU0sRUFBRTtZQUN4QyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFPUyx3QkFBd0I7UUFDakMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDeEQsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFFdkMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsSUFBSSxDQUFDLHNCQUFzQixJQUFJLHNCQUFzQixDQUFDLGdDQUFnQyxLQUFLLENBQUMsRUFBRTtZQUNqSSxPQUFPO1NBQ1A7UUFFRCxNQUFNLGlCQUFpQixHQUFXLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2hFLEtBQUssSUFBSSxjQUFjLEdBQUcsQ0FBQyxFQUFFLGNBQWMsR0FBRyxzQkFBc0IsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUU7WUFDdkgsTUFBTSxxQkFBcUIsR0FBdUIsc0JBQXNCLENBQUMsd0JBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEgsSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDbEcsU0FBUzthQUNUO1lBRUQsSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLGlCQUFpQixFQUFFO2dCQUM3RCxPQUFPO2FBQ1A7WUFFRCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLEdBQUcsY0FBYyxDQUFDO1lBQzNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3hGLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQ3BCLE1BQU07aUJBQ047YUFDRDtZQUVELElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ2xCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdDQUFnQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsOEJBQThCLElBQUkscUJBQXFCLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztnQkFDakcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLCtCQUErQixJQUFJLHFCQUFxQixDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7Z0JBQ25HLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxxQkFBcUIsQ0FBQzthQUMxRjtTQUNEO0lBQ0YsQ0FBQztJQUVTLG1CQUFtQjtRQUM1QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU5QyxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQyxDQUFDLDJIQUEySDtRQUNsSyxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLFlBQVksRUFBRSwwQkFBMEIsQ0FBQyxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3pLLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLDBCQUEwQixDQUFDLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFckssSUFBSSxhQUFhLEdBQUcsYUFBYSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLHdCQUF3QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7UUFDN0osSUFBSSxjQUFjLEdBQUcsYUFBYSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLHlCQUF5QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakssTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7UUFFN0gsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN4RCxJQUFJLGlCQUFpQixDQUFDO1FBRXRCLElBQUksaUJBQWlCLENBQUM7UUFDdEIsSUFBSSxrQkFBa0IsQ0FBQztRQUV2QixJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3RDLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDeEMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN2QyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEYsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7U0FDaEU7YUFDSSxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQzFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTt3QkFDckQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGFBQWEsQ0FBQztxQkFDM0M7b0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxjQUFjLEdBQUcsQ0FBQyxFQUFFO3dCQUN2RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsY0FBYyxDQUFDO3FCQUM3QztpQkFDRDtnQkFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUV2Rix3RkFBd0Y7Z0JBQ3hGLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEtBQUssVUFBVSxFQUFFLE1BQU07b0JBQ3JELElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxLQUFLLFVBQVUsRUFBRSxLQUFLLEVBQUU7b0JBQ2xELElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO29CQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN4QzthQUNEO1lBRUQsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksYUFBYSxDQUFDO1lBQ25GLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLHNCQUFzQixJQUFJLGNBQWMsQ0FBQztZQUN2RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1NBQ2hFO2FBQU07WUFDTixJQUFJLFlBQVksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVqSCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDO1lBQ3RFLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLGlCQUFpQixDQUFDLENBQUM7WUFFcEUsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7WUFDN0IsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7WUFDL0IsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDakQsRUFBRSxlQUFlLENBQUM7Z0JBQ2xCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTlDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFM0UsSUFBSSxlQUFlLEdBQUcsaUJBQWlCLEtBQUssQ0FBQyxFQUFFO29CQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQ25GLElBQUksUUFBUSxFQUFFO3dCQUNiLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdDQUFnQyxDQUFDO3dCQUM1RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsOEJBQThCLElBQUksUUFBUSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7d0JBQ3BGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQywrQkFBK0IsSUFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztxQkFDdEY7b0JBRUQsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsZ0NBQWdDLENBQUM7b0JBQzVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQztvQkFDckYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxHQUFHO3dCQUNuRSxVQUFVLEVBQUUsb0JBQW9CO3dCQUNoQyxXQUFXLEVBQUUscUJBQXFCO3dCQUNsQyxLQUFLLEVBQUUsS0FBSztxQkFDWixDQUFDO29CQUNGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyw4QkFBOEIsSUFBSSxvQkFBb0IsQ0FBQztvQkFDaEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLCtCQUErQixJQUFJLHFCQUFxQixDQUFDO29CQUVsRixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7d0JBQ3BCLElBQUksMkJBQTJCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNySCxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUU7NEJBQ3JCLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsMkJBQTJCLENBQUMsQ0FBQzs0QkFDakYsMkJBQTJCLElBQUksb0JBQW9CLENBQUM7NEJBQ3BELFlBQVksSUFBSSxvQkFBb0IsQ0FBQzt5QkFDckM7d0JBRUQscUJBQXFCLElBQUksMkJBQTJCLENBQUM7d0JBQ3JELElBQUksMkJBQTJCLEdBQUcsQ0FBQyxJQUFJLGFBQWEsSUFBSSxxQkFBcUIsRUFBRTs0QkFDOUUsRUFBRSxpQkFBaUIsQ0FBQzt5QkFDcEI7cUJBQ0Q7eUJBQU07d0JBQ04sSUFBSSw0QkFBNEIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3pILElBQUksWUFBWSxHQUFHLENBQUMsRUFBRTs0QkFDckIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSw0QkFBNEIsQ0FBQyxDQUFDOzRCQUNsRiw0QkFBNEIsSUFBSSxvQkFBb0IsQ0FBQzs0QkFDckQsWUFBWSxJQUFJLG9CQUFvQixDQUFDO3lCQUNyQzt3QkFFRCxzQkFBc0IsSUFBSSw0QkFBNEIsQ0FBQzt3QkFDdkQsSUFBSSw0QkFBNEIsR0FBRyxDQUFDLElBQUksY0FBYyxJQUFJLHNCQUFzQixFQUFFOzRCQUNqRixFQUFFLGlCQUFpQixDQUFDO3lCQUNwQjtxQkFDRDtvQkFFRCxFQUFFLGNBQWMsQ0FBQztvQkFFakIsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO29CQUN6QixxQkFBcUIsR0FBRyxDQUFDLENBQUM7aUJBQzFCO2FBQ0Q7WUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyw4QkFBOEIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZ0NBQWdDLENBQUM7WUFDOUksTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsK0JBQStCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdDQUFnQyxDQUFDO1lBQ2hKLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksaUJBQWlCLElBQUksYUFBYSxDQUFDO1lBQzFFLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksa0JBQWtCLElBQUksY0FBYyxDQUFDO1lBRTlFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsSUFBSSxhQUFhLEdBQUcscUJBQXFCLEVBQUU7b0JBQzFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLEdBQUcscUJBQXFCLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO2lCQUM1RjthQUNEO2lCQUFNO2dCQUNOLElBQUksY0FBYyxHQUFHLHNCQUFzQixFQUFFO29CQUM1QyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxHQUFHLHNCQUFzQixDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztpQkFDL0Y7YUFDRDtTQUNEO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0QsTUFBTSxvQkFBb0IsR0FBRyxTQUFTLEdBQUcsWUFBWSxDQUFDO1FBQ3RELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztRQUVwRSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFFckIsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFDakcsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUU7WUFDcEMsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7WUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDckosSUFBSSxTQUFTLEVBQUU7b0JBQ2QsWUFBWSxJQUFJLFNBQVMsQ0FBQztpQkFDMUI7cUJBQU07b0JBQ04sRUFBRSxvQkFBb0IsQ0FBQztpQkFDdkI7YUFDRDtZQUVELFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixHQUFHLCtCQUErQixDQUFDLENBQUM7U0FDbkY7YUFBTTtZQUNOLFlBQVksR0FBRyxrQkFBa0IsR0FBRywrQkFBK0IsQ0FBQztTQUNwRTtRQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLFlBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztTQUNqRTtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1FBQ3hFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJFLE9BQU87WUFDTixXQUFXLEVBQUUsa0JBQWtCO1lBQy9CLFVBQVUsRUFBRSxpQkFBaUI7WUFDN0IsU0FBUyxFQUFFLFNBQVM7WUFDcEIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsaUJBQWlCLEVBQUUsaUJBQWlCO1lBQ3BDLGlCQUFpQixFQUFFLGlCQUFpQjtZQUNwQyxvQkFBb0IsRUFBRSxvQkFBb0I7WUFDMUMsWUFBWSxFQUFFLFlBQVk7WUFDMUIsY0FBYyxFQUFFLGNBQWM7WUFDOUIsaUJBQWlCLEVBQUUsaUJBQWlCO1NBQ3BDLENBQUM7SUFDSCxDQUFDO0lBS1MsZ0JBQWdCLENBQUMseUJBQWlDLEVBQUUsVUFBdUI7UUFDcEYsSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLENBQUMsRUFBRTtZQUMvQixPQUFPLENBQUMsQ0FBQztTQUNUO1FBRUQsTUFBTSwrQkFBK0IsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekcsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUNyQyxPQUFPLCtCQUErQixHQUFHLHNCQUFzQixDQUFDO1NBQ2hFO1FBRUQsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHNCQUFzQixFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JKLElBQUksU0FBUyxFQUFFO2dCQUNkLE1BQU0sSUFBSSxTQUFTLENBQUM7YUFDcEI7aUJBQU07Z0JBQ04sRUFBRSxvQkFBb0IsQ0FBQzthQUN2QjtTQUNEO1FBQ0QsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEdBQUcsK0JBQStCLENBQUMsQ0FBQztRQUU3RSxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxjQUFzQixFQUFFLFVBQXVCO1FBQzFFLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQ3BDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzFGLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sK0JBQStCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN6RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNySixJQUFJLFNBQVMsRUFBRTtvQkFDZCxtQkFBbUIsSUFBSSxTQUFTLENBQUM7aUJBQ2pDO3FCQUFNO29CQUNOLG1CQUFtQixJQUFJLCtCQUErQixDQUFDO2lCQUN2RDtnQkFFRCxJQUFJLGNBQWMsR0FBRyxtQkFBbUIsRUFBRTtvQkFDekMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLGtCQUFrQixDQUFDO29CQUMxQyxNQUFNO2lCQUNOO2FBQ0Q7U0FDRDthQUFNO1lBQ04sZ0JBQWdCLEdBQUcsY0FBYyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUM7U0FDNUQ7UUFFRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUUzSyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BGLGVBQWUsSUFBSSxlQUFlLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsbUNBQW1DO1FBRXRHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDO1lBQ3hELElBQUksZUFBZSxHQUFHLGNBQWMsS0FBSyxDQUFDLEVBQUU7Z0JBQzNDLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxlQUFlLEdBQUcsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2xGO1NBQ0Q7UUFFRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsVUFBVSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDM0YsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsaUJBQWlCLENBQUM7UUFDbkYsSUFBSSx1QkFBdUIsR0FBRyxDQUFDLEVBQUU7WUFDaEMsYUFBYSxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLCtCQUErQjtTQUN4RztRQUVELElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQzNCLGVBQWUsR0FBRyxDQUFDLENBQUM7U0FDcEI7UUFDRCxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN6QixhQUFhLEdBQUcsQ0FBQyxDQUFDO1NBQ2xCO1FBRUQsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRixhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdkcsT0FBTztZQUNOLFVBQVUsRUFBRSxlQUFlO1lBQzNCLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLG9CQUFvQixFQUFFLG9CQUFvQjtZQUMxQyxrQkFBa0IsRUFBRSxrQkFBa0I7WUFDdEMsbUJBQW1CLEVBQUUsY0FBYztZQUNuQyxpQkFBaUIsRUFBRSxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWM7WUFDN0QsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLGlCQUFpQjtTQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVTLGlCQUFpQjtRQUMxQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV4QyxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3hELElBQUksbUJBQW1CLEdBQUcsQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxZQUFZLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZHLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUM7U0FDOUM7YUFBTTtZQUNOLG1CQUFtQixJQUFJLE1BQU0sQ0FBQztTQUM5QjtRQUNELG1CQUFtQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFdkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEYsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUVoRCxPQUFPO1lBQ04sVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtZQUMzQixvQkFBb0IsRUFBRSxRQUFRLENBQUMsb0JBQW9CO1lBQ25ELGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0I7WUFDL0MsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQy9CLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztZQUN6QyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsbUJBQW1CO1lBQ2pELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7WUFDN0MsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLGlCQUFpQjtTQUM3QyxDQUFDO0lBQ0gsQ0FBQzs7cUhBeHFDVyx3QkFBd0IsNEhBbWMzQixXQUFXLGFBQ0Msa0NBQWtDO3lHQXBjM0Msd0JBQXdCLG80Q0FzUEosVUFBVSwyR0FHUCxVQUFVLHNIQVRmLFVBQVUsdUlBR0QsVUFBVSwrRkF4VHZDOzs7OztHQUtSOzJGQWdFVSx3QkFBd0I7a0JBeEVwQyxTQUFTOytCQUNDLG9DQUFvQyxZQUNwQyxpQkFBaUIsWUFDakI7Ozs7O0dBS1IsUUFDSTt3QkFDTCxvQkFBb0IsRUFBRSxZQUFZO3dCQUNsQyxrQkFBa0IsRUFBRSxhQUFhO3dCQUNqQyxvQkFBb0IsRUFBRSxlQUFlO3dCQUNyQyxhQUFhLEVBQUUsS0FBSztxQkFDcEI7OzBCQTZmQyxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGtDQUFrQzs0Q0FoYjVDLE9BQU87c0JBRGpCLEtBQUs7Z0JBa0JDLGdDQUFnQztzQkFEdEMsS0FBSztnQkFLSywwQkFBMEI7c0JBRHBDLEtBQUs7Z0JBZUMsR0FBRztzQkFEVCxLQUFLO2dCQUlDLDJCQUEyQjtzQkFEakMsS0FBSztnQkFJQyxpQ0FBaUM7c0JBRHZDLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsVUFBVTtzQkFEaEIsS0FBSztnQkFJQyxXQUFXO3NCQURqQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUtLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBYUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQUlDLDRCQUE0QjtzQkFEbEMsS0FBSztnQkFLSyxvQkFBb0I7c0JBRDlCLEtBQUs7Z0JBV0ssa0JBQWtCO3NCQUQ1QixLQUFLO2dCQStCSyxtQkFBbUI7c0JBRDdCLEtBQUs7Z0JBZUssS0FBSztzQkFEZixLQUFLO2dCQWNDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBS0ssVUFBVTtzQkFEcEIsS0FBSztnQkFzQkssWUFBWTtzQkFEdEIsS0FBSztnQkF3QkMsaUJBQWlCO3NCQUR2QixNQUFNO2dCQUlBLFFBQVE7c0JBRGQsTUFBTTtnQkFJQSxRQUFRO3NCQURkLE1BQU07Z0JBSUEsT0FBTztzQkFEYixNQUFNO2dCQUlBLEtBQUs7c0JBRFgsTUFBTTtnQkFJQSxpQkFBaUI7c0JBRHZCLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk5QywwQkFBMEI7c0JBRG5DLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXZELGdCQUFnQjtzQkFEekIsWUFBWTt1QkFBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSWpELG1CQUFtQjtzQkFENUIsWUFBWTt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7O0FBNjdCL0QsTUFBTSxPQUFPLHFCQUFxQjs7a0hBQXJCLHFCQUFxQjttSEFBckIscUJBQXFCLGlCQXRyQ3JCLHdCQUF3QixhQThxQzFCLFlBQVksYUE5cUNWLHdCQUF3QjttSEFzckN4QixxQkFBcUIsYUFQdEI7UUFDVjtZQUNDLE9BQU8sRUFBRSxrQ0FBa0M7WUFDM0MsVUFBVSxFQUFFLHdDQUF3QztTQUNwRDtLQUNELFlBTlMsWUFBWTsyRkFRVixxQkFBcUI7a0JBWGpDLFFBQVE7bUJBQUM7b0JBQ1QsT0FBTyxFQUFFLENBQUMsd0JBQXdCLENBQUM7b0JBQ25DLFlBQVksRUFBRSxDQUFDLHdCQUF3QixDQUFDO29CQUN4QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFNBQVMsRUFBRTt3QkFDVjs0QkFDQyxPQUFPLEVBQUUsa0NBQWtDOzRCQUMzQyxVQUFVLEVBQUUsd0NBQXdDO3lCQUNwRDtxQkFDRDtpQkFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXHJcblx0Q29tcG9uZW50LFxyXG5cdENvbnRlbnRDaGlsZCxcclxuXHRFbGVtZW50UmVmLFxyXG5cdEV2ZW50RW1pdHRlcixcclxuXHRJbmplY3QsXHJcblx0SW5wdXQsXHJcblx0TmdNb2R1bGUsXHJcblx0Tmdab25lLFxyXG5cdE9uQ2hhbmdlcyxcclxuXHRPbkRlc3Ryb3ksXHJcblx0T25Jbml0LFxyXG5cdE9wdGlvbmFsLFxyXG5cdE91dHB1dCxcclxuXHRSZW5kZXJlcjIsXHJcblx0Vmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0ICogYXMgdHdlZW4gZnJvbSAnQHR3ZWVuanMvdHdlZW4uanMnXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFZpcnR1YWxTY3JvbGxlckRlZmF1bHRPcHRpb25zIHtcclxuXHRjaGVja1Jlc2l6ZUludGVydmFsOiBudW1iZXJcclxuXHRtb2RpZnlPdmVyZmxvd1N0eWxlT2ZQYXJlbnRTY3JvbGw6IGJvb2xlYW4sXHJcblx0cmVzaXplQnlwYXNzUmVmcmVzaFRocmVzaG9sZDogbnVtYmVyLFxyXG5cdHNjcm9sbEFuaW1hdGlvblRpbWU6IG51bWJlcjtcclxuXHRzY3JvbGxEZWJvdW5jZVRpbWU6IG51bWJlcjtcclxuXHRzY3JvbGxUaHJvdHRsaW5nVGltZTogbnVtYmVyO1xyXG5cdHNjcm9sbGJhckhlaWdodD86IG51bWJlcjtcclxuXHRzY3JvbGxiYXJXaWR0aD86IG51bWJlcjtcclxuXHRzdHJpcGVkVGFibGU6IGJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFZJUlRVQUxfU0NST0xMRVJfREVGQVVMVF9PUFRJT05TX0ZBQ1RPUlkoKTogVmlydHVhbFNjcm9sbGVyRGVmYXVsdE9wdGlvbnMge1xyXG5cdHJldHVybiB7XHJcblx0XHRjaGVja1Jlc2l6ZUludGVydmFsOiAxMDAwLFxyXG5cdFx0bW9kaWZ5T3ZlcmZsb3dTdHlsZU9mUGFyZW50U2Nyb2xsOiB0cnVlLFxyXG5cdFx0cmVzaXplQnlwYXNzUmVmcmVzaFRocmVzaG9sZDogNSxcclxuXHRcdHNjcm9sbEFuaW1hdGlvblRpbWU6IDc1MCxcclxuXHRcdHNjcm9sbERlYm91bmNlVGltZTogMCxcclxuXHRcdHNjcm9sbFRocm90dGxpbmdUaW1lOiAwLFxyXG5cdFx0c3RyaXBlZFRhYmxlOiBmYWxzZVxyXG5cdH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgV3JhcEdyb3VwRGltZW5zaW9ucyB7XHJcblx0bWF4Q2hpbGRTaXplUGVyV3JhcEdyb3VwOiBXcmFwR3JvdXBEaW1lbnNpb25bXTtcclxuXHRudW1iZXJPZktub3duV3JhcEdyb3VwQ2hpbGRTaXplczogbnVtYmVyO1xyXG5cdHN1bU9mS25vd25XcmFwR3JvdXBDaGlsZEhlaWdodHM6IG51bWJlcjtcclxuXHRzdW1PZktub3duV3JhcEdyb3VwQ2hpbGRXaWR0aHM6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBXcmFwR3JvdXBEaW1lbnNpb24ge1xyXG5cdGNoaWxkSGVpZ2h0OiBudW1iZXI7XHJcblx0Y2hpbGRXaWR0aDogbnVtYmVyO1xyXG5cdGl0ZW1zOiBhbnlbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGltZW5zaW9ucyB7XHJcblx0Y2hpbGRIZWlnaHQ6IG51bWJlcjtcclxuXHRjaGlsZFdpZHRoOiBudW1iZXI7XHJcblx0aXRlbUNvdW50OiBudW1iZXI7XHJcblx0aXRlbXNQZXJQYWdlOiBudW1iZXI7XHJcblx0aXRlbXNQZXJXcmFwR3JvdXA6IG51bWJlcjtcclxuXHRtYXhTY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xyXG5cdHBhZ2VDb3VudF9mcmFjdGlvbmFsOiBudW1iZXI7XHJcblx0c2Nyb2xsTGVuZ3RoOiBudW1iZXI7XHJcblx0dmlld3BvcnRMZW5ndGg6IG51bWJlcjtcclxuXHR3cmFwR3JvdXBzUGVyUGFnZTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTY3JvbGxEaXJlY3Rpb25UeXBlID0gJ2JhY2t3YXJkJyB8ICdmb3J3YXJkJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBhZ2VJbmZvIHtcclxuXHRlbmRJbmRleDogbnVtYmVyO1xyXG5cdGVuZEluZGV4V2l0aEJ1ZmZlcjogbnVtYmVyO1xyXG5cdG1heFNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XHJcblx0c2Nyb2xsRW5kUG9zaXRpb246IG51bWJlcjtcclxuXHRzY3JvbGxTdGFydFBvc2l0aW9uOiBudW1iZXI7XHJcblx0c2Nyb2xsRGlyZWN0aW9uPzogU2Nyb2xsRGlyZWN0aW9uVHlwZTtcclxuXHRzdGFydEluZGV4OiBudW1iZXI7XHJcblx0c3RhcnRJbmRleFdpdGhCdWZmZXI6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVmlld3BvcnQgZXh0ZW5kcyBJUGFnZUluZm8ge1xyXG5cdHBhZGRpbmc6IG51bWJlcjtcclxuXHRzY3JvbGxMZW5ndGg6IG51bWJlcjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICd2aXJ0dWFsLXNjcm9sbGVyLFt2aXJ0dWFsU2Nyb2xsZXJdJyxcclxuXHRleHBvcnRBczogJ3ZpcnR1YWxTY3JvbGxlcicsXHJcblx0dGVtcGxhdGU6IGBcclxuICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1wYWRkaW5nXCIgI2ludmlzaWJsZVBhZGRpbmc+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsYWJsZS1jb250ZW50XCIgI2NvbnRlbnQ+XHJcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcblx0aG9zdDoge1xyXG5cdFx0J1tjbGFzcy5ob3Jpem9udGFsXSc6IFwiaG9yaXpvbnRhbFwiLFxyXG5cdFx0J1tjbGFzcy52ZXJ0aWNhbF0nOiBcIiFob3Jpem9udGFsXCIsXHJcblx0XHQnW2NsYXNzLnNlbGZTY3JvbGxdJzogXCIhcGFyZW50U2Nyb2xsXCIsXHJcblx0XHQnW2NsYXNzLnJ0bF0nOiBcIlJUTFwiXHJcblx0fSxcclxuXHRzdHlsZXM6IFtgXHJcbiAgICA6aG9zdCB7XHJcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuXHQgIFx0ZGlzcGxheTogYmxvY2s7XHJcbiAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcclxuICAgIH1cclxuXHRcdDpob3N0Lmhvcml6b250YWwuc2VsZlNjcm9sbCB7XHJcbiAgICAgIG92ZXJmbG93LXk6IHZpc2libGU7XHJcbiAgICAgIG92ZXJmbG93LXg6IGF1dG87XHJcblx0XHR9XHJcblx0XHQ6aG9zdC5ob3Jpem9udGFsLnNlbGZTY3JvbGwucnRsIHtcclxuXHRcdFx0dHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xyXG5cdFx0fVxyXG5cdFx0Omhvc3QudmVydGljYWwuc2VsZlNjcm9sbCB7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7XHJcblx0XHR9XHJcbiAgICAuc2Nyb2xsYWJsZS1jb250ZW50IHtcclxuICAgICAgdG9wOiAwO1xyXG4gICAgICBsZWZ0OiAwO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICBtYXgtd2lkdGg6IDEwMHZ3O1xyXG4gICAgICBtYXgtaGVpZ2h0OiAxMDB2aDtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgfVxyXG5cdFx0LnNjcm9sbGFibGUtY29udGVudCA6Om5nLWRlZXAgPiAqIHtcclxuXHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcclxuXHRcdH1cclxuXHRcdDpob3N0Lmhvcml6b250YWwge1xyXG5cdFx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG5cdFx0fVxyXG5cdFx0Omhvc3QuaG9yaXpvbnRhbCAuc2Nyb2xsYWJsZS1jb250ZW50IHtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdH1cclxuXHRcdDpob3N0Lmhvcml6b250YWwgLnNjcm9sbGFibGUtY29udGVudCA6Om5nLWRlZXAgPiAqIHtcclxuXHRcdFx0ZmxleC1zaHJpbms6IDA7XHJcblx0XHRcdGZsZXgtZ3JvdzogMDtcclxuXHRcdFx0d2hpdGUtc3BhY2U6IGluaXRpYWw7XHJcblx0XHR9XHJcblx0XHQ6aG9zdC5ob3Jpem9udGFsLnJ0bCAuc2Nyb2xsYWJsZS1jb250ZW50IDo6bmctZGVlcCA+ICoge1xyXG5cdFx0XHR0cmFuc2Zvcm06c2NhbGVYKC0xKTtcclxuXHRcdH1cclxuICAgIC50b3RhbC1wYWRkaW5nIHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICB0b3A6IDA7XHJcbiAgICAgIGxlZnQ6IDA7XHJcbiAgICAgIGhlaWdodDogMXB4O1xyXG4gICAgICB3aWR0aDogMXB4O1xyXG4gICAgICB0cmFuc2Zvcm0tb3JpZ2luOiAwIDA7XHJcbiAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICB9XHJcbiAgICA6aG9zdC5ob3Jpem9udGFsIC50b3RhbC1wYWRkaW5nIHtcclxuICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgfVxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuXHRwdWJsaWMgdmlld1BvcnRJdGVtczogYW55W107XHJcblx0cHVibGljIHdpbmRvdyA9IHdpbmRvdztcclxuXHJcblx0cHVibGljIGdldCB2aWV3UG9ydEluZm8oKTogSVBhZ2VJbmZvIHtcclxuXHRcdGNvbnN0IHBhZ2VJbmZvOiBJVmlld3BvcnQgPSB0aGlzLnByZXZpb3VzVmlld1BvcnQgfHwgPGFueT57fTtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHN0YXJ0SW5kZXg6IHBhZ2VJbmZvLnN0YXJ0SW5kZXggfHwgMCxcclxuXHRcdFx0ZW5kSW5kZXg6IHBhZ2VJbmZvLmVuZEluZGV4IHx8IDAsXHJcblx0XHRcdHNjcm9sbFN0YXJ0UG9zaXRpb246IHBhZ2VJbmZvLnNjcm9sbFN0YXJ0UG9zaXRpb24gfHwgMCxcclxuXHRcdFx0c2Nyb2xsRW5kUG9zaXRpb246IHBhZ2VJbmZvLnNjcm9sbEVuZFBvc2l0aW9uIHx8IDAsXHJcblx0XHRcdHNjcm9sbERpcmVjdGlvbjogcGFnZUluZm8uc2Nyb2xsRGlyZWN0aW9uIHx8ICdmb3J3YXJkJyxcclxuXHRcdFx0bWF4U2Nyb2xsUG9zaXRpb246IHBhZ2VJbmZvLm1heFNjcm9sbFBvc2l0aW9uIHx8IDAsXHJcblx0XHRcdHN0YXJ0SW5kZXhXaXRoQnVmZmVyOiBwYWdlSW5mby5zdGFydEluZGV4V2l0aEJ1ZmZlciB8fCAwLFxyXG5cdFx0XHRlbmRJbmRleFdpdGhCdWZmZXI6IHBhZ2VJbmZvLmVuZEluZGV4V2l0aEJ1ZmZlciB8fCAwLFxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBfZGlzYWJsZSA9IGZhbHNlO1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCBkaXNhYmxlKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2Rpc2FibGU7XHJcblx0fVxyXG5cdHB1YmxpYyBzZXQgZGlzYWJsZSh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0aWYgKHRoaXMuX2Rpc2FibGUgPT09IHZhbHVlKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9kaXNhYmxlID0gdmFsdWU7XHJcblx0XHRpZiAodGhpcy5fZGlzYWJsZSkge1xyXG5cdFx0XHR0aGlzLnJlbW92ZVNjcm9sbEV2ZW50SGFuZGxlcnMoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuYWRkU2Nyb2xsRXZlbnRIYW5kbGVycygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZXhlY3V0ZVJlZnJlc2hPdXRzaWRlQW5ndWxhclpvbmUgPSBmYWxzZTtcclxuXHJcblx0cHJvdGVjdGVkIF9lbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcyA9IGZhbHNlO1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCBlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcygpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLl9lbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcztcclxuXHR9XHJcblx0cHVibGljIHNldCBlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcyh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0aWYgKHRoaXMuX2VuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzID09PSB2YWx1ZSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMgPSB2YWx1ZTtcclxuXHRcdHRoaXMubWluTWVhc3VyZWRDaGlsZFdpZHRoID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5taW5NZWFzdXJlZENoaWxkSGVpZ2h0ID0gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgUlRMID0gZmFsc2U7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHVzZU1hcmdpbkluc3RlYWRPZlRyYW5zbGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBtb2RpZnlPdmVyZmxvd1N0eWxlT2ZQYXJlbnRTY3JvbGw6IGJvb2xlYW47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHN0cmlwZWRUYWJsZTogYm9vbGVhbjtcclxuXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2Nyb2xsYmFyV2lkdGg6IG51bWJlcjtcclxuXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2Nyb2xsYmFySGVpZ2h0OiBudW1iZXI7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNoaWxkV2lkdGg6IG51bWJlcjtcclxuXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgY2hpbGRIZWlnaHQ6IG51bWJlcjtcclxuXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3NyQ2hpbGRXaWR0aDogbnVtYmVyO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzc3JDaGlsZEhlaWdodDogbnVtYmVyO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzc3JWaWV3cG9ydFdpZHRoID0gMTkyMDtcclxuXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3NyVmlld3BvcnRIZWlnaHQgPSAxMDgwO1xyXG5cclxuXHRwcm90ZWN0ZWQgX2J1ZmZlckFtb3VudDogbnVtYmVyO1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCBidWZmZXJBbW91bnQoKTogbnVtYmVyIHtcclxuXHRcdGlmICh0eXBlb2YgKHRoaXMuX2J1ZmZlckFtb3VudCkgPT09ICdudW1iZXInICYmIHRoaXMuX2J1ZmZlckFtb3VudCA+IDApIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuX2J1ZmZlckFtb3VudDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmVuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzID8gNSA6IDE7XHJcblx0XHR9XHJcblx0fVxyXG5cdHB1YmxpYyBzZXQgYnVmZmVyQW1vdW50KHZhbHVlOiBudW1iZXIpIHtcclxuXHRcdHRoaXMuX2J1ZmZlckFtb3VudCA9IHZhbHVlO1xyXG5cdH1cclxuXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2Nyb2xsQW5pbWF0aW9uVGltZTogbnVtYmVyO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyByZXNpemVCeXBhc3NSZWZyZXNoVGhyZXNob2xkOiBudW1iZXI7XHJcblxyXG5cdHByb3RlY3RlZCBfc2Nyb2xsVGhyb3R0bGluZ1RpbWU6IG51bWJlcjtcclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgc2Nyb2xsVGhyb3R0bGluZ1RpbWUoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLl9zY3JvbGxUaHJvdHRsaW5nVGltZTtcclxuXHR9XHJcblx0cHVibGljIHNldCBzY3JvbGxUaHJvdHRsaW5nVGltZSh2YWx1ZTogbnVtYmVyKSB7XHJcblx0XHR0aGlzLl9zY3JvbGxUaHJvdHRsaW5nVGltZSA9IHZhbHVlO1xyXG5cdFx0dGhpcy51cGRhdGVPblNjcm9sbEZ1bmN0aW9uKCk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgX3Njcm9sbERlYm91bmNlVGltZTogbnVtYmVyO1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCBzY3JvbGxEZWJvdW5jZVRpbWUoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLl9zY3JvbGxEZWJvdW5jZVRpbWU7XHJcblx0fVxyXG5cdHB1YmxpYyBzZXQgc2Nyb2xsRGVib3VuY2VUaW1lKHZhbHVlOiBudW1iZXIpIHtcclxuXHRcdHRoaXMuX3Njcm9sbERlYm91bmNlVGltZSA9IHZhbHVlO1xyXG5cdFx0dGhpcy51cGRhdGVPblNjcm9sbEZ1bmN0aW9uKCk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgb25TY3JvbGw6ICgpID0+IHZvaWQ7XHJcblx0cHJvdGVjdGVkIHVwZGF0ZU9uU2Nyb2xsRnVuY3Rpb24oKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5zY3JvbGxEZWJvdW5jZVRpbWUpIHtcclxuXHRcdFx0dGhpcy5vblNjcm9sbCA9IDxhbnk+dGhpcy5kZWJvdW5jZSgoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5yZWZyZXNoX2ludGVybmFsKGZhbHNlKTtcclxuXHRcdFx0fSwgdGhpcy5zY3JvbGxEZWJvdW5jZVRpbWUpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZiAodGhpcy5zY3JvbGxUaHJvdHRsaW5nVGltZSkge1xyXG5cdFx0XHR0aGlzLm9uU2Nyb2xsID0gPGFueT50aGlzLnRocm90dGxlVHJhaWxpbmcoKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucmVmcmVzaF9pbnRlcm5hbChmYWxzZSk7XHJcblx0XHRcdH0sIHRoaXMuc2Nyb2xsVGhyb3R0bGluZ1RpbWUpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHRoaXMub25TY3JvbGwgPSAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5yZWZyZXNoX2ludGVybmFsKGZhbHNlKTtcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBjaGVja1Njcm9sbEVsZW1lbnRSZXNpemVkVGltZXI6IG51bWJlcjtcclxuXHRwcm90ZWN0ZWQgX2NoZWNrUmVzaXplSW50ZXJ2YWw6IG51bWJlcjtcclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgY2hlY2tSZXNpemVJbnRlcnZhbCgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2NoZWNrUmVzaXplSW50ZXJ2YWw7XHJcblx0fVxyXG5cdHB1YmxpYyBzZXQgY2hlY2tSZXNpemVJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XHJcblx0XHRpZiAodGhpcy5fY2hlY2tSZXNpemVJbnRlcnZhbCA9PT0gdmFsdWUpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2NoZWNrUmVzaXplSW50ZXJ2YWwgPSB2YWx1ZTtcclxuXHRcdHRoaXMuYWRkU2Nyb2xsRXZlbnRIYW5kbGVycygpO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIF9pdGVtczogYW55W10gPSBbXTtcclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgaXRlbXMoKTogYW55W10ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2l0ZW1zO1xyXG5cdH1cclxuXHRwdWJsaWMgc2V0IGl0ZW1zKHZhbHVlOiBhbnlbXSkge1xyXG5cdFx0aWYgKHZhbHVlID09PSB0aGlzLl9pdGVtcykge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5faXRlbXMgPSB2YWx1ZSB8fCBbXTtcclxuXHRcdHRoaXMucmVmcmVzaF9pbnRlcm5hbCh0cnVlKTtcclxuXHR9XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNvbXBhcmVJdGVtczogKGl0ZW0xOiBhbnksIGl0ZW0yOiBhbnkpID0+IGJvb2xlYW4gPSAoaXRlbTE6IGFueSwgaXRlbTI6IGFueSkgPT4gaXRlbTEgPT09IGl0ZW0yO1xyXG5cclxuXHRwcm90ZWN0ZWQgX2hvcml6b250YWw6IGJvb2xlYW47XHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGhvcml6b250YWwoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5faG9yaXpvbnRhbDtcclxuXHR9XHJcblx0cHVibGljIHNldCBob3Jpem9udGFsKHZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLl9ob3Jpem9udGFsID0gdmFsdWU7XHJcblx0XHR0aGlzLnVwZGF0ZURpcmVjdGlvbigpO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIHJldmVydFBhcmVudE92ZXJzY3JvbGwoKTogdm9pZCB7XHJcblx0XHRjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5nZXRTY3JvbGxFbGVtZW50KCk7XHJcblx0XHRpZiAoc2Nyb2xsRWxlbWVudCAmJiB0aGlzLm9sZFBhcmVudFNjcm9sbE92ZXJmbG93KSB7XHJcblx0XHRcdHNjcm9sbEVsZW1lbnQuc3R5bGVbJ292ZXJmbG93LXknXSA9IHRoaXMub2xkUGFyZW50U2Nyb2xsT3ZlcmZsb3cueTtcclxuXHRcdFx0c2Nyb2xsRWxlbWVudC5zdHlsZVsnb3ZlcmZsb3cteCddID0gdGhpcy5vbGRQYXJlbnRTY3JvbGxPdmVyZmxvdy54O1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMub2xkUGFyZW50U2Nyb2xsT3ZlcmZsb3cgPSB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgb2xkUGFyZW50U2Nyb2xsT3ZlcmZsb3c6IHsgeDogc3RyaW5nLCB5OiBzdHJpbmcgfTtcclxuXHRwcm90ZWN0ZWQgX3BhcmVudFNjcm9sbDogRWxlbWVudCB8IFdpbmRvdztcclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgcGFyZW50U2Nyb2xsKCk6IEVsZW1lbnQgfCBXaW5kb3cge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3BhcmVudFNjcm9sbDtcclxuXHR9XHJcblx0cHVibGljIHNldCBwYXJlbnRTY3JvbGwodmFsdWU6IEVsZW1lbnQgfCBXaW5kb3cpIHtcclxuXHRcdGlmICh0aGlzLl9wYXJlbnRTY3JvbGwgPT09IHZhbHVlKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJldmVydFBhcmVudE92ZXJzY3JvbGwoKTtcclxuXHRcdHRoaXMuX3BhcmVudFNjcm9sbCA9IHZhbHVlO1xyXG5cdFx0dGhpcy5hZGRTY3JvbGxFdmVudEhhbmRsZXJzKCk7XHJcblxyXG5cdFx0Y29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuZ2V0U2Nyb2xsRWxlbWVudCgpO1xyXG5cdFx0aWYgKHRoaXMubW9kaWZ5T3ZlcmZsb3dTdHlsZU9mUGFyZW50U2Nyb2xsICYmIHNjcm9sbEVsZW1lbnQgIT09IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcblx0XHRcdHRoaXMub2xkUGFyZW50U2Nyb2xsT3ZlcmZsb3cgPSB7IHg6IHNjcm9sbEVsZW1lbnQuc3R5bGVbJ292ZXJmbG93LXgnXSwgeTogc2Nyb2xsRWxlbWVudC5zdHlsZVsnb3ZlcmZsb3cteSddIH07XHJcblx0XHRcdHNjcm9sbEVsZW1lbnQuc3R5bGVbJ292ZXJmbG93LXknXSA9IHRoaXMuaG9yaXpvbnRhbCA/ICd2aXNpYmxlJyA6ICdhdXRvJztcclxuXHRcdFx0c2Nyb2xsRWxlbWVudC5zdHlsZVsnb3ZlcmZsb3cteCddID0gdGhpcy5ob3Jpem9udGFsID8gJ2F1dG8nIDogJ3Zpc2libGUnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBfbGFzdENoaWxkUmVjdDogQ2xpZW50UmVjdDtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0cHVibGljIHZzQ2hpbGRSZWN0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8Q2xpZW50UmVjdD4gPSBuZXcgRXZlbnRFbWl0dGVyPENsaWVudFJlY3Q+KCk7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyB2c1VwZGF0ZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyB2c0NoYW5nZTogRXZlbnRFbWl0dGVyPElQYWdlSW5mbz4gPSBuZXcgRXZlbnRFbWl0dGVyPElQYWdlSW5mbz4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0cHVibGljIHZzU3RhcnQ6IEV2ZW50RW1pdHRlcjxJUGFnZUluZm8+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGFnZUluZm8+KCk7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyB2c0VuZDogRXZlbnRFbWl0dGVyPElQYWdlSW5mbz4gPSBuZXcgRXZlbnRFbWl0dGVyPElQYWdlSW5mbz4oKTtcclxuXHJcblx0QFZpZXdDaGlsZCgnY29udGVudCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXHJcblx0cHVibGljIGNvbnRlbnRFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xyXG5cclxuXHRAVmlld0NoaWxkKCdpbnZpc2libGVQYWRkaW5nJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcclxuXHRwcm90ZWN0ZWQgaW52aXNpYmxlUGFkZGluZ0VsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XHJcblxyXG5cdEBDb250ZW50Q2hpbGQoJ2hlYWRlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxyXG5cdHByb3RlY3RlZCBoZWFkZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xyXG5cclxuXHRAQ29udGVudENoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSlcclxuXHRwcm90ZWN0ZWQgY29udGFpbmVyRWxlbWVudFJlZjogRWxlbWVudFJlZjtcclxuXHJcblx0cHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5hZGRTY3JvbGxFdmVudEhhbmRsZXJzKCk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnJlbW92ZVNjcm9sbEV2ZW50SGFuZGxlcnMoKTtcclxuXHRcdHRoaXMucmV2ZXJ0UGFyZW50T3ZlcnNjcm9sbCgpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xyXG5cdFx0Y29uc3QgaW5kZXhMZW5ndGhDaGFuZ2VkID0gdGhpcy5jYWNoZWRJdGVtc0xlbmd0aCAhPT0gdGhpcy5pdGVtcy5sZW5ndGg7XHJcblx0XHR0aGlzLmNhY2hlZEl0ZW1zTGVuZ3RoID0gdGhpcy5pdGVtcy5sZW5ndGg7XHJcblxyXG5cdFx0Y29uc3QgZmlyc3RSdW46IGJvb2xlYW4gPSAhY2hhbmdlcy5pdGVtcyB8fCAhY2hhbmdlcy5pdGVtcy5wcmV2aW91c1ZhbHVlIHx8IGNoYW5nZXMuaXRlbXMucHJldmlvdXNWYWx1ZS5sZW5ndGggPT09IDA7XHJcblx0XHR0aGlzLnJlZnJlc2hfaW50ZXJuYWwoaW5kZXhMZW5ndGhDaGFuZ2VkIHx8IGZpcnN0UnVuKTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBuZ0RvQ2hlY2soKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5jYWNoZWRJdGVtc0xlbmd0aCAhPT0gdGhpcy5pdGVtcy5sZW5ndGgpIHtcclxuXHRcdFx0dGhpcy5jYWNoZWRJdGVtc0xlbmd0aCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xyXG5cdFx0XHR0aGlzLnJlZnJlc2hfaW50ZXJuYWwodHJ1ZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5wcmV2aW91c1ZpZXdQb3J0ICYmIHRoaXMudmlld1BvcnRJdGVtcyAmJiB0aGlzLnZpZXdQb3J0SXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRsZXQgaXRlbXNBcnJheUNoYW5nZWQgPSBmYWxzZTtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZpZXdQb3J0SXRlbXMubGVuZ3RoOyArK2kpIHtcclxuXHRcdFx0XHRpZiAoIXRoaXMuY29tcGFyZUl0ZW1zKHRoaXMuaXRlbXNbdGhpcy5wcmV2aW91c1ZpZXdQb3J0LnN0YXJ0SW5kZXhXaXRoQnVmZmVyICsgaV0sIHRoaXMudmlld1BvcnRJdGVtc1tpXSkpIHtcclxuXHRcdFx0XHRcdGl0ZW1zQXJyYXlDaGFuZ2VkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoaXRlbXNBcnJheUNoYW5nZWQpIHtcclxuXHRcdFx0XHR0aGlzLnJlZnJlc2hfaW50ZXJuYWwodHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5yZWZyZXNoX2ludGVybmFsKHRydWUpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGludmFsaWRhdGVBbGxDYWNoZWRNZWFzdXJlbWVudHMoKTogdm9pZCB7XHJcblx0XHR0aGlzLndyYXBHcm91cERpbWVuc2lvbnMgPSB7XHJcblx0XHRcdG1heENoaWxkU2l6ZVBlcldyYXBHcm91cDogW10sXHJcblx0XHRcdG51bWJlck9mS25vd25XcmFwR3JvdXBDaGlsZFNpemVzOiAwLFxyXG5cdFx0XHRzdW1PZktub3duV3JhcEdyb3VwQ2hpbGRXaWR0aHM6IDAsXHJcblx0XHRcdHN1bU9mS25vd25XcmFwR3JvdXBDaGlsZEhlaWdodHM6IDBcclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy5taW5NZWFzdXJlZENoaWxkV2lkdGggPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLm1pbk1lYXN1cmVkQ2hpbGRIZWlnaHQgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0dGhpcy5yZWZyZXNoX2ludGVybmFsKGZhbHNlKTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ2FjaGVkTWVhc3VyZW1lbnRGb3JJdGVtKGl0ZW06IGFueSk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMpIHtcclxuXHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcclxuXHRcdFx0aWYgKGluZGV4ID49IDApIHtcclxuXHRcdFx0XHR0aGlzLmludmFsaWRhdGVDYWNoZWRNZWFzdXJlbWVudEF0SW5kZXgoaW5kZXgpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLm1pbk1lYXN1cmVkQ2hpbGRXaWR0aCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0dGhpcy5taW5NZWFzdXJlZENoaWxkSGVpZ2h0ID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucmVmcmVzaF9pbnRlcm5hbChmYWxzZSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgaW52YWxpZGF0ZUNhY2hlZE1lYXN1cmVtZW50QXRJbmRleChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5lbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcykge1xyXG5cdFx0XHRjb25zdCBjYWNoZWRNZWFzdXJlbWVudCA9IHRoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5tYXhDaGlsZFNpemVQZXJXcmFwR3JvdXBbaW5kZXhdO1xyXG5cdFx0XHRpZiAoY2FjaGVkTWVhc3VyZW1lbnQpIHtcclxuXHRcdFx0XHR0aGlzLndyYXBHcm91cERpbWVuc2lvbnMubWF4Q2hpbGRTaXplUGVyV3JhcEdyb3VwW2luZGV4XSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHQtLXRoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5udW1iZXJPZktub3duV3JhcEdyb3VwQ2hpbGRTaXplcztcclxuXHRcdFx0XHR0aGlzLndyYXBHcm91cERpbWVuc2lvbnMuc3VtT2ZLbm93bldyYXBHcm91cENoaWxkV2lkdGhzIC09IGNhY2hlZE1lYXN1cmVtZW50LmNoaWxkV2lkdGggfHwgMDtcclxuXHRcdFx0XHR0aGlzLndyYXBHcm91cERpbWVuc2lvbnMuc3VtT2ZLbm93bldyYXBHcm91cENoaWxkSGVpZ2h0cyAtPSBjYWNoZWRNZWFzdXJlbWVudC5jaGlsZEhlaWdodCB8fCAwO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLm1pbk1lYXN1cmVkQ2hpbGRXaWR0aCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0dGhpcy5taW5NZWFzdXJlZENoaWxkSGVpZ2h0ID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucmVmcmVzaF9pbnRlcm5hbChmYWxzZSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc2Nyb2xsSW50byhpdGVtOiBhbnksIGFsaWduVG9CZWdpbm5pbmcgPSB0cnVlLCBhZGRpdGlvbmFsT2Zmc2V0ID0gMCwgYW5pbWF0aW9uTWlsbGlzZWNvbmRzOiBudW1iZXIgPSB1bmRlZmluZWQsIGFuaW1hdGlvbkNvbXBsZXRlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gdW5kZWZpbmVkKTogdm9pZCB7XHJcblx0XHRjb25zdCBpbmRleDogbnVtYmVyID0gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG5cdFx0aWYgKGluZGV4ID09PSAtMSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnblRvQmVnaW5uaW5nLCBhZGRpdGlvbmFsT2Zmc2V0LCBhbmltYXRpb25NaWxsaXNlY29uZHMsIGFuaW1hdGlvbkNvbXBsZXRlZENhbGxiYWNrKTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzY3JvbGxUb0luZGV4KGluZGV4OiBudW1iZXIsIGFsaWduVG9CZWdpbm5pbmcgPSB0cnVlLCBhZGRpdGlvbmFsT2Zmc2V0ID0gMCwgYW5pbWF0aW9uTWlsbGlzZWNvbmRzOiBudW1iZXIgPSB1bmRlZmluZWQsIGFuaW1hdGlvbkNvbXBsZXRlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gdW5kZWZpbmVkKTogdm9pZCB7XHJcblx0XHRsZXQgbWF4UmV0cmllcyA9IDU7XHJcblxyXG5cdFx0Y29uc3QgcmV0cnlJZk5lZWRlZCA9ICgpID0+IHtcclxuXHRcdFx0LS1tYXhSZXRyaWVzO1xyXG5cdFx0XHRpZiAobWF4UmV0cmllcyA8PSAwKSB7XHJcblx0XHRcdFx0aWYgKGFuaW1hdGlvbkNvbXBsZXRlZENhbGxiYWNrKSB7XHJcblx0XHRcdFx0XHRhbmltYXRpb25Db21wbGV0ZWRDYWxsYmFjaygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmNhbGN1bGF0ZURpbWVuc2lvbnMoKTtcclxuXHRcdFx0Y29uc3QgZGVzaXJlZFN0YXJ0SW5kZXggPSBNYXRoLm1pbihNYXRoLm1heChpbmRleCwgMCksIGRpbWVuc2lvbnMuaXRlbUNvdW50IC0gMSk7XHJcblx0XHRcdGlmICh0aGlzLnByZXZpb3VzVmlld1BvcnQuc3RhcnRJbmRleCA9PT0gZGVzaXJlZFN0YXJ0SW5kZXgpIHtcclxuXHRcdFx0XHRpZiAoYW5pbWF0aW9uQ29tcGxldGVkQ2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdGFuaW1hdGlvbkNvbXBsZXRlZENhbGxiYWNrKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zY3JvbGxUb0luZGV4X2ludGVybmFsKGluZGV4LCBhbGlnblRvQmVnaW5uaW5nLCBhZGRpdGlvbmFsT2Zmc2V0LCAwLCByZXRyeUlmTmVlZGVkKTtcclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy5zY3JvbGxUb0luZGV4X2ludGVybmFsKGluZGV4LCBhbGlnblRvQmVnaW5uaW5nLCBhZGRpdGlvbmFsT2Zmc2V0LCBhbmltYXRpb25NaWxsaXNlY29uZHMsIHJldHJ5SWZOZWVkZWQpO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIHNjcm9sbFRvSW5kZXhfaW50ZXJuYWwoaW5kZXg6IG51bWJlciwgYWxpZ25Ub0JlZ2lubmluZyA9IHRydWUsIGFkZGl0aW9uYWxPZmZzZXQgPSAwLCBhbmltYXRpb25NaWxsaXNlY29uZHM6IG51bWJlciA9IHVuZGVmaW5lZCwgYW5pbWF0aW9uQ29tcGxldGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSB1bmRlZmluZWQpOiB2b2lkIHtcclxuXHRcdGFuaW1hdGlvbk1pbGxpc2Vjb25kcyA9IGFuaW1hdGlvbk1pbGxpc2Vjb25kcyA9PT0gdW5kZWZpbmVkID8gdGhpcy5zY3JvbGxBbmltYXRpb25UaW1lIDogYW5pbWF0aW9uTWlsbGlzZWNvbmRzO1xyXG5cclxuXHRcdGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmNhbGN1bGF0ZURpbWVuc2lvbnMoKTtcclxuXHRcdGxldCBzY3JvbGwgPSB0aGlzLmNhbGN1bGF0ZVBhZGRpbmcoaW5kZXgsIGRpbWVuc2lvbnMpICsgYWRkaXRpb25hbE9mZnNldDtcclxuXHRcdGlmICghYWxpZ25Ub0JlZ2lubmluZykge1xyXG5cdFx0XHRzY3JvbGwgLT0gZGltZW5zaW9ucy53cmFwR3JvdXBzUGVyUGFnZSAqIGRpbWVuc2lvbnNbdGhpcy5fY2hpbGRTY3JvbGxEaW1dO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuc2Nyb2xsVG9Qb3NpdGlvbihzY3JvbGwsIGFuaW1hdGlvbk1pbGxpc2Vjb25kcywgYW5pbWF0aW9uQ29tcGxldGVkQ2FsbGJhY2spO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHNjcm9sbFRvUG9zaXRpb24oc2Nyb2xsUG9zaXRpb246IG51bWJlciwgYW5pbWF0aW9uTWlsbGlzZWNvbmRzOiBudW1iZXIgPSB1bmRlZmluZWQsIGFuaW1hdGlvbkNvbXBsZXRlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gdW5kZWZpbmVkKTogdm9pZCB7XHJcblx0XHRzY3JvbGxQb3NpdGlvbiArPSB0aGlzLmdldEVsZW1lbnRzT2Zmc2V0KCk7XHJcblxyXG5cdFx0YW5pbWF0aW9uTWlsbGlzZWNvbmRzID0gYW5pbWF0aW9uTWlsbGlzZWNvbmRzID09PSB1bmRlZmluZWQgPyB0aGlzLnNjcm9sbEFuaW1hdGlvblRpbWUgOiBhbmltYXRpb25NaWxsaXNlY29uZHM7XHJcblxyXG5cdFx0Y29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuZ2V0U2Nyb2xsRWxlbWVudCgpO1xyXG5cclxuXHRcdGxldCBhbmltYXRpb25SZXF1ZXN0OiBudW1iZXI7XHJcblxyXG5cdFx0aWYgKHRoaXMuY3VycmVudFR3ZWVuKSB7XHJcblx0XHRcdHRoaXMuY3VycmVudFR3ZWVuLnN0b3AoKTtcclxuXHRcdFx0dGhpcy5jdXJyZW50VHdlZW4gPSB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFhbmltYXRpb25NaWxsaXNlY29uZHMpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShzY3JvbGxFbGVtZW50LCB0aGlzLl9zY3JvbGxUeXBlLCBzY3JvbGxQb3NpdGlvbik7XHJcblx0XHRcdHRoaXMucmVmcmVzaF9pbnRlcm5hbChmYWxzZSwgYW5pbWF0aW9uQ29tcGxldGVkQ2FsbGJhY2spO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdHdlZW5Db25maWdPYmogPSB7IHNjcm9sbFBvc2l0aW9uOiBzY3JvbGxFbGVtZW50W3RoaXMuX3Njcm9sbFR5cGVdIH07XHJcblxyXG5cdFx0Y29uc3QgbmV3VHdlZW4gPSBuZXcgdHdlZW4uVHdlZW4odHdlZW5Db25maWdPYmopXHJcblx0XHRcdC50byh7IHNjcm9sbFBvc2l0aW9uIH0sIGFuaW1hdGlvbk1pbGxpc2Vjb25kcylcclxuXHRcdFx0LmVhc2luZyh0d2Vlbi5FYXNpbmcuUXVhZHJhdGljLk91dClcclxuXHRcdFx0Lm9uVXBkYXRlKChkYXRhKSA9PiB7XHJcblx0XHRcdFx0aWYgKGlzTmFOKGRhdGEuc2Nyb2xsUG9zaXRpb24pKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoc2Nyb2xsRWxlbWVudCwgdGhpcy5fc2Nyb2xsVHlwZSwgZGF0YS5zY3JvbGxQb3NpdGlvbik7XHJcblx0XHRcdFx0dGhpcy5yZWZyZXNoX2ludGVybmFsKGZhbHNlKTtcclxuXHRcdFx0fSlcclxuXHRcdFx0Lm9uU3RvcCgoKSA9PiB7XHJcblx0XHRcdFx0Y2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uUmVxdWVzdCk7XHJcblx0XHRcdH0pXHJcblx0XHRcdC5zdGFydCgpO1xyXG5cclxuXHRcdGNvbnN0IGFuaW1hdGUgPSAodGltZT86IG51bWJlcikgPT4ge1xyXG5cdFx0XHRpZiAoIW5ld1R3ZWVuW1wiaXNQbGF5aW5nXCJdKCkpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG5ld1R3ZWVuLnVwZGF0ZSh0aW1lKTtcclxuXHRcdFx0aWYgKHR3ZWVuQ29uZmlnT2JqLnNjcm9sbFBvc2l0aW9uID09PSBzY3JvbGxQb3NpdGlvbikge1xyXG5cdFx0XHRcdHRoaXMucmVmcmVzaF9pbnRlcm5hbChmYWxzZSwgYW5pbWF0aW9uQ29tcGxldGVkQ2FsbGJhY2spO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuXHRcdFx0XHRhbmltYXRpb25SZXF1ZXN0ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH07XHJcblxyXG5cdFx0YW5pbWF0ZSgpO1xyXG5cdFx0dGhpcy5jdXJyZW50VHdlZW4gPSBuZXdUd2VlbjtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBpc0FuZ3VsYXJVbml2ZXJzYWxTU1I6IGJvb2xlYW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJvdGVjdGVkIHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnRSZWYsXHJcblx0XHRwcm90ZWN0ZWQgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuXHRcdHByb3RlY3RlZCByZWFkb25seSB6b25lOiBOZ1pvbmUsXHJcblx0XHRwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG5cdFx0QEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogYW55LFxyXG5cdFx0QE9wdGlvbmFsKCkgQEluamVjdCgndmlydHVhbC1zY3JvbGxlci1kZWZhdWx0LW9wdGlvbnMnKVxyXG5cdFx0b3B0aW9uczogVmlydHVhbFNjcm9sbGVyRGVmYXVsdE9wdGlvbnNcclxuXHQpIHtcclxuXHJcblx0XHR0aGlzLmlzQW5ndWxhclVuaXZlcnNhbFNTUiA9IGlzUGxhdGZvcm1TZXJ2ZXIocGxhdGZvcm1JZCk7XHJcblxyXG5cdFx0dGhpcy5jaGVja1Jlc2l6ZUludGVydmFsID0gb3B0aW9ucy5jaGVja1Jlc2l6ZUludGVydmFsO1xyXG5cdFx0dGhpcy5tb2RpZnlPdmVyZmxvd1N0eWxlT2ZQYXJlbnRTY3JvbGwgPSBvcHRpb25zLm1vZGlmeU92ZXJmbG93U3R5bGVPZlBhcmVudFNjcm9sbDtcclxuXHRcdHRoaXMucmVzaXplQnlwYXNzUmVmcmVzaFRocmVzaG9sZCA9IG9wdGlvbnMucmVzaXplQnlwYXNzUmVmcmVzaFRocmVzaG9sZDtcclxuXHRcdHRoaXMuc2Nyb2xsQW5pbWF0aW9uVGltZSA9IG9wdGlvbnMuc2Nyb2xsQW5pbWF0aW9uVGltZTtcclxuXHRcdHRoaXMuc2Nyb2xsRGVib3VuY2VUaW1lID0gb3B0aW9ucy5zY3JvbGxEZWJvdW5jZVRpbWU7XHJcblx0XHR0aGlzLnNjcm9sbFRocm90dGxpbmdUaW1lID0gb3B0aW9ucy5zY3JvbGxUaHJvdHRsaW5nVGltZTtcclxuXHRcdHRoaXMuc2Nyb2xsYmFySGVpZ2h0ID0gb3B0aW9ucy5zY3JvbGxiYXJIZWlnaHQ7XHJcblx0XHR0aGlzLnNjcm9sbGJhcldpZHRoID0gb3B0aW9ucy5zY3JvbGxiYXJXaWR0aDtcclxuXHRcdHRoaXMuc3RyaXBlZFRhYmxlID0gb3B0aW9ucy5zdHJpcGVkVGFibGU7XHJcblxyXG5cdFx0dGhpcy5ob3Jpem9udGFsID0gZmFsc2U7XHJcblx0XHR0aGlzLnJlc2V0V3JhcEdyb3VwRGltZW5zaW9ucygpO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIGdldEVsZW1lbnRTaXplKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55IHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHRjb25zdCBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xyXG5cdFx0Y29uc3QgbWFyZ2luVG9wID0gcGFyc2VJbnQoc3R5bGVzWydtYXJnaW4tdG9wJ10sIDEwKSB8fCAwO1xyXG5cdFx0Y29uc3QgbWFyZ2luQm90dG9tID0gcGFyc2VJbnQoc3R5bGVzWydtYXJnaW4tYm90dG9tJ10sIDEwKSB8fCAwO1xyXG5cdFx0Y29uc3QgbWFyZ2luTGVmdCA9IHBhcnNlSW50KHN0eWxlc1snbWFyZ2luLWxlZnQnXSwgMTApIHx8IDA7XHJcblx0XHRjb25zdCBtYXJnaW5SaWdodCA9IHBhcnNlSW50KHN0eWxlc1snbWFyZ2luLXJpZ2h0J10sIDEwKSB8fCAwO1xyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHRvcDogcmVzdWx0LnRvcCArIG1hcmdpblRvcCxcclxuXHRcdFx0Ym90dG9tOiByZXN1bHQuYm90dG9tICsgbWFyZ2luQm90dG9tLFxyXG5cdFx0XHRsZWZ0OiByZXN1bHQubGVmdCArIG1hcmdpbkxlZnQsXHJcblx0XHRcdHJpZ2h0OiByZXN1bHQucmlnaHQgKyBtYXJnaW5SaWdodCxcclxuXHRcdFx0d2lkdGg6IHJlc3VsdC53aWR0aCArIG1hcmdpbkxlZnQgKyBtYXJnaW5SaWdodCxcclxuXHRcdFx0aGVpZ2h0OiByZXN1bHQuaGVpZ2h0ICsgbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIHByZXZpb3VzU2Nyb2xsQm91bmRpbmdSZWN0OiBDbGllbnRSZWN0O1xyXG5cdHByb3RlY3RlZCBjaGVja1Njcm9sbEVsZW1lbnRSZXNpemVkKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgYm91bmRpbmdSZWN0ID0gdGhpcy5nZXRFbGVtZW50U2l6ZSh0aGlzLmdldFNjcm9sbEVsZW1lbnQoKSk7XHJcblxyXG5cdFx0bGV0IHNpemVDaGFuZ2VkOiBib29sZWFuO1xyXG5cdFx0aWYgKCF0aGlzLnByZXZpb3VzU2Nyb2xsQm91bmRpbmdSZWN0KSB7XHJcblx0XHRcdHNpemVDaGFuZ2VkID0gdHJ1ZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IHdpZHRoQ2hhbmdlID0gTWF0aC5hYnMoYm91bmRpbmdSZWN0LndpZHRoIC0gdGhpcy5wcmV2aW91c1Njcm9sbEJvdW5kaW5nUmVjdC53aWR0aCk7XHJcblx0XHRcdGNvbnN0IGhlaWdodENoYW5nZSA9IE1hdGguYWJzKGJvdW5kaW5nUmVjdC5oZWlnaHQgLSB0aGlzLnByZXZpb3VzU2Nyb2xsQm91bmRpbmdSZWN0LmhlaWdodCk7XHJcblx0XHRcdHNpemVDaGFuZ2VkID0gd2lkdGhDaGFuZ2UgPiB0aGlzLnJlc2l6ZUJ5cGFzc1JlZnJlc2hUaHJlc2hvbGQgfHwgaGVpZ2h0Q2hhbmdlID4gdGhpcy5yZXNpemVCeXBhc3NSZWZyZXNoVGhyZXNob2xkO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChzaXplQ2hhbmdlZCkge1xyXG5cdFx0XHR0aGlzLnByZXZpb3VzU2Nyb2xsQm91bmRpbmdSZWN0ID0gYm91bmRpbmdSZWN0O1xyXG5cdFx0XHRpZiAoYm91bmRpbmdSZWN0LndpZHRoID4gMCAmJiBib3VuZGluZ1JlY3QuaGVpZ2h0ID4gMCkge1xyXG5cdFx0XHRcdHRoaXMucmVmcmVzaF9pbnRlcm5hbChmYWxzZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBfaW52aXNpYmxlUGFkZGluZ1Byb3BlcnR5O1xyXG5cdHByb3RlY3RlZCBfb2Zmc2V0VHlwZTtcclxuXHRwcm90ZWN0ZWQgX3Njcm9sbFR5cGU7XHJcblx0cHJvdGVjdGVkIF9wYWdlT2Zmc2V0VHlwZTtcclxuXHRwcm90ZWN0ZWQgX2NoaWxkU2Nyb2xsRGltO1xyXG5cdHByb3RlY3RlZCBfdHJhbnNsYXRlRGlyO1xyXG5cdHByb3RlY3RlZCBfbWFyZ2luRGlyO1xyXG5cdHByb3RlY3RlZCB1cGRhdGVEaXJlY3Rpb24oKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5ob3Jpem9udGFsKSB7XHJcblx0XHRcdHRoaXMuX2NoaWxkU2Nyb2xsRGltID0gJ2NoaWxkV2lkdGgnO1xyXG5cdFx0XHR0aGlzLl9pbnZpc2libGVQYWRkaW5nUHJvcGVydHkgPSAnc2NhbGVYJztcclxuXHRcdFx0dGhpcy5fbWFyZ2luRGlyID0gJ21hcmdpbi1sZWZ0JztcclxuXHRcdFx0dGhpcy5fb2Zmc2V0VHlwZSA9ICdvZmZzZXRMZWZ0JztcclxuXHRcdFx0dGhpcy5fcGFnZU9mZnNldFR5cGUgPSAncGFnZVhPZmZzZXQnO1xyXG5cdFx0XHR0aGlzLl9zY3JvbGxUeXBlID0gJ3Njcm9sbExlZnQnO1xyXG5cdFx0XHR0aGlzLl90cmFuc2xhdGVEaXIgPSAndHJhbnNsYXRlWCc7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy5fY2hpbGRTY3JvbGxEaW0gPSAnY2hpbGRIZWlnaHQnO1xyXG5cdFx0XHR0aGlzLl9pbnZpc2libGVQYWRkaW5nUHJvcGVydHkgPSAnc2NhbGVZJztcclxuXHRcdFx0dGhpcy5fbWFyZ2luRGlyID0gJ21hcmdpbi10b3AnO1xyXG5cdFx0XHR0aGlzLl9vZmZzZXRUeXBlID0gJ29mZnNldFRvcCc7XHJcblx0XHRcdHRoaXMuX3BhZ2VPZmZzZXRUeXBlID0gJ3BhZ2VZT2Zmc2V0JztcclxuXHRcdFx0dGhpcy5fc2Nyb2xsVHlwZSA9ICdzY3JvbGxUb3AnO1xyXG5cdFx0XHR0aGlzLl90cmFuc2xhdGVEaXIgPSAndHJhbnNsYXRlWSc7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgZGVib3VuY2UoZnVuYzogKCkgPT4gdm9pZCwgd2FpdDogbnVtYmVyLCAuLi5hcmdzKTogKCkgPT4gdm9pZCB7XHJcblx0XHRjb25zdCB0aHJvdHRsZWQgPSB0aGlzLnRocm90dGxlVHJhaWxpbmcoZnVuYywgd2FpdCk7XHJcblx0XHRjb25zdCByZXN1bHQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHRocm90dGxlZFsnY2FuY2VsJ10oKTtcclxuXHRcdFx0dGhyb3R0bGVkLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG5cdFx0fTtcclxuXHRcdHJlc3VsdFsnY2FuY2VsJ10gPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHRocm90dGxlZFsnY2FuY2VsJ10oKTtcclxuXHRcdH07XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCB0aHJvdHRsZVRyYWlsaW5nKGZ1bmM6ICgpID0+IHZvaWQsIHdhaXQ6IG51bWJlciwgLi4uYXJncyk6ICgpID0+IHZvaWQge1xyXG5cdFx0bGV0IHRpbWVvdXQgPSB1bmRlZmluZWQ7XHJcblx0XHRsZXQgX2FyZ3VtZW50cyA9IGFyZ3M7XHJcblx0XHRjb25zdCByZXN1bHQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGNvbnN0IF90aGlzID0gdGhpcztcclxuXHRcdFx0X2FyZ3VtZW50cyA9IGFyZ3NcclxuXHJcblx0XHRcdGlmICh0aW1lb3V0KSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAod2FpdCA8PSAwKSB7XHJcblx0XHRcdFx0ZnVuYy5hcHBseShfdGhpcywgX2FyZ3VtZW50cyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0dGltZW91dCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRcdGZ1bmMuYXBwbHkoX3RoaXMsIF9hcmd1bWVudHMpO1xyXG5cdFx0XHRcdH0sIHdhaXQpO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0cmVzdWx0WydjYW5jZWwnXSA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aWYgKHRpbWVvdXQpIHtcclxuXHRcdFx0XHRjbGVhclRpbWVvdXQodGltZW91dCk7XHJcblx0XHRcdFx0dGltZW91dCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIGNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCA9IDA7XHJcblx0cHJvdGVjdGVkIGNhbGN1bGF0ZWRTY3JvbGxiYXJIZWlnaHQgPSAwO1xyXG5cclxuXHRwcm90ZWN0ZWQgcGFkZGluZyA9IDA7XHJcblx0cHJvdGVjdGVkIHByZXZpb3VzVmlld1BvcnQ6IElWaWV3cG9ydCA9IDxhbnk+e307XHJcblx0cHJvdGVjdGVkIGN1cnJlbnRUd2VlbjogdHdlZW4uVHdlZW47XHJcblx0cHJvdGVjdGVkIGNhY2hlZEl0ZW1zTGVuZ3RoOiBudW1iZXI7XHJcblxyXG5cdHByb3RlY3RlZCBkaXNwb3NlU2Nyb2xsSGFuZGxlcjogKCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuXHRwcm90ZWN0ZWQgZGlzcG9zZVJlc2l6ZUhhbmRsZXI6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcblxyXG5cdHByb3RlY3RlZCByZWZyZXNoX2ludGVybmFsKGl0ZW1zQXJyYXlNb2RpZmllZDogYm9vbGVhbiwgcmVmcmVzaENvbXBsZXRlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gdW5kZWZpbmVkLCBtYXhSdW5UaW1lcyA9IDIpOiB2b2lkIHtcclxuXHRcdC8vbm90ZTogbWF4UnVuVGltZXMgaXMgdG8gZm9yY2UgaXQgdG8ga2VlcCByZWNhbGN1bGF0aW5nIGlmIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gY2F1c2VkIGEgcmUtcmVuZGVyIChkaWZmZXJlbnQgc2xpY2VkIGl0ZW1zIGluIHZpZXdwb3J0IG9yIHNjcm9sbFBvc2l0aW9uIGNoYW5nZWQpLlxyXG5cdFx0Ly9UaGUgZGVmYXVsdCBvZiAyeCBtYXggd2lsbCBwcm9iYWJseSBiZSBhY2N1cmF0ZSBlbm91Z2ggd2l0aG91dCBjYXVzaW5nIHRvbyBsYXJnZSBhIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tcclxuXHRcdC8vVGhlIGNvZGUgd291bGQgdHlwaWNhbGx5IHF1aXQgb3V0IG9uIHRoZSAybmQgaXRlcmF0aW9uIGFueXdheXMuIFRoZSBtYWluIHRpbWUgaXQnZCB0aGluayBtb3JlIHRoYW4gMiBydW5zIHdvdWxkIGJlIG5lY2Vzc2FyeSB3b3VsZCBiZSBmb3IgdmFzdGx5IGRpZmZlcmVudCBzaXplZCBjaGlsZCBpdGVtcyBvciBpZiB0aGlzIGlzIHRoZSAxc3QgdGltZSB0aGUgaXRlbXMgYXJyYXkgd2FzIGluaXRpYWxpemVkLlxyXG5cdFx0Ly9XaXRob3V0IG1heFJ1blRpbWVzLCBJZiB0aGUgdXNlciBpcyBhY3RpdmVseSBzY3JvbGxpbmcgdGhpcyBjb2RlIHdvdWxkIGJlY29tZSBhbiBpbmZpbml0ZSBsb29wIHVudGlsIHRoZXkgc3RvcHBlZCBzY3JvbGxpbmcuIFRoaXMgd291bGQgYmUgb2theSwgZXhjZXB0IGVhY2ggc2Nyb2xsIGV2ZW50IHdvdWxkIHN0YXJ0IGFuIGFkZGl0aW9uYWwgaW5maW50ZSBsb29wLiBXZSB3YW50IHRvIHNob3J0LWNpcmN1aXQgaXQgdG8gcHJldmVudCB0aGlzLlxyXG5cclxuXHRcdGlmIChpdGVtc0FycmF5TW9kaWZpZWQgJiYgdGhpcy5wcmV2aW91c1ZpZXdQb3J0ICYmIHRoaXMucHJldmlvdXNWaWV3UG9ydC5zY3JvbGxTdGFydFBvc2l0aW9uID4gMCkge1xyXG5cdFx0XHQvL2lmIGl0ZW1zIHdlcmUgcHJlcGVuZGVkLCBzY3JvbGwgZm9yd2FyZCB0byBrZWVwIHNhbWUgaXRlbXMgdmlzaWJsZVxyXG5cdFx0XHRjb25zdCBvbGRWaWV3UG9ydCA9IHRoaXMucHJldmlvdXNWaWV3UG9ydDtcclxuXHRcdFx0Y29uc3Qgb2xkVmlld1BvcnRJdGVtcyA9IHRoaXMudmlld1BvcnRJdGVtcztcclxuXHJcblx0XHRcdGNvbnN0IG9sZFJlZnJlc2hDb21wbGV0ZWRDYWxsYmFjayA9IHJlZnJlc2hDb21wbGV0ZWRDYWxsYmFjaztcclxuXHRcdFx0cmVmcmVzaENvbXBsZXRlZENhbGxiYWNrID0gKCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHNjcm9sbExlbmd0aERlbHRhID0gdGhpcy5wcmV2aW91c1ZpZXdQb3J0LnNjcm9sbExlbmd0aCAtIG9sZFZpZXdQb3J0LnNjcm9sbExlbmd0aDtcclxuXHRcdFx0XHRpZiAoc2Nyb2xsTGVuZ3RoRGVsdGEgPiAwICYmIHRoaXMudmlld1BvcnRJdGVtcykge1xyXG5cdFx0XHRcdFx0Y29uc3Qgb2xkU3RhcnRJdGVtID0gb2xkVmlld1BvcnRJdGVtc1swXTtcclxuXHRcdFx0XHRcdGNvbnN0IG9sZFN0YXJ0SXRlbUluZGV4ID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoeCA9PiB0aGlzLmNvbXBhcmVJdGVtcyhvbGRTdGFydEl0ZW0sIHgpKTtcclxuXHRcdFx0XHRcdGlmIChvbGRTdGFydEl0ZW1JbmRleCA+IHRoaXMucHJldmlvdXNWaWV3UG9ydC5zdGFydEluZGV4V2l0aEJ1ZmZlcikge1xyXG5cdFx0XHRcdFx0XHRsZXQgaXRlbU9yZGVyQ2hhbmdlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMudmlld1BvcnRJdGVtcy5sZW5ndGg7ICsraSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICghdGhpcy5jb21wYXJlSXRlbXModGhpcy5pdGVtc1tvbGRTdGFydEl0ZW1JbmRleCArIGldLCBvbGRWaWV3UG9ydEl0ZW1zW2ldKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aXRlbU9yZGVyQ2hhbmdlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICghaXRlbU9yZGVyQ2hhbmdlZCkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2Nyb2xsVG9Qb3NpdGlvbih0aGlzLnByZXZpb3VzVmlld1BvcnQuc2Nyb2xsU3RhcnRQb3NpdGlvbiArIHNjcm9sbExlbmd0aERlbHRhLCAwLCBvbGRSZWZyZXNoQ29tcGxldGVkQ2FsbGJhY2spO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKG9sZFJlZnJlc2hDb21wbGV0ZWRDYWxsYmFjaykge1xyXG5cdFx0XHRcdFx0b2xkUmVmcmVzaENvbXBsZXRlZENhbGxiYWNrKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcblxyXG5cdFx0XHRcdGlmIChpdGVtc0FycmF5TW9kaWZpZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMucmVzZXRXcmFwR3JvdXBEaW1lbnNpb25zKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5jYWxjdWxhdGVWaWV3cG9ydCgpO1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdGFydENoYW5nZWQgPSBpdGVtc0FycmF5TW9kaWZpZWQgfHwgdmlld3BvcnQuc3RhcnRJbmRleCAhPT0gdGhpcy5wcmV2aW91c1ZpZXdQb3J0LnN0YXJ0SW5kZXg7XHJcblx0XHRcdFx0Y29uc3QgZW5kQ2hhbmdlZCA9IGl0ZW1zQXJyYXlNb2RpZmllZCB8fCB2aWV3cG9ydC5lbmRJbmRleCAhPT0gdGhpcy5wcmV2aW91c1ZpZXdQb3J0LmVuZEluZGV4O1xyXG5cdFx0XHRcdGNvbnN0IHNjcm9sbExlbmd0aENoYW5nZWQgPSB2aWV3cG9ydC5zY3JvbGxMZW5ndGggIT09IHRoaXMucHJldmlvdXNWaWV3UG9ydC5zY3JvbGxMZW5ndGg7XHJcblx0XHRcdFx0Y29uc3QgcGFkZGluZ0NoYW5nZWQgPSB2aWV3cG9ydC5wYWRkaW5nICE9PSB0aGlzLnByZXZpb3VzVmlld1BvcnQucGFkZGluZztcclxuXHRcdFx0XHRjb25zdCBzY3JvbGxQb3NpdGlvbkNoYW5nZWQgPSB2aWV3cG9ydC5zY3JvbGxTdGFydFBvc2l0aW9uICE9PSB0aGlzLnByZXZpb3VzVmlld1BvcnQuc2Nyb2xsU3RhcnRQb3NpdGlvbiB8fCB2aWV3cG9ydC5zY3JvbGxFbmRQb3NpdGlvbiAhPT0gdGhpcy5wcmV2aW91c1ZpZXdQb3J0LnNjcm9sbEVuZFBvc2l0aW9uIHx8IHZpZXdwb3J0Lm1heFNjcm9sbFBvc2l0aW9uICE9PSB0aGlzLnByZXZpb3VzVmlld1BvcnQubWF4U2Nyb2xsUG9zaXRpb247XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNjcm9sbERpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uVHlwZSA9IHRoaXMucHJldmlvdXNWaWV3UG9ydC5lbmRJbmRleCA8PSB2aWV3cG9ydC5lbmRJbmRleCA/ICdmb3J3YXJkJyA6ICdiYWNrd2FyZCc7XHJcblx0XHRcdFx0dGhpcy5wcmV2aW91c1ZpZXdQb3J0ID0gdmlld3BvcnQ7XHJcblxyXG5cdFx0XHRcdGlmIChzY3JvbGxMZW5ndGhDaGFuZ2VkKSB7XHJcblx0XHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaW52aXNpYmxlUGFkZGluZ0VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsIGAke3RoaXMuX2ludmlzaWJsZVBhZGRpbmdQcm9wZXJ0eX0oJHt2aWV3cG9ydC5zY3JvbGxMZW5ndGh9KWApO1xyXG5cdFx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmludmlzaWJsZVBhZGRpbmdFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd3ZWJraXRUcmFuc2Zvcm0nLCBgJHt0aGlzLl9pbnZpc2libGVQYWRkaW5nUHJvcGVydHl9KCR7dmlld3BvcnQuc2Nyb2xsTGVuZ3RofSlgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChwYWRkaW5nQ2hhbmdlZCkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMudXNlTWFyZ2luSW5zdGVhZE9mVHJhbnNsYXRlKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jb250ZW50RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9tYXJnaW5EaXIsIGAke3ZpZXdwb3J0LnBhZGRpbmd9cHhgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY29udGVudEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsIGAke3RoaXMuX3RyYW5zbGF0ZURpcn0oJHt2aWV3cG9ydC5wYWRkaW5nfXB4KWApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY29udGVudEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3dlYmtpdFRyYW5zZm9ybScsIGAke3RoaXMuX3RyYW5zbGF0ZURpcn0oJHt2aWV3cG9ydC5wYWRkaW5nfXB4KWApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuaGVhZGVyRWxlbWVudFJlZikge1xyXG5cdFx0XHRcdFx0Y29uc3Qgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLmdldFNjcm9sbEVsZW1lbnQoKVt0aGlzLl9zY3JvbGxUeXBlXTtcclxuXHRcdFx0XHRcdGNvbnN0IGNvbnRhaW5lck9mZnNldCA9IHRoaXMuZ2V0RWxlbWVudHNPZmZzZXQoKTtcclxuXHRcdFx0XHRcdGNvbnN0IG9mZnNldCA9IE1hdGgubWF4KHNjcm9sbFBvc2l0aW9uIC0gdmlld3BvcnQucGFkZGluZyAtIGNvbnRhaW5lck9mZnNldCArIHRoaXMuaGVhZGVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCwgMCk7XHJcblx0XHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaGVhZGVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgYCR7dGhpcy5fdHJhbnNsYXRlRGlyfSgke29mZnNldH1weClgKTtcclxuXHRcdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5oZWFkZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd3ZWJraXRUcmFuc2Zvcm0nLCBgJHt0aGlzLl90cmFuc2xhdGVEaXJ9KCR7b2Zmc2V0fXB4KWApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgY2hhbmdlRXZlbnRBcmc6IElQYWdlSW5mbyA9IChzdGFydENoYW5nZWQgfHwgZW5kQ2hhbmdlZCkgPyB7XHJcblx0XHRcdFx0XHRzdGFydEluZGV4OiB2aWV3cG9ydC5zdGFydEluZGV4LFxyXG5cdFx0XHRcdFx0ZW5kSW5kZXg6IHZpZXdwb3J0LmVuZEluZGV4LFxyXG5cdFx0XHRcdFx0c2Nyb2xsU3RhcnRQb3NpdGlvbjogdmlld3BvcnQuc2Nyb2xsU3RhcnRQb3NpdGlvbixcclxuXHRcdFx0XHRcdHNjcm9sbEVuZFBvc2l0aW9uOiB2aWV3cG9ydC5zY3JvbGxFbmRQb3NpdGlvbixcclxuXHRcdFx0XHRcdHNjcm9sbERpcmVjdGlvbjogc2Nyb2xsRGlyZWN0aW9uLFxyXG5cdFx0XHRcdFx0c3RhcnRJbmRleFdpdGhCdWZmZXI6IHZpZXdwb3J0LnN0YXJ0SW5kZXhXaXRoQnVmZmVyLFxyXG5cdFx0XHRcdFx0ZW5kSW5kZXhXaXRoQnVmZmVyOiB2aWV3cG9ydC5lbmRJbmRleFdpdGhCdWZmZXIsXHJcblx0XHRcdFx0XHRtYXhTY3JvbGxQb3NpdGlvbjogdmlld3BvcnQubWF4U2Nyb2xsUG9zaXRpb24sXHJcblx0XHRcdFx0fSA6IHVuZGVmaW5lZDtcclxuXHJcblxyXG5cdFx0XHRcdGlmIChzdGFydENoYW5nZWQgfHwgZW5kQ2hhbmdlZCB8fCBzY3JvbGxQb3NpdGlvbkNoYW5nZWQpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGhhbmRsZUNoYW5nZWQgPSAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdC8vIHVwZGF0ZSB0aGUgc2Nyb2xsIGxpc3QgdG8gdHJpZ2dlciByZS1yZW5kZXIgb2YgY29tcG9uZW50cyBpbiB2aWV3cG9ydFxyXG5cdFx0XHRcdFx0XHR0aGlzLnZpZXdQb3J0SXRlbXMgPSB2aWV3cG9ydC5zdGFydEluZGV4V2l0aEJ1ZmZlciA+PSAwICYmIHZpZXdwb3J0LmVuZEluZGV4V2l0aEJ1ZmZlciA+PSAwID8gdGhpcy5pdGVtcy5zbGljZSh2aWV3cG9ydC5zdGFydEluZGV4V2l0aEJ1ZmZlciwgdmlld3BvcnQuZW5kSW5kZXhXaXRoQnVmZmVyICsgMSkgOiBbXTtcclxuXHRcdFx0XHRcdFx0dGhpcy52c1VwZGF0ZS5lbWl0KHRoaXMudmlld1BvcnRJdGVtcyk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoc3RhcnRDaGFuZ2VkKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy52c1N0YXJ0LmVtaXQoY2hhbmdlRXZlbnRBcmcpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoZW5kQ2hhbmdlZCkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudnNFbmQuZW1pdChjaGFuZ2VFdmVudEFyZyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChzdGFydENoYW5nZWQgfHwgZW5kQ2hhbmdlZCkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy52c0NoYW5nZS5lbWl0KGNoYW5nZUV2ZW50QXJnKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKG1heFJ1blRpbWVzID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVmcmVzaF9pbnRlcm5hbChmYWxzZSwgcmVmcmVzaENvbXBsZXRlZENhbGxiYWNrLCBtYXhSdW5UaW1lcyAtIDEpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKHJlZnJlc2hDb21wbGV0ZWRDYWxsYmFjaykge1xyXG5cdFx0XHRcdFx0XHRcdHJlZnJlc2hDb21wbGV0ZWRDYWxsYmFjaygpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHJcblx0XHRcdFx0XHRpZiAodGhpcy5leGVjdXRlUmVmcmVzaE91dHNpZGVBbmd1bGFyWm9uZSkge1xyXG5cdFx0XHRcdFx0XHRoYW5kbGVDaGFuZ2VkKCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0dGhpcy56b25lLnJ1bihoYW5kbGVDaGFuZ2VkKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aWYgKG1heFJ1blRpbWVzID4gMCAmJiAoc2Nyb2xsTGVuZ3RoQ2hhbmdlZCB8fCBwYWRkaW5nQ2hhbmdlZCkpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWZyZXNoX2ludGVybmFsKGZhbHNlLCByZWZyZXNoQ29tcGxldGVkQ2FsbGJhY2ssIG1heFJ1blRpbWVzIC0gMSk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAocmVmcmVzaENvbXBsZXRlZENhbGxiYWNrKSB7XHJcblx0XHRcdFx0XHRcdHJlZnJlc2hDb21wbGV0ZWRDYWxsYmFjaygpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBnZXRTY3JvbGxFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcclxuXHRcdHJldHVybiB0aGlzLnBhcmVudFNjcm9sbCBpbnN0YW5jZW9mIFdpbmRvdyA/IGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkgOiB0aGlzLnBhcmVudFNjcm9sbCB8fCB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBhZGRTY3JvbGxFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuaXNBbmd1bGFyVW5pdmVyc2FsU1NSKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5nZXRTY3JvbGxFbGVtZW50KCk7XHJcblxyXG5cdFx0dGhpcy5yZW1vdmVTY3JvbGxFdmVudEhhbmRsZXJzKCk7XHJcblxyXG5cdFx0dGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuXHRcdFx0aWYgKHRoaXMucGFyZW50U2Nyb2xsIGluc3RhbmNlb2YgV2luZG93KSB7XHJcblx0XHRcdFx0dGhpcy5kaXNwb3NlU2Nyb2xsSGFuZGxlciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAnc2Nyb2xsJywgdGhpcy5vblNjcm9sbCk7XHJcblx0XHRcdFx0dGhpcy5kaXNwb3NlUmVzaXplSGFuZGxlciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAncmVzaXplJywgdGhpcy5vblNjcm9sbCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5kaXNwb3NlU2Nyb2xsSGFuZGxlciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHNjcm9sbEVsZW1lbnQsICdzY3JvbGwnLCB0aGlzLm9uU2Nyb2xsKTtcclxuXHRcdFx0XHRpZiAodGhpcy5fY2hlY2tSZXNpemVJbnRlcnZhbCA+IDApIHtcclxuXHRcdFx0XHRcdHRoaXMuY2hlY2tTY3JvbGxFbGVtZW50UmVzaXplZFRpbWVyID0gPGFueT5zZXRJbnRlcnZhbCgoKSA9PiB7IHRoaXMuY2hlY2tTY3JvbGxFbGVtZW50UmVzaXplZCgpOyB9LCB0aGlzLl9jaGVja1Jlc2l6ZUludGVydmFsKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIHJlbW92ZVNjcm9sbEV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5jaGVja1Njcm9sbEVsZW1lbnRSZXNpemVkVGltZXIpIHtcclxuXHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLmNoZWNrU2Nyb2xsRWxlbWVudFJlc2l6ZWRUaW1lcik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuZGlzcG9zZVNjcm9sbEhhbmRsZXIpIHtcclxuXHRcdFx0dGhpcy5kaXNwb3NlU2Nyb2xsSGFuZGxlcigpO1xyXG5cdFx0XHR0aGlzLmRpc3Bvc2VTY3JvbGxIYW5kbGVyID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmRpc3Bvc2VSZXNpemVIYW5kbGVyKSB7XHJcblx0XHRcdHRoaXMuZGlzcG9zZVJlc2l6ZUhhbmRsZXIoKTtcclxuXHRcdFx0dGhpcy5kaXNwb3NlUmVzaXplSGFuZGxlciA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBnZXRFbGVtZW50c09mZnNldCgpOiBudW1iZXIge1xyXG5cdFx0aWYgKHRoaXMuaXNBbmd1bGFyVW5pdmVyc2FsU1NSKSB7XHJcblx0XHRcdHJldHVybiAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBvZmZzZXQgPSAwO1xyXG5cclxuXHRcdGlmICh0aGlzLmNvbnRhaW5lckVsZW1lbnRSZWYgJiYgdGhpcy5jb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcclxuXHRcdFx0b2Zmc2V0ICs9IHRoaXMuY29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50W3RoaXMuX29mZnNldFR5cGVdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnBhcmVudFNjcm9sbCkge1xyXG5cdFx0XHRjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5nZXRTY3JvbGxFbGVtZW50KCk7XHJcblx0XHRcdGNvbnN0IGVsZW1lbnRDbGllbnRSZWN0ID0gdGhpcy5nZXRFbGVtZW50U2l6ZSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcblx0XHRcdGNvbnN0IHNjcm9sbENsaWVudFJlY3QgPSB0aGlzLmdldEVsZW1lbnRTaXplKHNjcm9sbEVsZW1lbnQpO1xyXG5cdFx0XHRpZiAodGhpcy5ob3Jpem9udGFsKSB7XHJcblx0XHRcdFx0b2Zmc2V0ICs9IGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgLSBzY3JvbGxDbGllbnRSZWN0LmxlZnQ7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0b2Zmc2V0ICs9IGVsZW1lbnRDbGllbnRSZWN0LnRvcCAtIHNjcm9sbENsaWVudFJlY3QudG9wO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoISh0aGlzLnBhcmVudFNjcm9sbCBpbnN0YW5jZW9mIFdpbmRvdykpIHtcclxuXHRcdFx0XHRvZmZzZXQgKz0gc2Nyb2xsRWxlbWVudFt0aGlzLl9zY3JvbGxUeXBlXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvZmZzZXQ7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgY291bnRJdGVtc1BlcldyYXBHcm91cCgpOiBudW1iZXIge1xyXG5cdFx0aWYgKHRoaXMuaXNBbmd1bGFyVW5pdmVyc2FsU1NSKSB7XHJcblx0XHRcdHJldHVybiBNYXRoLnJvdW5kKHRoaXMuaG9yaXpvbnRhbCA/IHRoaXMuc3NyVmlld3BvcnRIZWlnaHQgLyB0aGlzLnNzckNoaWxkSGVpZ2h0IDogdGhpcy5zc3JWaWV3cG9ydFdpZHRoIC8gdGhpcy5zc3JDaGlsZFdpZHRoKTtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSB0aGlzLmhvcml6b250YWwgPyAnb2Zmc2V0TGVmdCcgOiAnb2Zmc2V0VG9wJztcclxuXHRcdGNvbnN0IGNoaWxkcmVuID0gKCh0aGlzLmNvbnRhaW5lckVsZW1lbnRSZWYgJiYgdGhpcy5jb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHx8IHRoaXMuY29udGVudEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuY2hpbGRyZW47XHJcblxyXG5cdFx0Y29uc3QgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbiA/IGNoaWxkcmVuLmxlbmd0aCA6IDA7XHJcblx0XHRpZiAoY2hpbGRyZW5MZW5ndGggPT09IDApIHtcclxuXHRcdFx0cmV0dXJuIDE7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZmlyc3RPZmZzZXQgPSBjaGlsZHJlblswXVtwcm9wZXJ0eU5hbWVdO1xyXG5cdFx0bGV0IHJlc3VsdCA9IDE7XHJcblx0XHR3aGlsZSAocmVzdWx0IDwgY2hpbGRyZW5MZW5ndGggJiYgZmlyc3RPZmZzZXQgPT09IGNoaWxkcmVuW3Jlc3VsdF1bcHJvcGVydHlOYW1lXSkge1xyXG5cdFx0XHQrK3Jlc3VsdDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIGdldFNjcm9sbFN0YXJ0UG9zaXRpb24oKTogbnVtYmVyIHtcclxuXHRcdGxldCB3aW5kb3dTY3JvbGxWYWx1ZSA9IHVuZGVmaW5lZDtcclxuXHRcdGlmICh0aGlzLnBhcmVudFNjcm9sbCBpbnN0YW5jZW9mIFdpbmRvdykge1xyXG5cdFx0XHR3aW5kb3dTY3JvbGxWYWx1ZSA9IHdpbmRvd1t0aGlzLl9wYWdlT2Zmc2V0VHlwZV07XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHdpbmRvd1Njcm9sbFZhbHVlIHx8IHRoaXMuZ2V0U2Nyb2xsRWxlbWVudCgpW3RoaXMuX3Njcm9sbFR5cGVdIHx8IDA7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgbWluTWVhc3VyZWRDaGlsZFdpZHRoOiBudW1iZXI7XHJcblx0cHJvdGVjdGVkIG1pbk1lYXN1cmVkQ2hpbGRIZWlnaHQ6IG51bWJlcjtcclxuXHJcblx0cHJvdGVjdGVkIHdyYXBHcm91cERpbWVuc2lvbnM6IFdyYXBHcm91cERpbWVuc2lvbnM7XHJcblxyXG5cdHByb3RlY3RlZCByZXNldFdyYXBHcm91cERpbWVuc2lvbnMoKTogdm9pZCB7XHJcblx0XHRjb25zdCBvbGRXcmFwR3JvdXBEaW1lbnNpb25zID0gdGhpcy53cmFwR3JvdXBEaW1lbnNpb25zO1xyXG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsQ2FjaGVkTWVhc3VyZW1lbnRzKCk7XHJcblxyXG5cdFx0aWYgKCF0aGlzLmVuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzIHx8ICFvbGRXcmFwR3JvdXBEaW1lbnNpb25zIHx8IG9sZFdyYXBHcm91cERpbWVuc2lvbnMubnVtYmVyT2ZLbm93bldyYXBHcm91cENoaWxkU2l6ZXMgPT09IDApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGl0ZW1zUGVyV3JhcEdyb3VwOiBudW1iZXIgPSB0aGlzLmNvdW50SXRlbXNQZXJXcmFwR3JvdXAoKTtcclxuXHRcdGZvciAobGV0IHdyYXBHcm91cEluZGV4ID0gMDsgd3JhcEdyb3VwSW5kZXggPCBvbGRXcmFwR3JvdXBEaW1lbnNpb25zLm1heENoaWxkU2l6ZVBlcldyYXBHcm91cC5sZW5ndGg7ICsrd3JhcEdyb3VwSW5kZXgpIHtcclxuXHRcdFx0Y29uc3Qgb2xkV3JhcEdyb3VwRGltZW5zaW9uOiBXcmFwR3JvdXBEaW1lbnNpb24gPSBvbGRXcmFwR3JvdXBEaW1lbnNpb25zLm1heENoaWxkU2l6ZVBlcldyYXBHcm91cFt3cmFwR3JvdXBJbmRleF07XHJcblx0XHRcdGlmICghb2xkV3JhcEdyb3VwRGltZW5zaW9uIHx8ICFvbGRXcmFwR3JvdXBEaW1lbnNpb24uaXRlbXMgfHwgIW9sZFdyYXBHcm91cERpbWVuc2lvbi5pdGVtcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG9sZFdyYXBHcm91cERpbWVuc2lvbi5pdGVtcy5sZW5ndGggIT09IGl0ZW1zUGVyV3JhcEdyb3VwKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgaXRlbXNDaGFuZ2VkID0gZmFsc2U7XHJcblx0XHRcdGNvbnN0IGFycmF5U3RhcnRJbmRleCA9IGl0ZW1zUGVyV3JhcEdyb3VwICogd3JhcEdyb3VwSW5kZXg7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNQZXJXcmFwR3JvdXA7ICsraSkge1xyXG5cdFx0XHRcdGlmICghdGhpcy5jb21wYXJlSXRlbXMob2xkV3JhcEdyb3VwRGltZW5zaW9uLml0ZW1zW2ldLCB0aGlzLml0ZW1zW2FycmF5U3RhcnRJbmRleCArIGldKSkge1xyXG5cdFx0XHRcdFx0aXRlbXNDaGFuZ2VkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCFpdGVtc0NoYW5nZWQpIHtcclxuXHRcdFx0XHQrK3RoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5udW1iZXJPZktub3duV3JhcEdyb3VwQ2hpbGRTaXplcztcclxuXHRcdFx0XHR0aGlzLndyYXBHcm91cERpbWVuc2lvbnMuc3VtT2ZLbm93bldyYXBHcm91cENoaWxkV2lkdGhzICs9IG9sZFdyYXBHcm91cERpbWVuc2lvbi5jaGlsZFdpZHRoIHx8IDA7XHJcblx0XHRcdFx0dGhpcy53cmFwR3JvdXBEaW1lbnNpb25zLnN1bU9mS25vd25XcmFwR3JvdXBDaGlsZEhlaWdodHMgKz0gb2xkV3JhcEdyb3VwRGltZW5zaW9uLmNoaWxkSGVpZ2h0IHx8IDA7XHJcblx0XHRcdFx0dGhpcy53cmFwR3JvdXBEaW1lbnNpb25zLm1heENoaWxkU2l6ZVBlcldyYXBHcm91cFt3cmFwR3JvdXBJbmRleF0gPSBvbGRXcmFwR3JvdXBEaW1lbnNpb247XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBjYWxjdWxhdGVEaW1lbnNpb25zKCk6IElEaW1lbnNpb25zIHtcclxuXHRcdGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB0aGlzLmdldFNjcm9sbEVsZW1lbnQoKTtcclxuXHJcblx0XHRjb25zdCBtYXhDYWxjdWxhdGVkU2Nyb2xsQmFyU2l6ZSA9IDI1OyAvLyBOb3RlOiBGb3JtdWxhIHRvIGF1dG8tY2FsY3VsYXRlIGRvZXNuJ3Qgd29yayBmb3IgUGFyZW50U2Nyb2xsLCBzbyB3ZSBkZWZhdWx0IHRvIHRoaXMgaWYgbm90IHNldCBieSBjb25zdW1pbmcgYXBwbGljYXRpb25cclxuXHRcdHRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhckhlaWdodCA9IE1hdGgubWF4KE1hdGgubWluKHNjcm9sbEVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gc2Nyb2xsRWxlbWVudC5jbGllbnRIZWlnaHQsIG1heENhbGN1bGF0ZWRTY3JvbGxCYXJTaXplKSwgdGhpcy5jYWxjdWxhdGVkU2Nyb2xsYmFySGVpZ2h0KTtcclxuXHRcdHRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoID0gTWF0aC5tYXgoTWF0aC5taW4oc2Nyb2xsRWxlbWVudC5vZmZzZXRXaWR0aCAtIHNjcm9sbEVsZW1lbnQuY2xpZW50V2lkdGgsIG1heENhbGN1bGF0ZWRTY3JvbGxCYXJTaXplKSwgdGhpcy5jYWxjdWxhdGVkU2Nyb2xsYmFyV2lkdGgpO1xyXG5cclxuXHRcdGxldCB2aWV3cG9ydFdpZHRoID0gc2Nyb2xsRWxlbWVudC5vZmZzZXRXaWR0aCAtICh0aGlzLnNjcm9sbGJhcldpZHRoIHx8IHRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoIHx8ICh0aGlzLmhvcml6b250YWwgPyAwIDogbWF4Q2FsY3VsYXRlZFNjcm9sbEJhclNpemUpKTtcclxuXHRcdGxldCB2aWV3cG9ydEhlaWdodCA9IHNjcm9sbEVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gKHRoaXMuc2Nyb2xsYmFySGVpZ2h0IHx8IHRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhckhlaWdodCB8fCAodGhpcy5ob3Jpem9udGFsID8gbWF4Q2FsY3VsYXRlZFNjcm9sbEJhclNpemUgOiAwKSk7XHJcblxyXG5cdFx0Y29uc3QgY29udGVudCA9ICh0aGlzLmNvbnRhaW5lckVsZW1lbnRSZWYgJiYgdGhpcy5jb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHx8IHRoaXMuY29udGVudEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuXHJcblx0XHRjb25zdCBpdGVtc1BlcldyYXBHcm91cCA9IHRoaXMuY291bnRJdGVtc1BlcldyYXBHcm91cCgpO1xyXG5cdFx0bGV0IHdyYXBHcm91cHNQZXJQYWdlO1xyXG5cclxuXHRcdGxldCBkZWZhdWx0Q2hpbGRXaWR0aDtcclxuXHRcdGxldCBkZWZhdWx0Q2hpbGRIZWlnaHQ7XHJcblxyXG5cdFx0aWYgKHRoaXMuaXNBbmd1bGFyVW5pdmVyc2FsU1NSKSB7XHJcblx0XHRcdHZpZXdwb3J0V2lkdGggPSB0aGlzLnNzclZpZXdwb3J0V2lkdGg7XHJcblx0XHRcdHZpZXdwb3J0SGVpZ2h0ID0gdGhpcy5zc3JWaWV3cG9ydEhlaWdodDtcclxuXHRcdFx0ZGVmYXVsdENoaWxkV2lkdGggPSB0aGlzLnNzckNoaWxkV2lkdGg7XHJcblx0XHRcdGRlZmF1bHRDaGlsZEhlaWdodCA9IHRoaXMuc3NyQ2hpbGRIZWlnaHQ7XHJcblx0XHRcdGNvbnN0IGl0ZW1zUGVyUm93ID0gTWF0aC5tYXgoTWF0aC5jZWlsKHZpZXdwb3J0V2lkdGggLyBkZWZhdWx0Q2hpbGRXaWR0aCksIDEpO1xyXG5cdFx0XHRjb25zdCBpdGVtc1BlckNvbCA9IE1hdGgubWF4KE1hdGguY2VpbCh2aWV3cG9ydEhlaWdodCAvIGRlZmF1bHRDaGlsZEhlaWdodCksIDEpO1xyXG5cdFx0XHR3cmFwR3JvdXBzUGVyUGFnZSA9IHRoaXMuaG9yaXpvbnRhbCA/IGl0ZW1zUGVyUm93IDogaXRlbXNQZXJDb2w7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmICghdGhpcy5lbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcykge1xyXG5cdFx0XHRpZiAoY29udGVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLmNoaWxkV2lkdGggfHwgIXRoaXMuY2hpbGRIZWlnaHQpIHtcclxuXHRcdFx0XHRcdGlmICghdGhpcy5taW5NZWFzdXJlZENoaWxkV2lkdGggJiYgdmlld3BvcnRXaWR0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5taW5NZWFzdXJlZENoaWxkV2lkdGggPSB2aWV3cG9ydFdpZHRoO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCF0aGlzLm1pbk1lYXN1cmVkQ2hpbGRIZWlnaHQgJiYgdmlld3BvcnRIZWlnaHQgPiAwKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMubWluTWVhc3VyZWRDaGlsZEhlaWdodCA9IHZpZXdwb3J0SGVpZ2h0O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgY2hpbGQgPSBjb250ZW50LmNoaWxkcmVuWzBdO1xyXG5cdFx0XHRcdGNvbnN0IGNsaWVudFJlY3QgPSB0aGlzLmdldEVsZW1lbnRTaXplKGNoaWxkKTtcclxuXHRcdFx0XHR0aGlzLm1pbk1lYXN1cmVkQ2hpbGRXaWR0aCA9IE1hdGgubWluKHRoaXMubWluTWVhc3VyZWRDaGlsZFdpZHRoLCBjbGllbnRSZWN0LndpZHRoKTtcclxuXHRcdFx0XHR0aGlzLm1pbk1lYXN1cmVkQ2hpbGRIZWlnaHQgPSBNYXRoLm1pbih0aGlzLm1pbk1lYXN1cmVkQ2hpbGRIZWlnaHQsIGNsaWVudFJlY3QuaGVpZ2h0KTtcclxuXHJcblx0XHRcdFx0Ly8gQWRkZWQgZm9yIGdldHRpbmcgdGhlIGNoaWxkIGhlaWdodCAoZm9yIGNhcmQgdmlldywgcmV0dXJuIGFsbCB0aGUgY2xpZW50UmVjdCBvYmplY3QpLlxyXG5cdFx0XHRcdGlmICh0aGlzLl9sYXN0Q2hpbGRSZWN0Py5oZWlnaHQgIT09IGNsaWVudFJlY3Q/LmhlaWdodCB8fFxyXG5cdFx0XHRcdFx0dGhpcy5fbGFzdENoaWxkUmVjdD8ud2lkdGggIT09IGNsaWVudFJlY3Q/LndpZHRoKSB7XHJcblx0XHRcdFx0XHR0aGlzLl9sYXN0Q2hpbGRSZWN0ID0gY2xpZW50UmVjdDtcclxuXHRcdFx0XHRcdHRoaXMudnNDaGlsZFJlY3RDaGFuZ2UuZW1pdChjbGllbnRSZWN0KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGRlZmF1bHRDaGlsZFdpZHRoID0gdGhpcy5jaGlsZFdpZHRoIHx8IHRoaXMubWluTWVhc3VyZWRDaGlsZFdpZHRoIHx8IHZpZXdwb3J0V2lkdGg7XHJcblx0XHRcdGRlZmF1bHRDaGlsZEhlaWdodCA9IHRoaXMuY2hpbGRIZWlnaHQgfHwgdGhpcy5taW5NZWFzdXJlZENoaWxkSGVpZ2h0IHx8IHZpZXdwb3J0SGVpZ2h0O1xyXG5cdFx0XHRjb25zdCBpdGVtc1BlclJvdyA9IE1hdGgubWF4KE1hdGguY2VpbCh2aWV3cG9ydFdpZHRoIC8gZGVmYXVsdENoaWxkV2lkdGgpLCAxKTtcclxuXHRcdFx0Y29uc3QgaXRlbXNQZXJDb2wgPSBNYXRoLm1heChNYXRoLmNlaWwodmlld3BvcnRIZWlnaHQgLyBkZWZhdWx0Q2hpbGRIZWlnaHQpLCAxKTtcclxuXHRcdFx0d3JhcEdyb3Vwc1BlclBhZ2UgPSB0aGlzLmhvcml6b250YWwgPyBpdGVtc1BlclJvdyA6IGl0ZW1zUGVyQ29sO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bGV0IHNjcm9sbE9mZnNldCA9IHNjcm9sbEVsZW1lbnRbdGhpcy5fc2Nyb2xsVHlwZV0gLSAodGhpcy5wcmV2aW91c1ZpZXdQb3J0ID8gdGhpcy5wcmV2aW91c1ZpZXdQb3J0LnBhZGRpbmcgOiAwKTtcclxuXHJcblx0XHRcdGxldCBhcnJheVN0YXJ0SW5kZXggPSB0aGlzLnByZXZpb3VzVmlld1BvcnQuc3RhcnRJbmRleFdpdGhCdWZmZXIgfHwgMDtcclxuXHRcdFx0bGV0IHdyYXBHcm91cEluZGV4ID0gTWF0aC5jZWlsKGFycmF5U3RhcnRJbmRleCAvIGl0ZW1zUGVyV3JhcEdyb3VwKTtcclxuXHJcblx0XHRcdGxldCBtYXhXaWR0aEZvcldyYXBHcm91cCA9IDA7XHJcblx0XHRcdGxldCBtYXhIZWlnaHRGb3JXcmFwR3JvdXAgPSAwO1xyXG5cdFx0XHRsZXQgc3VtT2ZWaXNpYmxlTWF4V2lkdGhzID0gMDtcclxuXHRcdFx0bGV0IHN1bU9mVmlzaWJsZU1heEhlaWdodHMgPSAwO1xyXG5cdFx0XHR3cmFwR3JvdXBzUGVyUGFnZSA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcclxuXHRcdFx0XHQrK2FycmF5U3RhcnRJbmRleDtcclxuXHRcdFx0XHRjb25zdCBjaGlsZCA9IGNvbnRlbnQuY2hpbGRyZW5baV07XHJcblx0XHRcdFx0Y29uc3QgY2xpZW50UmVjdCA9IHRoaXMuZ2V0RWxlbWVudFNpemUoY2hpbGQpO1xyXG5cclxuXHRcdFx0XHRtYXhXaWR0aEZvcldyYXBHcm91cCA9IE1hdGgubWF4KG1heFdpZHRoRm9yV3JhcEdyb3VwLCBjbGllbnRSZWN0LndpZHRoKTtcclxuXHRcdFx0XHRtYXhIZWlnaHRGb3JXcmFwR3JvdXAgPSBNYXRoLm1heChtYXhIZWlnaHRGb3JXcmFwR3JvdXAsIGNsaWVudFJlY3QuaGVpZ2h0KTtcclxuXHJcblx0XHRcdFx0aWYgKGFycmF5U3RhcnRJbmRleCAlIGl0ZW1zUGVyV3JhcEdyb3VwID09PSAwKSB7XHJcblx0XHRcdFx0XHRjb25zdCBvbGRWYWx1ZSA9IHRoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5tYXhDaGlsZFNpemVQZXJXcmFwR3JvdXBbd3JhcEdyb3VwSW5kZXhdO1xyXG5cdFx0XHRcdFx0aWYgKG9sZFZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdC0tdGhpcy53cmFwR3JvdXBEaW1lbnNpb25zLm51bWJlck9mS25vd25XcmFwR3JvdXBDaGlsZFNpemVzO1xyXG5cdFx0XHRcdFx0XHR0aGlzLndyYXBHcm91cERpbWVuc2lvbnMuc3VtT2ZLbm93bldyYXBHcm91cENoaWxkV2lkdGhzIC09IG9sZFZhbHVlLmNoaWxkV2lkdGggfHwgMDtcclxuXHRcdFx0XHRcdFx0dGhpcy53cmFwR3JvdXBEaW1lbnNpb25zLnN1bU9mS25vd25XcmFwR3JvdXBDaGlsZEhlaWdodHMgLT0gb2xkVmFsdWUuY2hpbGRIZWlnaHQgfHwgMDtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQrK3RoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5udW1iZXJPZktub3duV3JhcEdyb3VwQ2hpbGRTaXplcztcclxuXHRcdFx0XHRcdGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcy5zbGljZShhcnJheVN0YXJ0SW5kZXggLSBpdGVtc1BlcldyYXBHcm91cCwgYXJyYXlTdGFydEluZGV4KTtcclxuXHRcdFx0XHRcdHRoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5tYXhDaGlsZFNpemVQZXJXcmFwR3JvdXBbd3JhcEdyb3VwSW5kZXhdID0ge1xyXG5cdFx0XHRcdFx0XHRjaGlsZFdpZHRoOiBtYXhXaWR0aEZvcldyYXBHcm91cCxcclxuXHRcdFx0XHRcdFx0Y2hpbGRIZWlnaHQ6IG1heEhlaWdodEZvcldyYXBHcm91cCxcclxuXHRcdFx0XHRcdFx0aXRlbXM6IGl0ZW1zXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0dGhpcy53cmFwR3JvdXBEaW1lbnNpb25zLnN1bU9mS25vd25XcmFwR3JvdXBDaGlsZFdpZHRocyArPSBtYXhXaWR0aEZvcldyYXBHcm91cDtcclxuXHRcdFx0XHRcdHRoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5zdW1PZktub3duV3JhcEdyb3VwQ2hpbGRIZWlnaHRzICs9IG1heEhlaWdodEZvcldyYXBHcm91cDtcclxuXHJcblx0XHRcdFx0XHRpZiAodGhpcy5ob3Jpem9udGFsKSB7XHJcblx0XHRcdFx0XHRcdGxldCBtYXhWaXNpYmxlV2lkdGhGb3JXcmFwR3JvdXAgPSBNYXRoLm1pbihtYXhXaWR0aEZvcldyYXBHcm91cCwgTWF0aC5tYXgodmlld3BvcnRXaWR0aCAtIHN1bU9mVmlzaWJsZU1heFdpZHRocywgMCkpO1xyXG5cdFx0XHRcdFx0XHRpZiAoc2Nyb2xsT2Zmc2V0ID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNjcm9sbE9mZnNldFRvUmVtb3ZlID0gTWF0aC5taW4oc2Nyb2xsT2Zmc2V0LCBtYXhWaXNpYmxlV2lkdGhGb3JXcmFwR3JvdXApO1xyXG5cdFx0XHRcdFx0XHRcdG1heFZpc2libGVXaWR0aEZvcldyYXBHcm91cCAtPSBzY3JvbGxPZmZzZXRUb1JlbW92ZTtcclxuXHRcdFx0XHRcdFx0XHRzY3JvbGxPZmZzZXQgLT0gc2Nyb2xsT2Zmc2V0VG9SZW1vdmU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHN1bU9mVmlzaWJsZU1heFdpZHRocyArPSBtYXhWaXNpYmxlV2lkdGhGb3JXcmFwR3JvdXA7XHJcblx0XHRcdFx0XHRcdGlmIChtYXhWaXNpYmxlV2lkdGhGb3JXcmFwR3JvdXAgPiAwICYmIHZpZXdwb3J0V2lkdGggPj0gc3VtT2ZWaXNpYmxlTWF4V2lkdGhzKSB7XHJcblx0XHRcdFx0XHRcdFx0Kyt3cmFwR3JvdXBzUGVyUGFnZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0bGV0IG1heFZpc2libGVIZWlnaHRGb3JXcmFwR3JvdXAgPSBNYXRoLm1pbihtYXhIZWlnaHRGb3JXcmFwR3JvdXAsIE1hdGgubWF4KHZpZXdwb3J0SGVpZ2h0IC0gc3VtT2ZWaXNpYmxlTWF4SGVpZ2h0cywgMCkpO1xyXG5cdFx0XHRcdFx0XHRpZiAoc2Nyb2xsT2Zmc2V0ID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNjcm9sbE9mZnNldFRvUmVtb3ZlID0gTWF0aC5taW4oc2Nyb2xsT2Zmc2V0LCBtYXhWaXNpYmxlSGVpZ2h0Rm9yV3JhcEdyb3VwKTtcclxuXHRcdFx0XHRcdFx0XHRtYXhWaXNpYmxlSGVpZ2h0Rm9yV3JhcEdyb3VwIC09IHNjcm9sbE9mZnNldFRvUmVtb3ZlO1xyXG5cdFx0XHRcdFx0XHRcdHNjcm9sbE9mZnNldCAtPSBzY3JvbGxPZmZzZXRUb1JlbW92ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0c3VtT2ZWaXNpYmxlTWF4SGVpZ2h0cyArPSBtYXhWaXNpYmxlSGVpZ2h0Rm9yV3JhcEdyb3VwO1xyXG5cdFx0XHRcdFx0XHRpZiAobWF4VmlzaWJsZUhlaWdodEZvcldyYXBHcm91cCA+IDAgJiYgdmlld3BvcnRIZWlnaHQgPj0gc3VtT2ZWaXNpYmxlTWF4SGVpZ2h0cykge1xyXG5cdFx0XHRcdFx0XHRcdCsrd3JhcEdyb3Vwc1BlclBhZ2U7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQrK3dyYXBHcm91cEluZGV4O1xyXG5cclxuXHRcdFx0XHRcdG1heFdpZHRoRm9yV3JhcEdyb3VwID0gMDtcclxuXHRcdFx0XHRcdG1heEhlaWdodEZvcldyYXBHcm91cCA9IDA7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBhdmVyYWdlQ2hpbGRXaWR0aCA9IHRoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5zdW1PZktub3duV3JhcEdyb3VwQ2hpbGRXaWR0aHMgLyB0aGlzLndyYXBHcm91cERpbWVuc2lvbnMubnVtYmVyT2ZLbm93bldyYXBHcm91cENoaWxkU2l6ZXM7XHJcblx0XHRcdGNvbnN0IGF2ZXJhZ2VDaGlsZEhlaWdodCA9IHRoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5zdW1PZktub3duV3JhcEdyb3VwQ2hpbGRIZWlnaHRzIC8gdGhpcy53cmFwR3JvdXBEaW1lbnNpb25zLm51bWJlck9mS25vd25XcmFwR3JvdXBDaGlsZFNpemVzO1xyXG5cdFx0XHRkZWZhdWx0Q2hpbGRXaWR0aCA9IHRoaXMuY2hpbGRXaWR0aCB8fCBhdmVyYWdlQ2hpbGRXaWR0aCB8fCB2aWV3cG9ydFdpZHRoO1xyXG5cdFx0XHRkZWZhdWx0Q2hpbGRIZWlnaHQgPSB0aGlzLmNoaWxkSGVpZ2h0IHx8IGF2ZXJhZ2VDaGlsZEhlaWdodCB8fCB2aWV3cG9ydEhlaWdodDtcclxuXHJcblx0XHRcdGlmICh0aGlzLmhvcml6b250YWwpIHtcclxuXHRcdFx0XHRpZiAodmlld3BvcnRXaWR0aCA+IHN1bU9mVmlzaWJsZU1heFdpZHRocykge1xyXG5cdFx0XHRcdFx0d3JhcEdyb3Vwc1BlclBhZ2UgKz0gTWF0aC5jZWlsKCh2aWV3cG9ydFdpZHRoIC0gc3VtT2ZWaXNpYmxlTWF4V2lkdGhzKSAvIGRlZmF1bHRDaGlsZFdpZHRoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aWYgKHZpZXdwb3J0SGVpZ2h0ID4gc3VtT2ZWaXNpYmxlTWF4SGVpZ2h0cykge1xyXG5cdFx0XHRcdFx0d3JhcEdyb3Vwc1BlclBhZ2UgKz0gTWF0aC5jZWlsKCh2aWV3cG9ydEhlaWdodCAtIHN1bU9mVmlzaWJsZU1heEhlaWdodHMpIC8gZGVmYXVsdENoaWxkSGVpZ2h0KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBpdGVtQ291bnQgPSB0aGlzLml0ZW1zLmxlbmd0aDtcclxuXHRcdGNvbnN0IGl0ZW1zUGVyUGFnZSA9IGl0ZW1zUGVyV3JhcEdyb3VwICogd3JhcEdyb3Vwc1BlclBhZ2U7XHJcblx0XHRjb25zdCBwYWdlQ291bnRfZnJhY3Rpb25hbCA9IGl0ZW1Db3VudCAvIGl0ZW1zUGVyUGFnZTtcclxuXHRcdGNvbnN0IG51bWJlck9mV3JhcEdyb3VwcyA9IE1hdGguY2VpbChpdGVtQ291bnQgLyBpdGVtc1BlcldyYXBHcm91cCk7XHJcblxyXG5cdFx0bGV0IHNjcm9sbExlbmd0aCA9IDA7XHJcblxyXG5cdFx0Y29uc3QgZGVmYXVsdFNjcm9sbExlbmd0aFBlcldyYXBHcm91cCA9IHRoaXMuaG9yaXpvbnRhbCA/IGRlZmF1bHRDaGlsZFdpZHRoIDogZGVmYXVsdENoaWxkSGVpZ2h0O1xyXG5cdFx0aWYgKHRoaXMuZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMpIHtcclxuXHRcdFx0bGV0IG51bVVua25vd25DaGlsZFNpemVzID0gMDtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZldyYXBHcm91cHM7ICsraSkge1xyXG5cdFx0XHRcdGNvbnN0IGNoaWxkU2l6ZSA9IHRoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5tYXhDaGlsZFNpemVQZXJXcmFwR3JvdXBbaV0gJiYgdGhpcy53cmFwR3JvdXBEaW1lbnNpb25zLm1heENoaWxkU2l6ZVBlcldyYXBHcm91cFtpXVt0aGlzLl9jaGlsZFNjcm9sbERpbV07XHJcblx0XHRcdFx0aWYgKGNoaWxkU2l6ZSkge1xyXG5cdFx0XHRcdFx0c2Nyb2xsTGVuZ3RoICs9IGNoaWxkU2l6ZTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0KytudW1Vbmtub3duQ2hpbGRTaXplcztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNjcm9sbExlbmd0aCArPSBNYXRoLnJvdW5kKG51bVVua25vd25DaGlsZFNpemVzICogZGVmYXVsdFNjcm9sbExlbmd0aFBlcldyYXBHcm91cCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzY3JvbGxMZW5ndGggPSBudW1iZXJPZldyYXBHcm91cHMgKiBkZWZhdWx0U2Nyb2xsTGVuZ3RoUGVyV3JhcEdyb3VwO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmhlYWRlckVsZW1lbnRSZWYpIHtcclxuXHRcdFx0c2Nyb2xsTGVuZ3RoICs9IHRoaXMuaGVhZGVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB2aWV3cG9ydExlbmd0aCA9IHRoaXMuaG9yaXpvbnRhbCA/IHZpZXdwb3J0V2lkdGggOiB2aWV3cG9ydEhlaWdodDtcclxuXHRcdGNvbnN0IG1heFNjcm9sbFBvc2l0aW9uID0gTWF0aC5tYXgoc2Nyb2xsTGVuZ3RoIC0gdmlld3BvcnRMZW5ndGgsIDApO1xyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGNoaWxkSGVpZ2h0OiBkZWZhdWx0Q2hpbGRIZWlnaHQsXHJcblx0XHRcdGNoaWxkV2lkdGg6IGRlZmF1bHRDaGlsZFdpZHRoLFxyXG5cdFx0XHRpdGVtQ291bnQ6IGl0ZW1Db3VudCxcclxuXHRcdFx0aXRlbXNQZXJQYWdlOiBpdGVtc1BlclBhZ2UsXHJcblx0XHRcdGl0ZW1zUGVyV3JhcEdyb3VwOiBpdGVtc1BlcldyYXBHcm91cCxcclxuXHRcdFx0bWF4U2Nyb2xsUG9zaXRpb246IG1heFNjcm9sbFBvc2l0aW9uLFxyXG5cdFx0XHRwYWdlQ291bnRfZnJhY3Rpb25hbDogcGFnZUNvdW50X2ZyYWN0aW9uYWwsXHJcblx0XHRcdHNjcm9sbExlbmd0aDogc2Nyb2xsTGVuZ3RoLFxyXG5cdFx0XHR2aWV3cG9ydExlbmd0aDogdmlld3BvcnRMZW5ndGgsXHJcblx0XHRcdHdyYXBHcm91cHNQZXJQYWdlOiB3cmFwR3JvdXBzUGVyUGFnZSxcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgY2FjaGVkUGFnZVNpemUgPSAwO1xyXG5cdHByb3RlY3RlZCBwcmV2aW91c1Njcm9sbE51bWJlckVsZW1lbnRzID0gMDtcclxuXHJcblx0cHJvdGVjdGVkIGNhbGN1bGF0ZVBhZGRpbmcoYXJyYXlTdGFydEluZGV4V2l0aEJ1ZmZlcjogbnVtYmVyLCBkaW1lbnNpb25zOiBJRGltZW5zaW9ucyk6IG51bWJlciB7XHJcblx0XHRpZiAoZGltZW5zaW9ucy5pdGVtQ291bnQgPT09IDApIHtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGVmYXVsdFNjcm9sbExlbmd0aFBlcldyYXBHcm91cCA9IGRpbWVuc2lvbnNbdGhpcy5fY2hpbGRTY3JvbGxEaW1dO1xyXG5cdFx0Y29uc3Qgc3RhcnRpbmdXcmFwR3JvdXBJbmRleCA9IE1hdGguZmxvb3IoYXJyYXlTdGFydEluZGV4V2l0aEJ1ZmZlciAvIGRpbWVuc2lvbnMuaXRlbXNQZXJXcmFwR3JvdXApIHx8IDA7XHJcblxyXG5cdFx0aWYgKCF0aGlzLmVuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzKSB7XHJcblx0XHRcdHJldHVybiBkZWZhdWx0U2Nyb2xsTGVuZ3RoUGVyV3JhcEdyb3VwICogc3RhcnRpbmdXcmFwR3JvdXBJbmRleDtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgbnVtVW5rbm93bkNoaWxkU2l6ZXMgPSAwO1xyXG5cdFx0bGV0IHJlc3VsdCA9IDA7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHN0YXJ0aW5nV3JhcEdyb3VwSW5kZXg7ICsraSkge1xyXG5cdFx0XHRjb25zdCBjaGlsZFNpemUgPSB0aGlzLndyYXBHcm91cERpbWVuc2lvbnMubWF4Q2hpbGRTaXplUGVyV3JhcEdyb3VwW2ldICYmIHRoaXMud3JhcEdyb3VwRGltZW5zaW9ucy5tYXhDaGlsZFNpemVQZXJXcmFwR3JvdXBbaV1bdGhpcy5fY2hpbGRTY3JvbGxEaW1dO1xyXG5cdFx0XHRpZiAoY2hpbGRTaXplKSB7XHJcblx0XHRcdFx0cmVzdWx0ICs9IGNoaWxkU2l6ZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQrK251bVVua25vd25DaGlsZFNpemVzO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXN1bHQgKz0gTWF0aC5yb3VuZChudW1Vbmtub3duQ2hpbGRTaXplcyAqIGRlZmF1bHRTY3JvbGxMZW5ndGhQZXJXcmFwR3JvdXApO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgY2FsY3VsYXRlUGFnZUluZm8oc2Nyb2xsUG9zaXRpb246IG51bWJlciwgZGltZW5zaW9uczogSURpbWVuc2lvbnMpOiBJUGFnZUluZm8ge1xyXG5cdFx0bGV0IHNjcm9sbFBlcmNlbnRhZ2UgPSAwO1xyXG5cdFx0aWYgKHRoaXMuZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMpIHtcclxuXHRcdFx0Y29uc3QgbnVtYmVyT2ZXcmFwR3JvdXBzID0gTWF0aC5jZWlsKGRpbWVuc2lvbnMuaXRlbUNvdW50IC8gZGltZW5zaW9ucy5pdGVtc1BlcldyYXBHcm91cCk7XHJcblx0XHRcdGxldCB0b3RhbFNjcm9sbGVkTGVuZ3RoID0gMDtcclxuXHRcdFx0Y29uc3QgZGVmYXVsdFNjcm9sbExlbmd0aFBlcldyYXBHcm91cCA9IGRpbWVuc2lvbnNbdGhpcy5fY2hpbGRTY3JvbGxEaW1dO1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mV3JhcEdyb3VwczsgKytpKSB7XHJcblx0XHRcdFx0Y29uc3QgY2hpbGRTaXplID0gdGhpcy53cmFwR3JvdXBEaW1lbnNpb25zLm1heENoaWxkU2l6ZVBlcldyYXBHcm91cFtpXSAmJiB0aGlzLndyYXBHcm91cERpbWVuc2lvbnMubWF4Q2hpbGRTaXplUGVyV3JhcEdyb3VwW2ldW3RoaXMuX2NoaWxkU2Nyb2xsRGltXTtcclxuXHRcdFx0XHRpZiAoY2hpbGRTaXplKSB7XHJcblx0XHRcdFx0XHR0b3RhbFNjcm9sbGVkTGVuZ3RoICs9IGNoaWxkU2l6ZTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dG90YWxTY3JvbGxlZExlbmd0aCArPSBkZWZhdWx0U2Nyb2xsTGVuZ3RoUGVyV3JhcEdyb3VwO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHNjcm9sbFBvc2l0aW9uIDwgdG90YWxTY3JvbGxlZExlbmd0aCkge1xyXG5cdFx0XHRcdFx0c2Nyb2xsUGVyY2VudGFnZSA9IGkgLyBudW1iZXJPZldyYXBHcm91cHM7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNjcm9sbFBlcmNlbnRhZ2UgPSBzY3JvbGxQb3NpdGlvbiAvIGRpbWVuc2lvbnMuc2Nyb2xsTGVuZ3RoO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHN0YXJ0aW5nQXJyYXlJbmRleF9mcmFjdGlvbmFsID0gTWF0aC5taW4oTWF0aC5tYXgoc2Nyb2xsUGVyY2VudGFnZSAqIGRpbWVuc2lvbnMucGFnZUNvdW50X2ZyYWN0aW9uYWwsIDApLCBkaW1lbnNpb25zLnBhZ2VDb3VudF9mcmFjdGlvbmFsKSAqIGRpbWVuc2lvbnMuaXRlbXNQZXJQYWdlO1xyXG5cclxuXHRcdGNvbnN0IG1heFN0YXJ0ID0gZGltZW5zaW9ucy5pdGVtQ291bnQgLSBkaW1lbnNpb25zLml0ZW1zUGVyUGFnZSAtIDE7XHJcblx0XHRsZXQgYXJyYXlTdGFydEluZGV4ID0gTWF0aC5taW4oTWF0aC5mbG9vcihzdGFydGluZ0FycmF5SW5kZXhfZnJhY3Rpb25hbCksIG1heFN0YXJ0KTtcclxuXHRcdGFycmF5U3RhcnRJbmRleCAtPSBhcnJheVN0YXJ0SW5kZXggJSBkaW1lbnNpb25zLml0ZW1zUGVyV3JhcEdyb3VwOyAvLyByb3VuZCBkb3duIHRvIHN0YXJ0IG9mIHdyYXBHcm91cFxyXG5cclxuXHRcdGlmICh0aGlzLnN0cmlwZWRUYWJsZSkge1xyXG5cdFx0XHRjb25zdCBidWZmZXJCb3VuZGFyeSA9IDIgKiBkaW1lbnNpb25zLml0ZW1zUGVyV3JhcEdyb3VwO1xyXG5cdFx0XHRpZiAoYXJyYXlTdGFydEluZGV4ICUgYnVmZmVyQm91bmRhcnkgIT09IDApIHtcclxuXHRcdFx0XHRhcnJheVN0YXJ0SW5kZXggPSBNYXRoLm1heChhcnJheVN0YXJ0SW5kZXggLSBhcnJheVN0YXJ0SW5kZXggJSBidWZmZXJCb3VuZGFyeSwgMCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYXJyYXlFbmRJbmRleCA9IE1hdGguY2VpbChzdGFydGluZ0FycmF5SW5kZXhfZnJhY3Rpb25hbCkgKyBkaW1lbnNpb25zLml0ZW1zUGVyUGFnZSAtIDE7XHJcblx0XHRjb25zdCBlbmRJbmRleFdpdGhpbldyYXBHcm91cCA9IChhcnJheUVuZEluZGV4ICsgMSkgJSBkaW1lbnNpb25zLml0ZW1zUGVyV3JhcEdyb3VwO1xyXG5cdFx0aWYgKGVuZEluZGV4V2l0aGluV3JhcEdyb3VwID4gMCkge1xyXG5cdFx0XHRhcnJheUVuZEluZGV4ICs9IGRpbWVuc2lvbnMuaXRlbXNQZXJXcmFwR3JvdXAgLSBlbmRJbmRleFdpdGhpbldyYXBHcm91cDsgLy8gcm91bmQgdXAgdG8gZW5kIG9mIHdyYXBHcm91cFxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChpc05hTihhcnJheVN0YXJ0SW5kZXgpKSB7XHJcblx0XHRcdGFycmF5U3RhcnRJbmRleCA9IDA7XHJcblx0XHR9XHJcblx0XHRpZiAoaXNOYU4oYXJyYXlFbmRJbmRleCkpIHtcclxuXHRcdFx0YXJyYXlFbmRJbmRleCA9IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0YXJyYXlTdGFydEluZGV4ID0gTWF0aC5taW4oTWF0aC5tYXgoYXJyYXlTdGFydEluZGV4LCAwKSwgZGltZW5zaW9ucy5pdGVtQ291bnQgLSAxKTtcclxuXHRcdGFycmF5RW5kSW5kZXggPSBNYXRoLm1pbihNYXRoLm1heChhcnJheUVuZEluZGV4LCAwKSwgZGltZW5zaW9ucy5pdGVtQ291bnQgLSAxKTtcclxuXHJcblx0XHRjb25zdCBidWZmZXJTaXplID0gdGhpcy5idWZmZXJBbW91bnQgKiBkaW1lbnNpb25zLml0ZW1zUGVyV3JhcEdyb3VwO1xyXG5cdFx0Y29uc3Qgc3RhcnRJbmRleFdpdGhCdWZmZXIgPSBNYXRoLm1pbihNYXRoLm1heChhcnJheVN0YXJ0SW5kZXggLSBidWZmZXJTaXplLCAwKSwgZGltZW5zaW9ucy5pdGVtQ291bnQgLSAxKTtcclxuXHRcdGNvbnN0IGVuZEluZGV4V2l0aEJ1ZmZlciA9IE1hdGgubWluKE1hdGgubWF4KGFycmF5RW5kSW5kZXggKyBidWZmZXJTaXplLCAwKSwgZGltZW5zaW9ucy5pdGVtQ291bnQgLSAxKTtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRzdGFydEluZGV4OiBhcnJheVN0YXJ0SW5kZXgsXHJcblx0XHRcdGVuZEluZGV4OiBhcnJheUVuZEluZGV4LFxyXG5cdFx0XHRzdGFydEluZGV4V2l0aEJ1ZmZlcjogc3RhcnRJbmRleFdpdGhCdWZmZXIsXHJcblx0XHRcdGVuZEluZGV4V2l0aEJ1ZmZlcjogZW5kSW5kZXhXaXRoQnVmZmVyLFxyXG5cdFx0XHRzY3JvbGxTdGFydFBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcclxuXHRcdFx0c2Nyb2xsRW5kUG9zaXRpb246IHNjcm9sbFBvc2l0aW9uICsgZGltZW5zaW9ucy52aWV3cG9ydExlbmd0aCxcclxuXHRcdFx0bWF4U2Nyb2xsUG9zaXRpb246IGRpbWVuc2lvbnMubWF4U2Nyb2xsUG9zaXRpb25cclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgY2FsY3VsYXRlVmlld3BvcnQoKTogSVZpZXdwb3J0IHtcclxuXHRcdGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmNhbGN1bGF0ZURpbWVuc2lvbnMoKTtcclxuXHRcdGNvbnN0IG9mZnNldCA9IHRoaXMuZ2V0RWxlbWVudHNPZmZzZXQoKTtcclxuXHJcblx0XHRsZXQgc2Nyb2xsU3RhcnRQb3NpdGlvbiA9IHRoaXMuZ2V0U2Nyb2xsU3RhcnRQb3NpdGlvbigpO1xyXG5cdFx0aWYgKHNjcm9sbFN0YXJ0UG9zaXRpb24gPiAoZGltZW5zaW9ucy5zY3JvbGxMZW5ndGggKyBvZmZzZXQpICYmICEodGhpcy5wYXJlbnRTY3JvbGwgaW5zdGFuY2VvZiBXaW5kb3cpKSB7XHJcblx0XHRcdHNjcm9sbFN0YXJ0UG9zaXRpb24gPSBkaW1lbnNpb25zLnNjcm9sbExlbmd0aDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNjcm9sbFN0YXJ0UG9zaXRpb24gLT0gb2Zmc2V0O1xyXG5cdFx0fVxyXG5cdFx0c2Nyb2xsU3RhcnRQb3NpdGlvbiA9IE1hdGgubWF4KDAsIHNjcm9sbFN0YXJ0UG9zaXRpb24pO1xyXG5cclxuXHRcdGNvbnN0IHBhZ2VJbmZvID0gdGhpcy5jYWxjdWxhdGVQYWdlSW5mbyhzY3JvbGxTdGFydFBvc2l0aW9uLCBkaW1lbnNpb25zKTtcclxuXHRcdGNvbnN0IG5ld1BhZGRpbmcgPSB0aGlzLmNhbGN1bGF0ZVBhZGRpbmcocGFnZUluZm8uc3RhcnRJbmRleFdpdGhCdWZmZXIsIGRpbWVuc2lvbnMpO1xyXG5cdFx0Y29uc3QgbmV3U2Nyb2xsTGVuZ3RoID0gZGltZW5zaW9ucy5zY3JvbGxMZW5ndGg7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0c3RhcnRJbmRleDogcGFnZUluZm8uc3RhcnRJbmRleCxcclxuXHRcdFx0ZW5kSW5kZXg6IHBhZ2VJbmZvLmVuZEluZGV4LFxyXG5cdFx0XHRzdGFydEluZGV4V2l0aEJ1ZmZlcjogcGFnZUluZm8uc3RhcnRJbmRleFdpdGhCdWZmZXIsXHJcblx0XHRcdGVuZEluZGV4V2l0aEJ1ZmZlcjogcGFnZUluZm8uZW5kSW5kZXhXaXRoQnVmZmVyLFxyXG5cdFx0XHRwYWRkaW5nOiBNYXRoLnJvdW5kKG5ld1BhZGRpbmcpLFxyXG5cdFx0XHRzY3JvbGxMZW5ndGg6IE1hdGgucm91bmQobmV3U2Nyb2xsTGVuZ3RoKSxcclxuXHRcdFx0c2Nyb2xsU3RhcnRQb3NpdGlvbjogcGFnZUluZm8uc2Nyb2xsU3RhcnRQb3NpdGlvbixcclxuXHRcdFx0c2Nyb2xsRW5kUG9zaXRpb246IHBhZ2VJbmZvLnNjcm9sbEVuZFBvc2l0aW9uLFxyXG5cdFx0XHRtYXhTY3JvbGxQb3NpdGlvbjogcGFnZUluZm8ubWF4U2Nyb2xsUG9zaXRpb25cclxuXHRcdH07XHJcblx0fVxyXG59XHJcblxyXG5ATmdNb2R1bGUoe1xyXG5cdGV4cG9ydHM6IFtWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnRdLFxyXG5cdGRlY2xhcmF0aW9uczogW1ZpcnR1YWxTY3JvbGxlckNvbXBvbmVudF0sXHJcblx0aW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcblx0cHJvdmlkZXJzOiBbXHJcblx0XHR7XHJcblx0XHRcdHByb3ZpZGU6ICd2aXJ0dWFsLXNjcm9sbGVyLWRlZmF1bHQtb3B0aW9ucycsXHJcblx0XHRcdHVzZUZhY3Rvcnk6IFZJUlRVQUxfU0NST0xMRVJfREVGQVVMVF9PUFRJT05TX0ZBQ1RPUllcclxuXHRcdH1cclxuXHRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUgeyB9Il19