tango-app-ui-shared 3.5.1-task.2 → 3.5.1-task.4

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 (396) hide show
  1. package/esm2022/lib/guards/auth.guard.mjs +26 -0
  2. package/esm2022/lib/guards/lead.guard.mjs +16 -0
  3. package/esm2022/lib/guards/stores.guard.mjs +16 -0
  4. package/esm2022/lib/guards/tickets.guard.mjs +16 -0
  5. package/esm2022/lib/i18n/index.mjs +3 -0
  6. package/esm2022/lib/i18n/translation.module.mjs +17 -0
  7. package/esm2022/lib/i18n/translation.service.mjs +53 -0
  8. package/esm2022/lib/i18n/vocabs/ch.mjs +106 -0
  9. package/esm2022/lib/i18n/vocabs/de.mjs +106 -0
  10. package/esm2022/lib/i18n/vocabs/en.mjs +106 -0
  11. package/esm2022/lib/i18n/vocabs/es.mjs +106 -0
  12. package/esm2022/lib/i18n/vocabs/fr.mjs +106 -0
  13. package/esm2022/lib/i18n/vocabs/jp.mjs +106 -0
  14. package/esm2022/lib/interceptors/http-auth-interceptor.mjs +201 -0
  15. package/esm2022/lib/interfaces/global-state.mjs +2 -0
  16. package/esm2022/lib/modules/common/common-shared.module.mjs +31 -0
  17. package/esm2022/lib/modules/common/custom-select/custom-select.component.mjs +155 -0
  18. package/esm2022/lib/modules/common/filters/filters.component.mjs +179 -0
  19. package/esm2022/lib/modules/common/pagination/pagination.component.mjs +49 -0
  20. package/esm2022/lib/modules/errors/error403/error403.component.mjs +33 -0
  21. package/esm2022/lib/modules/errors/error404/error404.component.mjs +44 -0
  22. package/esm2022/lib/modules/errors/error500/error500.component.mjs +45 -0
  23. package/esm2022/lib/modules/errors/errors-routing.module.mjs +48 -0
  24. package/esm2022/lib/modules/errors/errors.component.mjs +39 -0
  25. package/esm2022/lib/modules/errors/errors.module.mjs +37 -0
  26. package/esm2022/lib/modules/errors/invalid-ip/invalid-ip.component.mjs +44 -0
  27. package/esm2022/lib/modules/intro/contact-support/contact-support.component.mjs +19 -0
  28. package/esm2022/lib/modules/intro/intro-routing.module.mjs +24 -0
  29. package/esm2022/lib/modules/intro/intro.module.mjs +32 -0
  30. package/esm2022/lib/modules/intro/lead-intro/lead-intro.component.mjs +110 -0
  31. package/esm2022/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.mjs +31 -0
  32. package/esm2022/lib/modules/layout/content/content.component.mjs +107 -0
  33. package/esm2022/lib/modules/layout/footer/footer.component.mjs +17 -0
  34. package/esm2022/lib/modules/layout/header/header-menu/header-menu.component.mjs +41 -0
  35. package/esm2022/lib/modules/layout/header/header.component.mjs +100 -0
  36. package/esm2022/lib/modules/layout/header/navbar/navbar.component.mjs +256 -0
  37. package/esm2022/lib/modules/layout/header/notifications-inner/notifications-inner.component.mjs +79 -0
  38. package/esm2022/lib/modules/layout/header/page-title/page-title.component.mjs +56 -0
  39. package/esm2022/lib/modules/layout/keenicon/icons.json +1 -0
  40. package/esm2022/lib/modules/layout/keenicon/keenicon.component.mjs +37 -0
  41. package/esm2022/lib/modules/layout/layout/layout.component.mjs +314 -0
  42. package/esm2022/lib/modules/layout/layout.module.mjs +195 -0
  43. package/esm2022/lib/modules/layout/scripts-init/scripts-init.component.mjs +74 -0
  44. package/esm2022/lib/modules/layout/scroll-top/scroll-top.component.mjs +74 -0
  45. package/esm2022/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.mjs +118 -0
  46. package/esm2022/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.mjs +45 -0
  47. package/esm2022/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.mjs +111 -0
  48. package/esm2022/lib/modules/layout/sidebar/sidebar.component.mjs +134 -0
  49. package/esm2022/lib/modules/layout/toolbar/accounting/accounting.component.mjs +16 -0
  50. package/esm2022/lib/modules/layout/toolbar/classic/classic.component.mjs +331 -0
  51. package/esm2022/lib/modules/layout/toolbar/client-settings/client-settings.component.mjs +88 -0
  52. package/esm2022/lib/modules/layout/toolbar/date-single-select/date-single-select.component.mjs +201 -0
  53. package/esm2022/lib/modules/layout/toolbar/datepicker/datepicker.component.mjs +150 -0
  54. package/esm2022/lib/modules/layout/toolbar/extended/extended.component.mjs +15 -0
  55. package/esm2022/lib/modules/layout/toolbar/metrics-header/metrics-header.component.mjs +1321 -0
  56. package/esm2022/lib/modules/layout/toolbar/reports/reports.component.mjs +18 -0
  57. package/esm2022/lib/modules/layout/toolbar/saas/saas.component.mjs +18 -0
  58. package/esm2022/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.mjs +11 -0
  59. package/esm2022/lib/modules/layout/toolbar/single-store/single-store.component.mjs +176 -0
  60. package/esm2022/lib/modules/layout/toolbar/single-storedate/single-storedate.component.mjs +166 -0
  61. package/esm2022/lib/modules/layout/toolbar/storesingle/storesingle.component.mjs +105 -0
  62. package/esm2022/lib/modules/layout/toolbar/toolbar.component.mjs +314 -0
  63. package/esm2022/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.mjs +1060 -0
  64. package/esm2022/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.mjs +795 -0
  65. package/esm2022/lib/modules/layout/toolbar/trax-header/trax-header.component.mjs +880 -0
  66. package/esm2022/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.mjs +729 -0
  67. package/esm2022/lib/modules/notification/conformation/conformation.component.mjs +22 -0
  68. package/esm2022/lib/modules/notification/notification/notification.component.mjs +317 -0
  69. package/esm2022/lib/modules/notification/notification-routing.module.mjs +28 -0
  70. package/esm2022/lib/modules/notification/notification.module.mjs +32 -0
  71. package/esm2022/lib/pipes/customDate.pipe.mjs +22 -0
  72. package/esm2022/lib/routes/route-wraper-modules/edge-wrapper.module.mjs +18 -0
  73. package/esm2022/lib/routes/route-wraper-modules/manage-wrapper.module.mjs +18 -0
  74. package/esm2022/lib/routes/route-wraper-modules/profile-wrapper.module.mjs +18 -0
  75. package/esm2022/lib/routes/route-wraper-modules/store-wrapper.module.mjs +18 -0
  76. package/esm2022/lib/routes/route-wraper-modules/ticket-wrapper.module.mjs +18 -0
  77. package/esm2022/lib/routes/routing.mjs +53 -0
  78. package/esm2022/lib/services/auth.service.mjs +154 -0
  79. package/esm2022/lib/services/notification.service.mjs +74 -0
  80. package/esm2022/lib/services/toast.service.mjs +83 -0
  81. package/esm2022/public-api.mjs +56 -0
  82. package/esm2022/tango-app-ui-shared.mjs +5 -0
  83. package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs +21 -0
  84. package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs.map +1 -0
  85. package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs +188 -0
  86. package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs.map +1 -0
  87. package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs +21 -0
  88. package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs.map +1 -0
  89. package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs +400 -0
  90. package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs.map +1 -0
  91. package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs +21 -0
  92. package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs.map +1 -0
  93. package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs +21 -0
  94. package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs.map +1 -0
  95. package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs +21 -0
  96. package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs.map +1 -0
  97. package/fesm2022/tango-app-ui-shared.mjs +11121 -0
  98. package/fesm2022/tango-app-ui-shared.mjs.map +1 -0
  99. package/index.d.ts +5 -0
  100. package/lib/guards/auth.guard.d.ts +10 -0
  101. package/lib/guards/lead.guard.d.ts +2 -0
  102. package/lib/guards/stores.guard.d.ts +2 -0
  103. package/lib/guards/tickets.guard.d.ts +2 -0
  104. package/{src/lib/i18n/index.ts → lib/i18n/index.d.ts} +2 -2
  105. package/lib/i18n/translation.module.d.ts +8 -0
  106. package/lib/i18n/translation.service.d.ts +19 -0
  107. package/lib/i18n/vocabs/ch.d.ts +104 -0
  108. package/lib/i18n/vocabs/de.d.ts +104 -0
  109. package/lib/i18n/vocabs/en.d.ts +104 -0
  110. package/lib/i18n/vocabs/es.d.ts +104 -0
  111. package/lib/i18n/vocabs/fr.d.ts +104 -0
  112. package/lib/i18n/vocabs/jp.d.ts +104 -0
  113. package/lib/interceptors/http-auth-interceptor.d.ts +20 -0
  114. package/lib/interfaces/global-state.d.ts +5 -0
  115. package/lib/modules/common/common-shared.module.d.ts +13 -0
  116. package/lib/modules/common/custom-select/custom-select.component.d.ts +33 -0
  117. package/lib/modules/common/filters/filters.component.d.ts +38 -0
  118. package/lib/modules/common/pagination/pagination.component.d.ts +18 -0
  119. package/lib/modules/errors/error403/error403.component.d.ts +14 -0
  120. package/lib/modules/errors/error404/error404.component.d.ts +15 -0
  121. package/lib/modules/errors/error500/error500.component.d.ts +15 -0
  122. package/lib/modules/errors/errors-routing.module.d.ts +7 -0
  123. package/lib/modules/errors/errors.component.d.ts +13 -0
  124. package/lib/modules/errors/errors.module.d.ts +13 -0
  125. package/lib/modules/errors/invalid-ip/invalid-ip.component.d.ts +17 -0
  126. package/lib/modules/intro/contact-support/contact-support.component.d.ts +9 -0
  127. package/lib/modules/intro/intro-routing.module.d.ts +7 -0
  128. package/lib/modules/intro/intro.module.d.ts +11 -0
  129. package/lib/modules/intro/lead-intro/lead-intro.component.d.ts +31 -0
  130. package/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.d.ts +13 -0
  131. package/lib/modules/layout/content/content.component.d.ts +25 -0
  132. package/lib/modules/layout/footer/footer.component.d.ts +8 -0
  133. package/lib/modules/layout/header/header-menu/header-menu.component.d.ts +18 -0
  134. package/lib/modules/layout/header/header.component.d.ts +30 -0
  135. package/lib/modules/layout/header/navbar/navbar.component.d.ts +45 -0
  136. package/lib/modules/layout/header/notifications-inner/notifications-inner.component.d.ts +25 -0
  137. package/lib/modules/layout/header/page-title/page-title.component.d.ts +23 -0
  138. package/lib/modules/layout/keenicon/keenicon.component.d.ts +13 -0
  139. package/lib/modules/layout/layout/layout.component.d.ts +82 -0
  140. package/lib/modules/layout/layout.module.d.ts +49 -0
  141. package/lib/modules/layout/scripts-init/scripts-init.component.d.ts +19 -0
  142. package/lib/modules/layout/scroll-top/scroll-top.component.d.ts +19 -0
  143. package/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.d.ts +39 -0
  144. package/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.d.ts +19 -0
  145. package/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.d.ts +23 -0
  146. package/lib/modules/layout/sidebar/sidebar.component.d.ts +36 -0
  147. package/lib/modules/layout/toolbar/accounting/accounting.component.d.ts +8 -0
  148. package/lib/modules/layout/toolbar/classic/classic.component.d.ts +48 -0
  149. package/lib/modules/layout/toolbar/client-settings/client-settings.component.d.ts +16 -0
  150. package/lib/modules/layout/toolbar/date-single-select/date-single-select.component.d.ts +28 -0
  151. package/lib/modules/layout/toolbar/datepicker/datepicker.component.d.ts +28 -0
  152. package/lib/modules/layout/toolbar/extended/extended.component.d.ts +8 -0
  153. package/lib/modules/layout/toolbar/metrics-header/metrics-header.component.d.ts +103 -0
  154. package/lib/modules/layout/toolbar/reports/reports.component.d.ts +9 -0
  155. package/lib/modules/layout/toolbar/saas/saas.component.d.ts +9 -0
  156. package/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.d.ts +5 -0
  157. package/lib/modules/layout/toolbar/single-store/single-store.component.d.ts +33 -0
  158. package/lib/modules/layout/toolbar/single-storedate/single-storedate.component.d.ts +34 -0
  159. package/lib/modules/layout/toolbar/storesingle/storesingle.component.d.ts +24 -0
  160. package/lib/modules/layout/toolbar/toolbar.component.d.ts +55 -0
  161. package/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.d.ts +93 -0
  162. package/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.d.ts +80 -0
  163. package/lib/modules/layout/toolbar/trax-header/trax-header.component.d.ts +83 -0
  164. package/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.d.ts +74 -0
  165. package/lib/modules/notification/conformation/conformation.component.d.ts +10 -0
  166. package/lib/modules/notification/notification/notification.component.d.ts +63 -0
  167. package/lib/modules/notification/notification-routing.module.d.ts +7 -0
  168. package/lib/modules/notification/notification.module.d.ts +11 -0
  169. package/lib/pipes/customDate.pipe.d.ts +7 -0
  170. package/lib/routes/route-wraper-modules/edge-wrapper.module.d.ts +7 -0
  171. package/lib/routes/route-wraper-modules/manage-wrapper.module.d.ts +7 -0
  172. package/lib/routes/route-wraper-modules/profile-wrapper.module.d.ts +7 -0
  173. package/lib/routes/route-wraper-modules/store-wrapper.module.d.ts +7 -0
  174. package/lib/routes/route-wraper-modules/ticket-wrapper.module.d.ts +7 -0
  175. package/lib/routes/routing.d.ts +3 -0
  176. package/lib/services/auth.service.d.ts +52 -0
  177. package/lib/services/notification.service.d.ts +30 -0
  178. package/lib/services/toast.service.d.ts +10 -0
  179. package/package.json +25 -12
  180. package/{src/public-api.ts → public-api.d.ts} +44 -71
  181. package/.eslintrc.json +0 -37
  182. package/ng-package.json +0 -7
  183. package/src/lib/guards/auth.guard.ts +0 -20
  184. package/src/lib/guards/lead.guard.ts +0 -16
  185. package/src/lib/guards/stores.guard.ts +0 -16
  186. package/src/lib/guards/tickets.guard.ts +0 -16
  187. package/src/lib/i18n/translation.module.ts +0 -9
  188. package/src/lib/i18n/translation.service.ts +0 -61
  189. package/src/lib/i18n/vocabs/ch.ts +0 -105
  190. package/src/lib/i18n/vocabs/de.ts +0 -105
  191. package/src/lib/i18n/vocabs/en.ts +0 -105
  192. package/src/lib/i18n/vocabs/es.ts +0 -105
  193. package/src/lib/i18n/vocabs/fr.ts +0 -105
  194. package/src/lib/i18n/vocabs/jp.ts +0 -105
  195. package/src/lib/interceptors/http-auth-interceptor.ts +0 -225
  196. package/src/lib/interfaces/global-state.ts +0 -6
  197. package/src/lib/modules/common/common-shared.module.ts +0 -20
  198. package/src/lib/modules/common/custom-select/custom-select.component.html +0 -42
  199. package/src/lib/modules/common/custom-select/custom-select.component.scss +0 -131
  200. package/src/lib/modules/common/custom-select/custom-select.component.spec.ts +0 -23
  201. package/src/lib/modules/common/custom-select/custom-select.component.ts +0 -149
  202. package/src/lib/modules/common/filters/filters.component.html +0 -76
  203. package/src/lib/modules/common/filters/filters.component.scss +0 -131
  204. package/src/lib/modules/common/filters/filters.component.spec.ts +0 -23
  205. package/src/lib/modules/common/filters/filters.component.ts +0 -181
  206. package/src/lib/modules/common/pagination/pagination.component.html +0 -26
  207. package/src/lib/modules/common/pagination/pagination.component.scss +0 -63
  208. package/src/lib/modules/common/pagination/pagination.component.spec.ts +0 -23
  209. package/src/lib/modules/common/pagination/pagination.component.ts +0 -46
  210. package/src/lib/modules/errors/error403/error403.component.html +0 -25
  211. package/src/lib/modules/errors/error403/error403.component.scss +0 -0
  212. package/src/lib/modules/errors/error403/error403.component.spec.ts +0 -23
  213. package/src/lib/modules/errors/error403/error403.component.ts +0 -28
  214. package/src/lib/modules/errors/error404/error404.component.html +0 -24
  215. package/src/lib/modules/errors/error404/error404.component.scss +0 -0
  216. package/src/lib/modules/errors/error404/error404.component.spec.ts +0 -25
  217. package/src/lib/modules/errors/error404/error404.component.ts +0 -50
  218. package/src/lib/modules/errors/error500/error500.component.html +0 -24
  219. package/src/lib/modules/errors/error500/error500.component.scss +0 -0
  220. package/src/lib/modules/errors/error500/error500.component.spec.ts +0 -25
  221. package/src/lib/modules/errors/error500/error500.component.ts +0 -50
  222. package/src/lib/modules/errors/errors-routing.module.ts +0 -40
  223. package/src/lib/modules/errors/errors.component.html +0 -15
  224. package/src/lib/modules/errors/errors.component.scss +0 -4
  225. package/src/lib/modules/errors/errors.component.spec.ts +0 -25
  226. package/src/lib/modules/errors/errors.component.ts +0 -42
  227. package/src/lib/modules/errors/errors.module.ts +0 -25
  228. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.html +0 -16
  229. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.scss +0 -0
  230. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.spec.ts +0 -23
  231. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.ts +0 -43
  232. package/src/lib/modules/intro/contact-support/contact-support.component.html +0 -30
  233. package/src/lib/modules/intro/contact-support/contact-support.component.scss +0 -60
  234. package/src/lib/modules/intro/contact-support/contact-support.component.spec.ts +0 -23
  235. package/src/lib/modules/intro/contact-support/contact-support.component.ts +0 -17
  236. package/src/lib/modules/intro/intro-routing.module.ts +0 -16
  237. package/src/lib/modules/intro/intro.module.ts +0 -21
  238. package/src/lib/modules/intro/lead-intro/lead-intro.component.html +0 -325
  239. package/src/lib/modules/intro/lead-intro/lead-intro.component.scss +0 -185
  240. package/src/lib/modules/intro/lead-intro/lead-intro.component.spec.ts +0 -23
  241. package/src/lib/modules/intro/lead-intro/lead-intro.component.ts +0 -120
  242. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.html +0 -44
  243. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.scss +0 -28
  244. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.spec.ts +0 -23
  245. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.ts +0 -24
  246. package/src/lib/modules/layout/content/content.component.html +0 -12
  247. package/src/lib/modules/layout/content/content.component.scss +0 -0
  248. package/src/lib/modules/layout/content/content.component.ts +0 -102
  249. package/src/lib/modules/layout/footer/footer.component.html +0 -29
  250. package/src/lib/modules/layout/footer/footer.component.scss +0 -7
  251. package/src/lib/modules/layout/footer/footer.component.spec.ts +0 -25
  252. package/src/lib/modules/layout/footer/footer.component.ts +0 -13
  253. package/src/lib/modules/layout/header/header-menu/header-menu.component.html +0 -27
  254. package/src/lib/modules/layout/header/header-menu/header-menu.component.scss +0 -4
  255. package/src/lib/modules/layout/header/header-menu/header-menu.component.spec.ts +0 -25
  256. package/src/lib/modules/layout/header/header-menu/header-menu.component.ts +0 -38
  257. package/src/lib/modules/layout/header/header.component.html +0 -90
  258. package/src/lib/modules/layout/header/header.component.scss +0 -7
  259. package/src/lib/modules/layout/header/header.component.spec.ts +0 -25
  260. package/src/lib/modules/layout/header/header.component.ts +0 -139
  261. package/src/lib/modules/layout/header/navbar/navbar.component.html +0 -156
  262. package/src/lib/modules/layout/header/navbar/navbar.component.scss +0 -223
  263. package/src/lib/modules/layout/header/navbar/navbar.component.spec.ts +0 -23
  264. package/src/lib/modules/layout/header/navbar/navbar.component.ts +0 -255
  265. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.html +0 -200
  266. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.scss +0 -139
  267. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.ts +0 -76
  268. package/src/lib/modules/layout/header/page-title/page-title.component.html +0 -32
  269. package/src/lib/modules/layout/header/page-title/page-title.component.scss +0 -11
  270. package/src/lib/modules/layout/header/page-title/page-title.component.ts +0 -47
  271. package/src/lib/modules/layout/keenicon/icons.json +0 -1
  272. package/src/lib/modules/layout/keenicon/keenicon.component.html +0 -4
  273. package/src/lib/modules/layout/keenicon/keenicon.component.scss +0 -0
  274. package/src/lib/modules/layout/keenicon/keenicon.component.spec.ts +0 -23
  275. package/src/lib/modules/layout/keenicon/keenicon.component.ts +0 -30
  276. package/src/lib/modules/layout/layout/layout.component.html +0 -71
  277. package/src/lib/modules/layout/layout/layout.component.scss +0 -23
  278. package/src/lib/modules/layout/layout/layout.component.ts +0 -425
  279. package/src/lib/modules/layout/layout.module.ts +0 -127
  280. package/src/lib/modules/layout/scripts-init/scripts-init.component.html +0 -0
  281. package/src/lib/modules/layout/scripts-init/scripts-init.component.ts +0 -81
  282. package/src/lib/modules/layout/scroll-top/scroll-top.component.html +0 -1
  283. package/src/lib/modules/layout/scroll-top/scroll-top.component.ts +0 -75
  284. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.html +0 -70
  285. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.scss +0 -57
  286. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.spec.ts +0 -23
  287. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.ts +0 -101
  288. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.html +0 -26
  289. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.scss +0 -0
  290. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.spec.ts +0 -23
  291. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.ts +0 -36
  292. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.html +0 -705
  293. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.scss +0 -38
  294. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.spec.ts +0 -23
  295. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.ts +0 -118
  296. package/src/lib/modules/layout/sidebar/sidebar.component.html +0 -16
  297. package/src/lib/modules/layout/sidebar/sidebar.component.scss +0 -3
  298. package/src/lib/modules/layout/sidebar/sidebar.component.spec.ts +0 -23
  299. package/src/lib/modules/layout/sidebar/sidebar.component.ts +0 -203
  300. package/src/lib/modules/layout/toolbar/accounting/accounting.component.html +0 -84
  301. package/src/lib/modules/layout/toolbar/accounting/accounting.component.scss +0 -0
  302. package/src/lib/modules/layout/toolbar/accounting/accounting.component.spec.ts +0 -23
  303. package/src/lib/modules/layout/toolbar/accounting/accounting.component.ts +0 -14
  304. package/src/lib/modules/layout/toolbar/classic/classic.component.html +0 -69
  305. package/src/lib/modules/layout/toolbar/classic/classic.component.scss +0 -238
  306. package/src/lib/modules/layout/toolbar/classic/classic.component.spec.ts +0 -23
  307. package/src/lib/modules/layout/toolbar/classic/classic.component.ts +0 -389
  308. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.html +0 -4
  309. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.scss +0 -3
  310. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.spec.ts +0 -23
  311. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.ts +0 -91
  312. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.html +0 -22
  313. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.scss +0 -156
  314. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.spec.ts +0 -23
  315. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.ts +0 -229
  316. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.html +0 -14
  317. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.scss +0 -149
  318. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.spec.ts +0 -23
  319. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.ts +0 -174
  320. package/src/lib/modules/layout/toolbar/extended/extended.component.html +0 -100
  321. package/src/lib/modules/layout/toolbar/extended/extended.component.scss +0 -0
  322. package/src/lib/modules/layout/toolbar/extended/extended.component.spec.ts +0 -23
  323. package/src/lib/modules/layout/toolbar/extended/extended.component.ts +0 -12
  324. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.html +0 -311
  325. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.scss +0 -311
  326. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.spec.ts +0 -23
  327. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.ts +0 -1555
  328. package/src/lib/modules/layout/toolbar/reports/reports.component.html +0 -62
  329. package/src/lib/modules/layout/toolbar/reports/reports.component.scss +0 -0
  330. package/src/lib/modules/layout/toolbar/reports/reports.component.spec.ts +0 -23
  331. package/src/lib/modules/layout/toolbar/reports/reports.component.ts +0 -14
  332. package/src/lib/modules/layout/toolbar/saas/saas.component.html +0 -77
  333. package/src/lib/modules/layout/toolbar/saas/saas.component.scss +0 -0
  334. package/src/lib/modules/layout/toolbar/saas/saas.component.spec.ts +0 -23
  335. package/src/lib/modules/layout/toolbar/saas/saas.component.ts +0 -14
  336. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.html +0 -1
  337. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.scss +0 -0
  338. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.spec.ts +0 -23
  339. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.ts +0 -10
  340. package/src/lib/modules/layout/toolbar/single-store/single-store.component.html +0 -39
  341. package/src/lib/modules/layout/toolbar/single-store/single-store.component.scss +0 -172
  342. package/src/lib/modules/layout/toolbar/single-store/single-store.component.spec.ts +0 -23
  343. package/src/lib/modules/layout/toolbar/single-store/single-store.component.ts +0 -186
  344. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.html +0 -17
  345. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.scss +0 -172
  346. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.spec.ts +0 -23
  347. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.ts +0 -179
  348. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.html +0 -4
  349. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.scss +0 -19
  350. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.spec.ts +0 -23
  351. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.ts +0 -105
  352. package/src/lib/modules/layout/toolbar/toolbar.component.html +0 -56
  353. package/src/lib/modules/layout/toolbar/toolbar.component.scss +0 -0
  354. package/src/lib/modules/layout/toolbar/toolbar.component.spec.ts +0 -25
  355. package/src/lib/modules/layout/toolbar/toolbar.component.ts +0 -352
  356. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.html +0 -259
  357. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.scss +0 -311
  358. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.spec.ts +0 -23
  359. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.ts +0 -1200
  360. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.html +0 -199
  361. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.scss +0 -311
  362. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.spec.ts +0 -23
  363. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.ts +0 -899
  364. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.html +0 -204
  365. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.scss +0 -311
  366. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.spec.ts +0 -23
  367. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.ts +0 -1045
  368. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.html +0 -190
  369. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.scss +0 -311
  370. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.spec.ts +0 -23
  371. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.ts +0 -825
  372. package/src/lib/modules/notification/conformation/conformation.component.html +0 -25
  373. package/src/lib/modules/notification/conformation/conformation.component.scss +0 -0
  374. package/src/lib/modules/notification/conformation/conformation.component.spec.ts +0 -23
  375. package/src/lib/modules/notification/conformation/conformation.component.ts +0 -23
  376. package/src/lib/modules/notification/notification/notification.component.html +0 -209
  377. package/src/lib/modules/notification/notification/notification.component.scss +0 -211
  378. package/src/lib/modules/notification/notification/notification.component.spec.ts +0 -23
  379. package/src/lib/modules/notification/notification/notification.component.ts +0 -310
  380. package/src/lib/modules/notification/notification-routing.module.ts +0 -20
  381. package/src/lib/modules/notification/notification.module.ts +0 -21
  382. package/src/lib/pipes/customDate.pipe.ts +0 -18
  383. package/src/lib/routes/route-wraper-modules/analyse-wrapper.module.ts +0 -12
  384. package/src/lib/routes/route-wraper-modules/edge-wrapper.module.ts +0 -11
  385. package/src/lib/routes/route-wraper-modules/manage-wrapper.module.ts +0 -11
  386. package/src/lib/routes/route-wraper-modules/profile-wrapper.module.ts +0 -12
  387. package/src/lib/routes/route-wraper-modules/store-wrapper.module.ts +0 -11
  388. package/src/lib/routes/route-wraper-modules/ticket-wrapper.module.ts +0 -10
  389. package/src/lib/routes/routing.ts +0 -56
  390. package/src/lib/services/auth.service.ts +0 -173
  391. package/src/lib/services/notification.service.spec.ts +0 -16
  392. package/src/lib/services/notification.service.ts +0 -73
  393. package/src/lib/services/toast.service.ts +0 -82
  394. package/tsconfig.lib.json +0 -14
  395. package/tsconfig.lib.prod.json +0 -10
  396. package/tsconfig.spec.json +0 -14
@@ -0,0 +1,1060 @@
1
+ import { Component, HostListener, } from "@angular/core";
2
+ import dayjs from "dayjs";
3
+ import "dayjs/locale/en";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../../../../services/auth.service";
6
+ import * as i2 from "@angular/router";
7
+ import * as i3 from "tango-app-ui-global";
8
+ import * as i4 from "@angular/common";
9
+ import * as i5 from "../../../../common/custom-select/custom-select.component";
10
+ import * as i6 from "@angular/forms";
11
+ import * as i7 from "ngx-daterangepicker-material";
12
+ export class TrafficHeaderComponent {
13
+ auth;
14
+ router;
15
+ gs;
16
+ cd;
17
+ dayjs = dayjs;
18
+ isCustomDate = (m) => {
19
+ const isValidDate = m > this.dayjs();
20
+ return isValidDate ? "invalid-date" : false;
21
+ };
22
+ selectedDateRange = { startDate: dayjs().subtract(30, 'days'),
23
+ endDate: dayjs().subtract(1, "days"), };
24
+ selectedFilters = {
25
+ client: null,
26
+ clientName: null,
27
+ clients: [],
28
+ store: null,
29
+ stores: [],
30
+ date: null,
31
+ group: [],
32
+ location: [],
33
+ country: [],
34
+ };
35
+ Opendropdown = false;
36
+ dropdownOpen = null; // 'location' or 'group'
37
+ searchLocationText = "";
38
+ searchGroupText = "";
39
+ locations = [];
40
+ filteredLocations = [];
41
+ groupsData = [];
42
+ filteredGroups = [];
43
+ filteredStores = [];
44
+ stores = [];
45
+ searchStoreText = '';
46
+ clientList = [];
47
+ selectedClient;
48
+ locationLabel = [];
49
+ groupLabel = [];
50
+ users;
51
+ url;
52
+ filteredCountries = [];
53
+ countryLabel = [];
54
+ searchCountryText = "";
55
+ countries = [];
56
+ constructor(auth, router, gs, cd) {
57
+ this.auth = auth;
58
+ this.router = router;
59
+ this.gs = gs;
60
+ this.cd = cd;
61
+ }
62
+ onClick(event) {
63
+ const target = event.target;
64
+ if (!target.closest('.dropdown2')) {
65
+ this.Opendropdown = false;
66
+ }
67
+ }
68
+ closeDropdown1() {
69
+ this.Opendropdown = false;
70
+ }
71
+ ngOnInit() {
72
+ // this.setRangesBasedOnRoute();
73
+ // Listen for route changes to update ranges
74
+ // this.router?.events?.subscribe((event) => {
75
+ // if (event instanceof NavigationEnd) {
76
+ // this.setRangesBasedOnRoute();
77
+ // }
78
+ // });
79
+ this.url = this.router.url.split("?")[0].split('/');
80
+ const user = JSON.parse(localStorage.getItem('user-info'));
81
+ this.users = user;
82
+ this.gs?.manageRefreshTrigger?.subscribe((e) => {
83
+ if (e) {
84
+ if (user.userType === 'tango') {
85
+ this.getClient();
86
+ }
87
+ else {
88
+ const storedFilters = localStorage.getItem("header-filters");
89
+ if (storedFilters) {
90
+ const headerFilters = JSON.parse(storedFilters);
91
+ this.filteredStores = headerFilters?.stores.map((store) => ({
92
+ ...store,
93
+ checked: store.checked
94
+ }));
95
+ }
96
+ }
97
+ }
98
+ });
99
+ // Fetch client data if the user is of type 'tango'
100
+ if (user.userType === 'tango') {
101
+ this.getClient();
102
+ }
103
+ else {
104
+ this.getCountry();
105
+ this.getLocations();
106
+ this.getGroups();
107
+ this.getStore();
108
+ const clientFilters = localStorage.getItem("client-details");
109
+ if (clientFilters) {
110
+ const headerclientFilters = JSON.parse(clientFilters);
111
+ this.selectedClient = {
112
+ trafficDateRange: headerclientFilters.trafficDateRange
113
+ };
114
+ }
115
+ }
116
+ // Load filters from localStorage if they exist
117
+ const storedFilters = localStorage.getItem("header-filters");
118
+ if (storedFilters) {
119
+ const headerFilters = JSON.parse(storedFilters);
120
+ // Initialize selectedFilters with defaults or existing values
121
+ this.selectedFilters = {
122
+ client: headerFilters.client || this.users.client,
123
+ clientName: headerFilters.clientName || '',
124
+ clients: headerFilters.clients || [],
125
+ store: headerFilters.store || null,
126
+ date: headerFilters.date || {},
127
+ stores: headerFilters.stores || [],
128
+ group: headerFilters.group || [],
129
+ location: headerFilters.location || [],
130
+ country: headerFilters.country || []
131
+ };
132
+ // Sync filtered data with stored selections
133
+ this.filteredCountries = this.syncWithLocalStorage(headerFilters.country);
134
+ this.filteredLocations = this.syncWithLocalStorage(headerFilters.location);
135
+ this.filteredGroups = this.syncWithLocalStorage(headerFilters.group);
136
+ this.filteredStores = this.syncWithLocalStorage(headerFilters.stores);
137
+ // Format date range if it exists
138
+ if (headerFilters.date) {
139
+ this.selectedDateRange = {
140
+ startDate: this.dayjs(headerFilters.date.startDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
141
+ endDate: this.dayjs(headerFilters.date.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
142
+ };
143
+ }
144
+ else {
145
+ this.selectedDateRange = {
146
+ startDate: this.dayjs(this.selectedDateRange.startDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
147
+ endDate: this.dayjs(this.selectedDateRange.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
148
+ };
149
+ }
150
+ // console.log("3")
151
+ // Emit data via service and update localStorage
152
+ this.emitAndStoreFilters();
153
+ }
154
+ else {
155
+ // Initialize empty states if no header filters are present in localStorage
156
+ this.resetFilters();
157
+ // console.log("2")
158
+ }
159
+ }
160
+ syncWithLocalStorage(items) {
161
+ return items
162
+ ? items.map((item) => ({
163
+ ...item,
164
+ checked: item.checked === true
165
+ }))
166
+ : [];
167
+ }
168
+ emitAndStoreFilters() {
169
+ this.gs.dataRangeValue.next(this.selectedFilters);
170
+ localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
171
+ // console.log("1")
172
+ }
173
+ /**
174
+ * Reset selectedFilters and all related arrays to empty states
175
+ */
176
+ resetFilters() {
177
+ this.selectedFilters = {
178
+ client: null,
179
+ clientName: '',
180
+ clients: [],
181
+ store: null,
182
+ date: {},
183
+ stores: [],
184
+ group: [],
185
+ location: [],
186
+ country: []
187
+ };
188
+ this.filteredLocations = [];
189
+ this.filteredGroups = [];
190
+ this.filteredStores = [];
191
+ this.filteredCountries = [];
192
+ }
193
+ getClient() {
194
+ this.auth.getClients().subscribe({
195
+ next: (e) => {
196
+ if (e) {
197
+ this.clientList = e.data.result;
198
+ const headerFilters = JSON.parse(localStorage.getItem("header-filters") || "{}");
199
+ if (headerFilters.client) {
200
+ this.clientList.find((obj) => {
201
+ if (obj.clientId === headerFilters.client) {
202
+ this.selectedClient = obj;
203
+ }
204
+ });
205
+ // const startDate = this.dayjs(headerFilters.date.startDate);
206
+ // const endDate = this.dayjs(headerFilters.date.endDate);
207
+ // const differenceInDays = endDate.diff(startDate, 'days');
208
+ // if (differenceInDays >= 90 && this.selectedClient?.trafficDateRange === 90) {
209
+ // this.selectedDateRange = {
210
+ // startDate: this.dayjs(headerFilters.date.startDate, "YYYY-MM-DD").subtract(-90, 'days').format("DD-MM-YYYY"),
211
+ // endDate: this.dayjs(headerFilters.date.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
212
+ // };
213
+ // } else {
214
+ // this.selectedDateRange = {
215
+ // startDate: this.dayjs(this.selectedDateRange.startDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
216
+ // endDate: this.dayjs(this.selectedDateRange.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
217
+ // };
218
+ // }
219
+ this.selectedFilters.client = headerFilters.client;
220
+ this.selectedFilters.clientName = headerFilters.clientName;
221
+ this.selectedFilters.clients = headerFilters.clients;
222
+ this.selectedFilters.store = headerFilters.store;
223
+ this.selectedFilters.date = headerFilters.date;
224
+ this.selectedFilters.stores = headerFilters.stores;
225
+ this.selectedFilters.group = headerFilters.group;
226
+ this.selectedFilters.location = headerFilters.location;
227
+ this.selectedFilters.country = headerFilters.country;
228
+ this.gs.dataRangeValue.next(this.selectedFilters);
229
+ // console.log("2")
230
+ // Ensure locations and groups are loaded before fetching stores
231
+ this.getCountry();
232
+ this.getLocations();
233
+ this.getGroups();
234
+ // Fetch stores only after locations and groups are set
235
+ this.getStore();
236
+ }
237
+ else {
238
+ this.selectedClient = this.clientList[0];
239
+ this.selectedFilters.client = this.selectedClient.clientId;
240
+ this.selectedFilters.clientName = this.selectedClient.clientName;
241
+ this.selectedFilters.clients = headerFilters.clients;
242
+ this.selectedFilters.store = headerFilters.store;
243
+ this.selectedFilters.date = headerFilters.date;
244
+ this.selectedFilters.stores = headerFilters.stores;
245
+ this.selectedFilters.group = headerFilters.group;
246
+ this.selectedFilters.location = headerFilters.location;
247
+ this.selectedFilters.country = headerFilters.country;
248
+ localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
249
+ this.gs.dataRangeValue.next(this.selectedFilters);
250
+ // console.log("3")
251
+ this.cd.detectChanges();
252
+ // Ensure locations and groups are loaded before fetching stores
253
+ this.getCountry();
254
+ this.getLocations();
255
+ this.getGroups();
256
+ // Fetch stores only after locations and groups are set
257
+ this.getStore();
258
+ }
259
+ }
260
+ else {
261
+ this.selectedClient = this.clientList[0];
262
+ this.selectedFilters.client = this.selectedClient.clientId;
263
+ this.selectedFilters.clientName = this.selectedClient.clientName;
264
+ // Ensure locations and groups are loaded before fetching stores
265
+ this.getCountry();
266
+ this.getLocations();
267
+ this.getGroups();
268
+ // Fetch stores only after locations and groups are set
269
+ this.getStore();
270
+ localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
271
+ this.gs.dataRangeValue.next(this.selectedFilters);
272
+ // console.log("4")
273
+ this.cd.detectChanges();
274
+ }
275
+ this.getUserInfo(this.selectedFilters.client);
276
+ },
277
+ });
278
+ }
279
+ getUserInfo(client) {
280
+ let obj = {
281
+ clientId: client ? client : ''
282
+ };
283
+ if (client) {
284
+ this.auth.getHeaderUsers(obj).subscribe({
285
+ next: (e) => {
286
+ localStorage.setItem("usersEmail-info", JSON.stringify(e?.data?.userEmailData || []));
287
+ }
288
+ });
289
+ }
290
+ }
291
+ onClientSelect(event) {
292
+ // Update the selected client
293
+ this.selectedClient = event;
294
+ // Clear previous filtered data and selections
295
+ this.filteredGroups = [];
296
+ this.filteredStores = [];
297
+ this.filteredLocations = [];
298
+ this.selectedFilters.stores = [];
299
+ this.selectedFilters.group = [];
300
+ this.selectedFilters.location = [];
301
+ this.selectedFilters.country = [];
302
+ // Fetch header filters from localStorage
303
+ const headerFilters = JSON.parse(localStorage.getItem("header-filters") || "{}");
304
+ // Update the selected filters with the new client
305
+ this.selectedFilters.client = this.selectedClient.clientId;
306
+ this.selectedFilters.clientName = this.selectedClient.clientName;
307
+ // Remove old store, group, and location data from the header filters
308
+ delete headerFilters.stores;
309
+ delete headerFilters.groups;
310
+ delete headerFilters.location;
311
+ delete headerFilters.country;
312
+ // Fetch new data based on the new client
313
+ this.getCountry();
314
+ this.getLocations();
315
+ this.getStore();
316
+ this.getGroups();
317
+ // Update localStorage with the new client selection and empty filter data
318
+ localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
319
+ window.location.reload();
320
+ // Emit data to the global service
321
+ // this.gs.dataRangeValue.next(this.selectedFilters);
322
+ // Trigger change detection to reflect UI changes
323
+ this.cd.detectChanges();
324
+ }
325
+ ranges = {
326
+ Today: [dayjs(), dayjs()],
327
+ Yesterday: [dayjs().subtract(1, 'days'), dayjs().subtract(1, 'days')],
328
+ 'This Week': [dayjs().subtract(7, 'days'), dayjs().subtract(1, 'days')],
329
+ 'Last Week': [
330
+ dayjs().subtract(14, 'days').startOf('day'),
331
+ dayjs().subtract(8, 'days').endOf('day'),
332
+ ],
333
+ 'This Month': [dayjs().subtract(30, 'days'), dayjs().subtract(1, 'days')],
334
+ 'Last Month': [
335
+ dayjs().subtract(1, 'month').startOf('month'),
336
+ dayjs().subtract(1, 'month').endOf('month'),
337
+ ],
338
+ };
339
+ onStartDateChange(event) {
340
+ if (this.dayjs(event.startDate).isValid()) {
341
+ if (this.selectedClient?.traxDateRange === 90) {
342
+ this.isCustomDate = (m) => {
343
+ const isValidDate = m > this.dayjs() || m > this.dayjs(event.startDate.add(90, "days"));
344
+ return isValidDate ? "invalid-date" : false;
345
+ };
346
+ }
347
+ else {
348
+ this.isCustomDate = (m) => {
349
+ const isValidDate = m > this.dayjs() || m > this.dayjs(event.startDate.add(180, "days"));
350
+ return isValidDate ? "invalid-date" : false;
351
+ };
352
+ }
353
+ }
354
+ }
355
+ datechange(event) {
356
+ if (event && event.startDate && event.endDate) {
357
+ if (this.dayjs(event.startDate).isValid() &&
358
+ this.dayjs(event.endDate).isValid()) {
359
+ this.selectedDateRange.startDate = event.startDate;
360
+ this.selectedDateRange.endDate = event.endDate;
361
+ var datetime = {
362
+ startDate: this.dayjs(event.startDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
363
+ endDate: this.dayjs(event.endDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
364
+ };
365
+ this.selectedFilters.date = datetime;
366
+ localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
367
+ window.location.reload();
368
+ // this.gs.dataRangeValue.next(this.selectedFilters);
369
+ }
370
+ }
371
+ }
372
+ opendropdown(e) {
373
+ e.stopPropagation();
374
+ this.Opendropdown = !this.Opendropdown;
375
+ }
376
+ getLocations() {
377
+ const country = this.countries
378
+ .filter(country => country.checked)
379
+ .map(country => country.country);
380
+ // const headerFilters: any = JSON.parse(localStorage.getItem("header-filters") || "{}");
381
+ let obj = {
382
+ clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId,
383
+ country,
384
+ city: [],
385
+ group: [],
386
+ };
387
+ this.auth.getLocation(obj).subscribe({
388
+ next: (res) => {
389
+ let cityList = this.selectedFilters?.location?.filter((location) => location.checked).map((loc) => loc.city);
390
+ // Map the fetched locations with default unchecked state
391
+ this.locations = res?.data?.locationData.map((city) => ({
392
+ city: city.city,
393
+ // checked: cityList?.length ? cityList.includes(city.city) : true,
394
+ checked: cityList?.includes(city.city) ? true : false,
395
+ }));
396
+ // Sync the fetched locations with any stored checked values in localStorage
397
+ if (this.selectedFilters.location && Array.isArray(this.selectedFilters.location)) {
398
+ this.filteredLocations = this.locations.map(location => {
399
+ const matchedLocation = this.selectedFilters.location.find((loc) => loc.city === location.city);
400
+ return matchedLocation ? { ...location, checked: matchedLocation.checked } : location;
401
+ });
402
+ }
403
+ else {
404
+ this.filteredLocations = this.locations;
405
+ }
406
+ if (this.searchLocationText) {
407
+ this.filteredLocations = this.locations.filter((location) => location.city.toLowerCase().includes(this.searchLocationText.toLowerCase()));
408
+ }
409
+ const selectedLocations = this.locations.filter((location) => location.checked).map((location) => location.city);
410
+ if (selectedLocations.length > 0) {
411
+ setTimeout(() => {
412
+ this.getGroups();
413
+ this.getStore(); // Fetch stores based on selected groups
414
+ }, 1000);
415
+ }
416
+ if (!selectedLocations.length && country.length) {
417
+ this.getGroups();
418
+ }
419
+ },
420
+ error: (err) => {
421
+ console.error("Failed to fetch locations", err);
422
+ },
423
+ });
424
+ }
425
+ isAllLocationsSelected() {
426
+ return this.filteredLocations.every(location => location.checked);
427
+ }
428
+ selectedLocationsLabel() {
429
+ const selectedLocations = this.locationLabel = this.searchLocationText.length ? this.locations
430
+ .filter(location => location.checked).map(location => location.city) : this.filteredLocations
431
+ .filter(location => location.checked).map(location => location.city);
432
+ return selectedLocations.length === 0
433
+ ? ''
434
+ : selectedLocations.length === 1
435
+ ? selectedLocations[0]
436
+ : `${selectedLocations.length} locations`;
437
+ }
438
+ removeLocation() {
439
+ this.Reset();
440
+ }
441
+ getGroups() {
442
+ const country = this.countries
443
+ .filter(country => country.checked)
444
+ .map(country => country.country);
445
+ let city;
446
+ city = this.locations
447
+ .filter(location => location.checked)
448
+ .map(location => location.city);
449
+ if (!city.length && country.length) {
450
+ city = this.locations.map((loc) => loc.city);
451
+ }
452
+ const obj = { country, city, clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId, group: [] };
453
+ this.auth.getGroups(obj).subscribe({
454
+ next: (res) => {
455
+ let checkedGroup = this.selectedFilters?.group?.filter((group) => group.checked).map((group) => group.groupName);
456
+ const combinedGroups = res?.data?.groupData?.map((groupName) => ({
457
+ groupName: groupName.groupName,
458
+ checked: checkedGroup?.includes(groupName.groupName) ? true : false,
459
+ // checked: checkedGroup?.length ? checkedGroup.includes(groupName.groupName) : true,
460
+ }));
461
+ this.groupsData = combinedGroups;
462
+ if (this.searchGroupText.length) {
463
+ this.filteredGroups = combinedGroups.filter((item) => item.groupName.toLowerCase().includes(this.searchGroupText));
464
+ }
465
+ else {
466
+ this.filteredGroups = combinedGroups;
467
+ }
468
+ // Auto-fetch stores when groups are selected
469
+ const selectedGroups = this.groupsData.filter((group) => group.checked).map((group) => group.groupName);
470
+ if (selectedGroups.length > 0) {
471
+ setTimeout(() => {
472
+ this.getStore(); // Fetch stores based on selected groups
473
+ }, 1000);
474
+ }
475
+ },
476
+ error: (err) => {
477
+ console.error("Failed to fetch groups", err);
478
+ },
479
+ });
480
+ }
481
+ toggleDropdown(type) {
482
+ if (this.dropdownOpen === type) {
483
+ // If the dropdown is open, close it and avoid resetting the selected values unnecessarily
484
+ this.dropdownOpen = null;
485
+ }
486
+ else {
487
+ // Open the specific dropdown and handle data fetching only if necessary
488
+ this.dropdownOpen = type;
489
+ if (type === 'country') {
490
+ // Fetch countries only if not already fetched and no search text exists
491
+ if ((!this.filteredCountries || this.filteredCountries.length === 0) && !this.searchCountryText.trim()) {
492
+ this.getCountry();
493
+ }
494
+ }
495
+ if (type === 'group') {
496
+ // Fetch groups only if there are selected cities and no active search text
497
+ const selectedCities = this.locations
498
+ .filter((location) => location.checked)
499
+ .map((location) => location.city);
500
+ // Fetch groups only if locations are selected, no search text exists, and dropdown is opened
501
+ if (this.filteredLocations.length > 0 || (selectedCities.length > 0 && !this.searchGroupText.trim())) {
502
+ this.getGroups();
503
+ }
504
+ else {
505
+ this.filteredGroups = []; // Clear groups if no locations are selected
506
+ }
507
+ }
508
+ if (type === 'store') {
509
+ // Fetch stores only if not already fetched and no search text is active
510
+ if ((!this.filteredStores || this.filteredStores.length === 0) && !this.searchStoreText.trim()) {
511
+ this.getStore();
512
+ }
513
+ }
514
+ }
515
+ }
516
+ handleGroupDropdownClick() {
517
+ if (this.dropdownOpen === 'group') {
518
+ this.resetSelectedGroups();
519
+ }
520
+ this.toggleDropdown('group');
521
+ }
522
+ resetSelectedGroups() {
523
+ this.filteredGroups.forEach((group) => (group.checked = false));
524
+ this.searchGroupText = "";
525
+ }
526
+ selectedGroupsLabel() {
527
+ const selectedGroups = this.groupLabel = this.searchGroupText.length ? this.groupsData.filter((group) => group.checked) : this.filteredGroups.filter((group) => group.checked);
528
+ return selectedGroups.length === 0
529
+ ? ""
530
+ : selectedGroups.length === 1
531
+ ? selectedGroups[0].groupName
532
+ : `${selectedGroups.length} Clusters`;
533
+ }
534
+ removeGroup() {
535
+ this.Reset();
536
+ }
537
+ isAllGroupsSelected() {
538
+ return this.filteredGroups.length ? this.filteredGroups.every((group) => group.checked) : false;
539
+ }
540
+ getStore() {
541
+ const country = this.countries
542
+ .filter(country => country.checked)
543
+ .map(country => country.country);
544
+ const city = this.locations
545
+ .filter(location => location.checked)
546
+ .map(location => location.city);
547
+ const group = this.groupsData
548
+ .filter(group => group.checked)
549
+ .map(group => group.groupName);
550
+ const data = {
551
+ country,
552
+ city,
553
+ clusters: group,
554
+ clientId: this.users.clientId || this.selectedFilters.client
555
+ };
556
+ this.auth.getHeaderStores(data).subscribe({
557
+ next: (res) => {
558
+ if (res && res.code === 200) {
559
+ // Initialize stores from API response
560
+ this.stores = res.data.storesData;
561
+ // Check if there are previously selected stores
562
+ const checkedStoreIds = this.selectedFilters?.stores
563
+ ? this.selectedFilters.stores.filter((store) => store.checked).map((store) => store.storeId)
564
+ : [];
565
+ // Sync the `checked` state
566
+ this.stores.forEach(store => {
567
+ store.checked = checkedStoreIds.length
568
+ ? checkedStoreIds.includes(store.storeId) // Use previous selection
569
+ : true; // Default to true if no previous selection
570
+ });
571
+ // Apply search filter if search text is present
572
+ if (this.searchStoreText.length) {
573
+ this.filteredStores = this.stores.filter(store => store.storeName.toLowerCase().includes(this.searchStoreText.toLowerCase()));
574
+ }
575
+ else {
576
+ this.filteredStores = [...this.stores];
577
+ }
578
+ // Update `selectedFilters.stores` to reflect the current state
579
+ this.selectedFilters.stores = this.filteredStores.map(store => ({
580
+ storeId: store.storeId,
581
+ storeName: store.storeName,
582
+ checked: store.checked
583
+ }));
584
+ // this.selectedFilters.country = country;
585
+ // Save updated filters to localStorage
586
+ localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
587
+ // Trigger UI change detection
588
+ this.cd.detectChanges();
589
+ }
590
+ else {
591
+ // Handle empty or error response
592
+ this.clearStoresState();
593
+ }
594
+ },
595
+ error: (err) => {
596
+ console.error("Failed to fetch stores", err);
597
+ this.clearStoresState();
598
+ }
599
+ });
600
+ }
601
+ // Clear stores state and reset filters
602
+ clearStoresState() {
603
+ this.stores = [];
604
+ this.filteredStores = [];
605
+ this.selectedFilters.stores = [];
606
+ localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
607
+ }
608
+ resetSelectedStores() {
609
+ this.filteredStores.forEach((store) => (store.checked = false));
610
+ this.searchStoreText = "";
611
+ }
612
+ selectedStoresLabel() {
613
+ const selectedStores = this.searchStoreText.length ? this.stores.filter((store) => store.checked) : this.filteredStores.filter((store) => store.checked);
614
+ return selectedStores.length === 0
615
+ ? "0 Stores"
616
+ : selectedStores.length === 1
617
+ ? selectedStores[0].storeName
618
+ : `${selectedStores.length} Stores`;
619
+ }
620
+ isAllStoresSelected() {
621
+ return this.filteredStores.length > 0 && this.filteredStores.every(store => store.checked);
622
+ }
623
+ // Method to handle dropdown item selection
624
+ updateSelectedStores() {
625
+ this.filteredStores.forEach(store => {
626
+ const filteredStore = this.stores.findIndex(fStore => fStore.storeId === store.storeId);
627
+ if (filteredStore != -1) {
628
+ this.stores[filteredStore].checked = store.checked; // Sync the checked state with full store list
629
+ }
630
+ });
631
+ // Update selectedFilters based on the current store selection
632
+ this.selectedFilters.stores = this.stores.filter(store => store.checked);
633
+ // Update localStorage with the latest selection
634
+ localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
635
+ // Emit updated filters via service
636
+ // this.gs.dataRangeValue.next(this.selectedFilters);
637
+ // Trigger change detection if necessary
638
+ this.cd.detectChanges();
639
+ }
640
+ toggleSelectAllLocations(event) {
641
+ const isChecked = event.target.checked;
642
+ this.filteredLocations.forEach((location) => (location.checked = isChecked));
643
+ this.updateSelectedLocations();
644
+ }
645
+ toggleSelectAllStores(event) {
646
+ const checked = event.target.checked;
647
+ // Apply the selection to both filtered and full list of stores
648
+ this.filteredStores.forEach(store => store.checked = checked);
649
+ this.stores.forEach(store => {
650
+ const filteredStore = this.filteredStores.find(fStore => fStore.storeId === store.storeId);
651
+ if (filteredStore) {
652
+ store.checked = checked; // Sync the checked state with full store list
653
+ }
654
+ });
655
+ // Update the selected stores and persist the selection
656
+ this.updateSelectedStores();
657
+ }
658
+ updateSelectedLocations() {
659
+ // When locations are selected, fetch the related groups
660
+ const selectedCities = this.filteredLocations
661
+ .filter((location) => location.checked)
662
+ .map((location) => location.city);
663
+ this.filteredLocations.forEach((location) => {
664
+ let findLocationIndex = this.locations.findIndex((loc) => loc.city == location.city);
665
+ if (findLocationIndex != -1) {
666
+ this.locations[findLocationIndex].checked = location.checked;
667
+ }
668
+ });
669
+ if (selectedCities.length > 0 || !selectedCities.length) {
670
+ this.selectedFilters.stores = [];
671
+ this.groupsData = [];
672
+ this.getGroups(); // Fetch groups based on selected cities
673
+ // If there are selected groups, fetch the stores based on selected groups
674
+ this.getStore();
675
+ this.selectedFilters.location = this.locations;
676
+ }
677
+ else {
678
+ this.filteredGroups = []; // Clear groups if no locations are selected
679
+ this.selectedFilters.location = [];
680
+ }
681
+ this.selectedFilters.group = [];
682
+ this.filteredStores = []; // Reset stores as well
683
+ this.searchGroupText = '';
684
+ this.searchStoreText = '';
685
+ // this.Opendropdown = false;
686
+ }
687
+ toggleSelectAllGroups(event) {
688
+ const isChecked = event.target.checked;
689
+ this.filteredGroups.forEach((group) => (group.checked = isChecked));
690
+ this.updateSelectedGroups();
691
+ }
692
+ updateSelectedGroups() {
693
+ // Fetch the relevant stores after groups are selected
694
+ const selectedGroups = this.filteredGroups
695
+ .filter((group) => group.checked)
696
+ .map((group) => group.groupName);
697
+ this.filteredGroups.forEach((group) => {
698
+ let findGroupIndex = this.groupsData.findIndex((item) => item.groupName == group.groupName);
699
+ if (findGroupIndex != -1) {
700
+ this.groupsData[findGroupIndex].checked = group.checked;
701
+ }
702
+ });
703
+ if (selectedGroups.length > 0 || !selectedGroups.length) {
704
+ this.selectedFilters.stores = [];
705
+ // If there are selected groups, fetch the stores based on selected groups
706
+ this.getStore();
707
+ this.selectedFilters.group = this.groupsData;
708
+ }
709
+ else {
710
+ // If no groups are selected, clear the stores list
711
+ this.filteredStores = [];
712
+ // Also, update localStorage to reflect the cleared store selection
713
+ this.selectedFilters.stores = [];
714
+ localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
715
+ // Emit data via service
716
+ // this.gs.dataRangeValue.next(this.selectedFilters);
717
+ }
718
+ // Clear the search store text when groups are updated
719
+ this.searchStoreText = '';
720
+ }
721
+ Reset() {
722
+ setTimeout(() => {
723
+ // Clear selected groups, stores, and locations
724
+ this.filteredCountries = [];
725
+ this.filteredGroups = [];
726
+ this.filteredStores = [];
727
+ this.filteredLocations = []; // Reset locations as well
728
+ this.locations = [];
729
+ this.groupsData = [];
730
+ this.stores = [];
731
+ // Clear search input fields
732
+ this.searchLocationText = "";
733
+ this.searchGroupText = "";
734
+ this.searchStoreText = "";
735
+ this.selectedFilters.stores = [];
736
+ this.selectedFilters.group = [];
737
+ this.selectedFilters.location = [];
738
+ this.selectedFilters.country = [];
739
+ // Fetch locations, groups, and stores again
740
+ this.getCountry();
741
+ this.getLocations();
742
+ this.getStore();
743
+ this.getGroups();
744
+ // Reset the filters in selectedFilters
745
+ // // Once stores are fetched, mark all as checked
746
+ // setTimeout(() => {
747
+ // this.filteredStores = this.stores.map(store => ({
748
+ // ...store,
749
+ // checked: true // Mark all stores as checked
750
+ // }));
751
+ // // Sync selectedFilters with the updated store state
752
+ // this.selectedFilters.stores = this.filteredStores.map(store => ({
753
+ // ...store,
754
+ // checked: true
755
+ // }));
756
+ // Update localStorage with the latest selectedFilters
757
+ localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
758
+ window.location.reload();
759
+ // Emit the reset filters to update other components if needed
760
+ // this.gs.dataRangeValue.next(this.selectedFilters);
761
+ // Trigger change detection
762
+ this.cd.detectChanges();
763
+ // Adding a slight delay to ensure stores are fetched first
764
+ // Close dropdown after reset if necessary
765
+ this.Opendropdown = false;
766
+ }, 100);
767
+ }
768
+ filterLocations() {
769
+ const searchText = this.searchLocationText.toLowerCase();
770
+ if (searchText) {
771
+ // Preserve the checked state during filtering
772
+ this.filteredLocations = this.locations
773
+ .map(location => ({
774
+ ...location,
775
+ checked: this.filteredLocations.find(l => l.city === location.city)?.checked || false
776
+ }))
777
+ .filter(location => location?.city?.toLowerCase().includes(searchText));
778
+ }
779
+ else {
780
+ // Restore the original checked state when search text is cleared
781
+ this.filteredLocations = this.locations.map(location => ({
782
+ ...location,
783
+ checked: this.selectedFilters.location.find((l) => l.city === location.city)?.checked || false
784
+ }));
785
+ }
786
+ }
787
+ filterGroups() {
788
+ const searchText = this.searchGroupText.toLowerCase();
789
+ if (searchText) {
790
+ // Preserve the checked state during filtering
791
+ this.filteredGroups = this.groupsData
792
+ .map(group => ({
793
+ ...group,
794
+ checked: this.filteredGroups.find(g => g.groupName === group.groupName)?.checked || false
795
+ }))
796
+ .filter(group => group?.groupName?.toLowerCase().includes(searchText));
797
+ }
798
+ else {
799
+ // Restore the original checked state when search text is cleared
800
+ this.filteredGroups = this.groupsData.map(group => ({
801
+ ...group,
802
+ checked: this.selectedFilters.group.find((g) => g.groupName === group.groupName)?.checked || false
803
+ }));
804
+ }
805
+ }
806
+ filterStores() {
807
+ const searchText = this.searchStoreText.toLowerCase();
808
+ // Preserve checked states during filtering
809
+ if (searchText) {
810
+ // Filter based on search text while preserving checked state
811
+ this.filteredStores = this.stores
812
+ .map(store => ({
813
+ ...store,
814
+ // Check if the store is already checked in filteredStores, fallback to original stores' checked state
815
+ checked: this.selectedFilters.stores.find((s) => s.storeId === store.storeId)?.checked || store.checked || false
816
+ }))
817
+ .filter(store => store.storeName.toLowerCase().includes(searchText));
818
+ }
819
+ else {
820
+ // When the search text is cleared, restore the original list with preserved checked states
821
+ this.filteredStores = this.stores.map(store => ({
822
+ ...store,
823
+ // Preserve the checked state based on the selected filters
824
+ checked: this.selectedFilters.stores.find((s) => s.storeId === store.storeId)?.checked || store.checked || false
825
+ }));
826
+ }
827
+ }
828
+ closeDropdown() {
829
+ this.dropdownOpen = null;
830
+ }
831
+ clickOutside(event) {
832
+ const clickedInside = event.target.closest(".dropdown-container");
833
+ const clickedoutSide = event.target.closest(".dropdown2");
834
+ if (!clickedInside) {
835
+ this.closeDropdown();
836
+ }
837
+ if (!clickedoutSide) {
838
+ this.closeDropdown1();
839
+ }
840
+ }
841
+ // getCountry(): void {
842
+ // // const headerFilters: any = JSON.parse(localStorage.getItem("header-filters") || "{}");
843
+ // let obj ={
844
+ // clientId: this.selectedFilters.client ? this.selectedFilters.client :this.users.clientId,
845
+ // }
846
+ // this.auth.getCountry(obj).subscribe({
847
+ // next: (res: any) => {
848
+ // let countryList = this.selectedFilters?.country?.filter((country:any) => country.checked).map((loc:any) => loc.allCountry);
849
+ // // Map the fetched countries with default unchecked state
850
+ // this.countires = res?.data?.countryData.map((allCountry: any) => ({
851
+ // allCountry: allCountry.allCountry,
852
+ // checked: countryList?.includes(allCountry.allCountry) ? true : false,
853
+ // }));
854
+ // // Sync the fetched countries with any stored checked values in localStorage
855
+ // if (this.selectedFilters.country && Array.isArray(this.selectedFilters.country)) {
856
+ // this.filteredCountries = this.countries.map(country => {
857
+ // const matchedLocation = this.selectedFilters.country.find((loc: any) => loc.allCountry === country.allCountry);
858
+ // return matchedLocation ? { ...country, checked: matchedLocation.checked } : country;
859
+ // });
860
+ // } else {
861
+ // this.filteredCountries = this.countries;
862
+ // }
863
+ // if(this.searchLocationText) {
864
+ // this.filteredCountries = this.countries.filter((country:any) => country.city.toLowerCase().includes(this.searchLocationText.toLowerCase()))
865
+ // }
866
+ // const selectedCountries = this.countries.filter((country) => country.checked).map((country) => country.allCountry);
867
+ // if (selectedCountries.length > 0) {
868
+ // setTimeout(()=>{
869
+ // this.getStore(); // Fetch stores based on selected groups
870
+ // },1000)
871
+ // }
872
+ // },
873
+ // error: (err) => {
874
+ // console.error("Failed to fetch countries", err);
875
+ // },
876
+ // });
877
+ // }
878
+ // selectedCountriesLabel(): string {
879
+ // const selectedCountries = this.countryLabel = this.searchLocationText.length ? this.countries
880
+ // .filter(country => country.checked).map(country => country.allCountry) : this.filteredCountries
881
+ // .filter(country => country.checked).map(country => country.allCountry);
882
+ // return selectedCountries.length === 0
883
+ // ? ''
884
+ // : selectedCountries.length === 1
885
+ // ? selectedCountries[0]
886
+ // : `${selectedCountries.length} countries`;
887
+ // }
888
+ // isAllCountriesSelected(): boolean {
889
+ // return this.filteredCountries.every(country => country.checked);
890
+ // }
891
+ // filterCountries(): void {
892
+ // const searchText = this.searchCountryText.toLowerCase();
893
+ // if (searchText) {
894
+ // // Preserve the checked state during filtering
895
+ // this.filteredCountries = this.countires
896
+ // .map(country => ({
897
+ // ...country,
898
+ // checked: this.filteredCountries.find(l => l.allCountry === country.allCountry)?.checked || false
899
+ // }))
900
+ // .filter(location =>
901
+ // location?.allCountry?.toLowerCase().includes(searchText)
902
+ // );
903
+ // } else {
904
+ // // Restore the original checked state when search text is cleared
905
+ // this.filteredCountries = this.countires.map(country => ({
906
+ // ...country,
907
+ // checked: this.selectedFilters.country.find((l:any) => l.allCountry === country.allCountry)?.checked || false
908
+ // }));
909
+ // }
910
+ // }
911
+ getCountry() {
912
+ let obj = {
913
+ clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId,
914
+ };
915
+ this.auth.getCountry(obj).subscribe({
916
+ next: (res) => {
917
+ // Extract selected countries from existing filters (if any)
918
+ let countryList = this.selectedFilters?.country?.filter((country) => country.checked).map((loc) => loc.country);
919
+ // Map API response to frontend model
920
+ this.countries = res?.data?.countryData.map((item) => ({
921
+ country: item.country,
922
+ // checked: countryList?.length ? countryList.includes(item.country) : true,
923
+ // checked: cityList?.length ? cityList.includes(city.city) : true,
924
+ checked: countryList?.includes(item.country) ? true : false,
925
+ }));
926
+ if (this.selectedFilters.country && Array.isArray(this.selectedFilters.country)) {
927
+ this.filteredCountries = this.countries.map(location => {
928
+ const matchedLocation = this.selectedFilters.country.find((loc) => loc.country === location.country);
929
+ return matchedLocation ? { ...location, checked: matchedLocation.checked } : location;
930
+ });
931
+ }
932
+ else {
933
+ this.filteredCountries = this.countries;
934
+ }
935
+ // Initially, all countries are visible
936
+ this.filteredCountries = [...this.countries];
937
+ // If a search text already exists, filter immediately
938
+ if (this.searchCountryText) {
939
+ this.filterCountries();
940
+ }
941
+ // Fetch stores if at least one country is selected
942
+ let selectedCountries = this.countries.filter((country) => country.checked);
943
+ if (selectedCountries.length > 0) {
944
+ setTimeout(() => {
945
+ this.getLocations();
946
+ this.getStore(); // fetch stores
947
+ }, 1000);
948
+ }
949
+ },
950
+ error: (err) => {
951
+ console.error("Failed to fetch countries", err);
952
+ },
953
+ });
954
+ }
955
+ selectedCountriesLabel() {
956
+ const selectedCountries = this.searchCountryText.length
957
+ ? this.filteredCountries.filter(country => country.checked).map(country => country.country)
958
+ : this.countries.filter(country => country.checked).map(country => country.country);
959
+ return selectedCountries.length === 0
960
+ ? ''
961
+ : selectedCountries.length === 1
962
+ ? selectedCountries[0]
963
+ : `${selectedCountries.length} countries`;
964
+ }
965
+ filterCountries() {
966
+ const searchText = this.searchCountryText.toLowerCase();
967
+ if (searchText) {
968
+ // Filter and preserve checked state
969
+ this.filteredCountries = this.countries
970
+ .map(country => ({
971
+ ...country,
972
+ checked: this.filteredCountries.find(c => c.country === country.country)?.checked || false
973
+ }))
974
+ .filter(country => country.country.toLowerCase().includes(searchText));
975
+ }
976
+ else {
977
+ // Reset to full list
978
+ this.filteredCountries = this.countries.map((country) => ({
979
+ ...country,
980
+ checked: this.selectedFilters.country?.find((c) => c.country === country.country)?.checked || false
981
+ }));
982
+ }
983
+ }
984
+ isAllCountriesSelected() {
985
+ return this.filteredCountries.length > 0 && this.filteredCountries.every(country => country.checked);
986
+ }
987
+ toggleSelectAllCountries(event) {
988
+ const isChecked = event.target.checked;
989
+ this.filteredCountries.forEach((country) => (country.checked = isChecked));
990
+ this.updateSelectedCountries();
991
+ }
992
+ updateSelectedCountries() {
993
+ // When locations are selected, fetch the related groups
994
+ const selectedCountries = this.filteredCountries
995
+ .filter((country) => country.checked)
996
+ .map((country) => country.country);
997
+ this.filteredCountries.forEach((country) => {
998
+ let findCountryIndex = this.countries.findIndex((loc) => loc.country == country.country);
999
+ if (findCountryIndex != -1) {
1000
+ this.countries[findCountryIndex].checked = country.checked;
1001
+ }
1002
+ });
1003
+ if (selectedCountries.length > 0 || !selectedCountries.length) {
1004
+ this.selectedFilters.stores = [];
1005
+ this.groupsData = [];
1006
+ this.locations = [];
1007
+ this.getLocations();
1008
+ this.getGroups(); // Fetch groups based on selected cities
1009
+ // If there are selected groups, fetch the stores based on selected groups
1010
+ this.getStore();
1011
+ this.selectedFilters.country = this.filteredCountries;
1012
+ }
1013
+ else {
1014
+ this.filteredGroups = []; // Clear groups if no locations are selected
1015
+ this.selectedFilters.country = [];
1016
+ }
1017
+ this.selectedFilters.group = [];
1018
+ this.filteredStores = []; // Reset stores as well
1019
+ this.searchGroupText = '';
1020
+ this.searchStoreText = '';
1021
+ // this.Opendropdown = false;
1022
+ }
1023
+ removeCountry() {
1024
+ this.Reset();
1025
+ }
1026
+ Apply() {
1027
+ // Close the dropdown
1028
+ this.Opendropdown = false;
1029
+ // Fetch existing filters from localStorage
1030
+ const headerFilters = JSON.parse(localStorage.getItem("header-filters") || "{}");
1031
+ this.selectedFilters.store = null;
1032
+ // Ensure current selections are reflected
1033
+ this.selectedFilters.country = this.filteredCountries;
1034
+ this.selectedFilters.location = this.locations;
1035
+ this.selectedFilters.group = this.groupsData;
1036
+ this.selectedFilters.stores = headerFilters.stores ? headerFilters.stores : this.stores;
1037
+ // Store updated filters back in localStorage
1038
+ localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
1039
+ // this.gs.dataRangeValue.next(this.selectedFilters);
1040
+ window.location.reload();
1041
+ // Emit the updated filters via the service
1042
+ // this.gs.dataRangeValue.next(this.selectedFilters);
1043
+ // Trigger refresh if necessary
1044
+ // this.gs.manageRefreshTrigger.next(true);
1045
+ this.cd.detectChanges();
1046
+ }
1047
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrafficHeaderComponent, deps: [{ token: i1.AuthService }, { token: i2.Router }, { token: i3.GlobalStateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1048
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TrafficHeaderComponent, selector: "lib-traffic-header", host: { listeners: { "document:click": "clickOutside($event)" } }, ngImport: i0, template: "<div class=\"me-3\">\r\n <label *ngIf=\"selectedCountriesLabel()\" class=\"badge badge-light-default mx-2\">{{selectedCountriesLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeCountry()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n<div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput\r\n ngxDaterangepickerMd [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [autoApply]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\" autocomplete=\"off\"\r\n [(ngModel)]=\"selectedDateRange\" (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" />\r\n</div>\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-default mx-2 rounded-3 text-nowrap border-val\">\r\n <!-- <span class=\"me-2\">Filter</span> -->\r\n <svg class=\"pl-3\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <div *ngIf=\"Opendropdown\" class=\"card p-5 dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important;\" (clickOutside)=\"closeDropdown1()\">\r\n <div class=\"dropdown-title d-flex justify-content-between mb-2\">Filter Options\r\n <button class=\"btn btn-outline w-25 ms-3 btn-resize\" (click)=\"Reset()\"> Reset </button>\r\n <button class=\"btn btn-primary w-25 btn-resize\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n\r\n <!-- Country Dropdown -->\r\n<div class=\"dropdown-container\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('country')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedCountriesLabel()\"\r\n readonly\r\n placeholder=\"Select country\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'country'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search country\" \r\n [(ngModel)]=\"searchCountryText\" \r\n (ngModelChange)=\"filterCountries()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllCountries\" \r\n [checked]=\"isAllCountriesSelected()\" \r\n (change)=\"toggleSelectAllCountries($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllCountries\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let country of filteredCountries\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"country.country\" \r\n [(ngModel)]=\"country.checked\"\r\n (change)=\"updateSelectedCountries()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"country.country\">\r\n {{ country.country }}\r\n </label>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n\r\n <!-- Location Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('location')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedLocationsLabel()\"\r\n readonly\r\n placeholder=\"Select Region\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'location'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search Region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocations\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocations\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let location of filteredLocations\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Group Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('group')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedGroupsLabel()\" readonly\r\n placeholder=\"Select clusters\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'group'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroups\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroups\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let group of filteredGroups\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"group.groupName\"\r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- Store Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('store')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\"\r\n [value]=\"selectedStoresLabel()\"\r\n readonly\r\n placeholder=\"Select stores\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'store'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search \" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStores\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStores\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let store of filteredStores\"\r\n >\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"store.storeId\"\r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.dropdown2{position:absolute;top:70px;min-width:270px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:0 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.CustomSelectComponent, selector: "lib-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
1049
+ }
1050
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrafficHeaderComponent, decorators: [{
1051
+ type: Component,
1052
+ args: [{ selector: "lib-traffic-header", template: "<div class=\"me-3\">\r\n <label *ngIf=\"selectedCountriesLabel()\" class=\"badge badge-light-default mx-2\">{{selectedCountriesLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeCountry()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n<div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput\r\n ngxDaterangepickerMd [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [autoApply]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\" autocomplete=\"off\"\r\n [(ngModel)]=\"selectedDateRange\" (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" />\r\n</div>\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-default mx-2 rounded-3 text-nowrap border-val\">\r\n <!-- <span class=\"me-2\">Filter</span> -->\r\n <svg class=\"pl-3\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <div *ngIf=\"Opendropdown\" class=\"card p-5 dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important;\" (clickOutside)=\"closeDropdown1()\">\r\n <div class=\"dropdown-title d-flex justify-content-between mb-2\">Filter Options\r\n <button class=\"btn btn-outline w-25 ms-3 btn-resize\" (click)=\"Reset()\"> Reset </button>\r\n <button class=\"btn btn-primary w-25 btn-resize\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n\r\n <!-- Country Dropdown -->\r\n<div class=\"dropdown-container\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('country')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedCountriesLabel()\"\r\n readonly\r\n placeholder=\"Select country\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'country'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search country\" \r\n [(ngModel)]=\"searchCountryText\" \r\n (ngModelChange)=\"filterCountries()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllCountries\" \r\n [checked]=\"isAllCountriesSelected()\" \r\n (change)=\"toggleSelectAllCountries($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllCountries\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let country of filteredCountries\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"country.country\" \r\n [(ngModel)]=\"country.checked\"\r\n (change)=\"updateSelectedCountries()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"country.country\">\r\n {{ country.country }}\r\n </label>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n\r\n <!-- Location Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('location')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedLocationsLabel()\"\r\n readonly\r\n placeholder=\"Select Region\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'location'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search Region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocations\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocations\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let location of filteredLocations\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Group Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('group')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedGroupsLabel()\" readonly\r\n placeholder=\"Select clusters\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'group'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroups\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroups\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let group of filteredGroups\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"group.groupName\"\r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- Store Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('store')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\"\r\n [value]=\"selectedStoresLabel()\"\r\n readonly\r\n placeholder=\"Select stores\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'store'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search \" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStores\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStores\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let store of filteredStores\"\r\n >\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"store.storeId\"\r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.dropdown2{position:absolute;top:70px;min-width:270px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:0 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}\n"] }]
1053
+ }], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.Router }, { type: i3.GlobalStateService }, { type: i0.ChangeDetectorRef }], propDecorators: { onClick: [{
1054
+ type: HostListener,
1055
+ args: ['document:click', ['$event']]
1056
+ }], clickOutside: [{
1057
+ type: HostListener,
1058
+ args: ["document:click", ["$event"]]
1059
+ }] } });
1060
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZmZpYy1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYXBwLXNoYXJlZC9zcmMvbGliL21vZHVsZXMvbGF5b3V0L3Rvb2xiYXIvdHJhZmZpYy1oZWFkZXIvdHJhZmZpYy1oZWFkZXIvdHJhZmZpYy1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYXBwLXNoYXJlZC9zcmMvbGliL21vZHVsZXMvbGF5b3V0L3Rvb2xiYXIvdHJhZmZpYy1oZWFkZXIvdHJhZmZpYy1oZWFkZXIvdHJhZmZpYy1oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8saUJBQWlCLENBQUM7Ozs7Ozs7OztBQVN6QixNQUFNLE9BQU8sc0JBQXNCO0lBMEN2QjtJQUE4QjtJQUMvQjtJQUNDO0lBM0NWLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDZCxZQUFZLEdBQUcsQ0FBQyxDQUFjLEVBQUUsRUFBRTtRQUNoQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFFRixpQkFBaUIsR0FBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRSxDQUFDO0lBQ3pDLGVBQWUsR0FBUTtRQUNyQixNQUFNLEVBQUUsSUFBSTtRQUNaLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsS0FBSyxFQUFFLElBQUk7UUFDWCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEVBQUU7UUFDVCxRQUFRLEVBQUUsRUFBRTtRQUNaLE9BQU8sRUFBRSxFQUFFO0tBQ1osQ0FBQztJQUNGLFlBQVksR0FBWSxLQUFLLENBQUM7SUFDOUIsWUFBWSxHQUFrQixJQUFJLENBQUMsQ0FBQyx3QkFBd0I7SUFDNUQsa0JBQWtCLEdBQVcsRUFBRSxDQUFDO0lBQ2hDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsU0FBUyxHQUFVLEVBQUUsQ0FBQztJQUN0QixpQkFBaUIsR0FBVSxFQUFFLENBQUM7SUFDOUIsVUFBVSxHQUFVLEVBQUUsQ0FBQztJQUN2QixjQUFjLEdBQVUsRUFBRSxDQUFDO0lBQzNCLGNBQWMsR0FBVSxFQUFFLENBQUM7SUFDM0IsTUFBTSxHQUFTLEVBQUUsQ0FBQTtJQUNqQixlQUFlLEdBQVUsRUFBRSxDQUFDO0lBQzVCLFVBQVUsR0FBTyxFQUFFLENBQUE7SUFDbkIsY0FBYyxDQUFJO0lBQ2xCLGFBQWEsR0FBUSxFQUFFLENBQUM7SUFDeEIsVUFBVSxHQUFRLEVBQUUsQ0FBQztJQUNyQixLQUFLLENBQU07SUFDWCxHQUFHLENBQU07SUFDVCxpQkFBaUIsR0FBVSxFQUFFLENBQUM7SUFDOUIsWUFBWSxHQUFRLEVBQUUsQ0FBQztJQUN2QixpQkFBaUIsR0FBVyxFQUFFLENBQUM7SUFDL0IsU0FBUyxHQUFVLEVBQUUsQ0FBQztJQUN0QixZQUNVLElBQWlCLEVBQWEsTUFBYyxFQUM3QyxFQUFzQixFQUNyQixFQUFxQjtRQUZyQixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQWEsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUM3QyxPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUNyQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtJQUM1QixDQUFDO0lBR0osT0FBTyxDQUFFLEtBQWlCO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQzNDLElBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBQ0QsUUFBUTtRQUNOLGdDQUFnQztRQUVoQyw0Q0FBNEM7UUFDNUMsOENBQThDO1FBQzlDLDBDQUEwQztRQUMxQyxvQ0FBb0M7UUFDcEMsTUFBTTtRQUNOLE1BQU07UUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBVyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsRUFBRTtnQkFDTCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO29CQUMvQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7aUJBQ2hCO3FCQUFLO29CQUNKLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxhQUFhLEVBQUU7d0JBQ25CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ2hELElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQzlELEdBQUcsS0FBSzs0QkFDUixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87eUJBQ3ZCLENBQUMsQ0FBQyxDQUFDO3FCQUNMO2lCQUNBO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILG1EQUFtRDtRQUNuRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQzdCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNsQjthQUFNO1lBQ0wsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RCxJQUFJLGFBQWEsRUFBRTtnQkFDakIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsY0FBYyxHQUFHO29CQUN0QixnQkFBZ0IsRUFBRyxtQkFBbUIsQ0FBQyxnQkFBZ0I7aUJBQ3RELENBQUE7YUFDQTtTQUNGO1FBRUQsK0NBQStDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3RCxJQUFJLGFBQWEsRUFBRTtZQUNqQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRWhELDhEQUE4RDtZQUM5RCxJQUFJLENBQUMsZUFBZSxHQUFHO2dCQUNyQixNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ2pELFVBQVUsRUFBRSxhQUFhLENBQUMsVUFBVSxJQUFJLEVBQUU7Z0JBQzFDLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTyxJQUFJLEVBQUU7Z0JBQ3BDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLElBQUk7Z0JBQ2xDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzlCLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUU7Z0JBQ2xDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ2hDLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxJQUFJLEVBQUU7Z0JBQ3RDLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTyxJQUFJLEVBQUU7YUFDckMsQ0FBQztZQUVGLDRDQUE0QztZQUM1QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXRFLGlDQUFpQztZQUNqQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUU7Z0JBRXRCLElBQUksQ0FBQyxpQkFBaUIsR0FBRztvQkFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztvQkFDdEYsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztpQkFDbkYsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxpQkFBaUIsR0FBRztvQkFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO29CQUMxRixPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7aUJBQ3ZGLENBQUM7YUFDSDtZQUNELG1CQUFtQjtZQUNuQixnREFBZ0Q7WUFDdEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDdEI7YUFBTTtZQUNMLDJFQUEyRTtZQUMzRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsbUJBQW1CO1NBQ3BCO0lBQ0gsQ0FBQztJQUNPLG9CQUFvQixDQUFDLEtBQVk7UUFDdkMsT0FBTyxLQUFLO1lBQ1YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3hCLEdBQUcsSUFBSTtnQkFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJO2FBQy9CLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQzdFLG1CQUFtQjtJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsTUFBTSxFQUFFLElBQUk7WUFDWixVQUFVLEVBQUUsRUFBRTtZQUNkLE9BQU8sRUFBRSxFQUFFO1lBQ1gsS0FBSyxFQUFFLElBQUk7WUFDWCxJQUFJLEVBQUUsRUFBRTtZQUNSLE1BQU0sRUFBRSxFQUFFO1lBQ1YsS0FBSyxFQUFFLEVBQUU7WUFDVCxRQUFRLEVBQUUsRUFBRTtZQUNaLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztRQUNGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0gsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQy9CLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNWLElBQUksQ0FBQyxFQUFFO29CQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQ2hDLE1BQU0sYUFBYSxHQUFRLElBQUksQ0FBQyxLQUFLLENBQ25DLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLENBQy9DLENBQUM7b0JBQ0YsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO3dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFOzRCQUNoQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssYUFBYSxDQUFDLE1BQU0sRUFBRTtnQ0FDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7NkJBQzNCO3dCQUNILENBQUMsQ0FBQyxDQUFDO3dCQUNILDhEQUE4RDt3QkFDOUQsMERBQTBEO3dCQUMxRCw0REFBNEQ7d0JBQzVELGdGQUFnRjt3QkFDaEYsK0JBQStCO3dCQUMvQixvSEFBb0g7d0JBQ3BILDBGQUEwRjt3QkFDMUYsT0FBTzt3QkFDUCxXQUFXO3dCQUNYLCtCQUErQjt3QkFDL0Isa0dBQWtHO3dCQUNsRyw4RkFBOEY7d0JBQzlGLE9BQU87d0JBQ1AsSUFBSTt3QkFDSixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO3dCQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDO3dCQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO3dCQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO3dCQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO3dCQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO3dCQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO3dCQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO3dCQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO3dCQUNyRCxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUNsRCxtQkFBbUI7d0JBQ1osZ0VBQWdFO3dCQUNoRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNoQix1REFBdUQ7d0JBQ3ZELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztxQkFDWDt5QkFBTTt3QkFDTCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO3dCQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQTt3QkFDbEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQzt3QkFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQzt3QkFDakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQzt3QkFDakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQzt3QkFDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQzt3QkFDbkQsWUFBWSxDQUFDLE9BQU8sQ0FDbEIsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUNyQyxDQUFDO3dCQUNGLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ2xELG1CQUFtQjt3QkFDbkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDakIsZ0VBQWdFO3dCQUM5RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNoQix1REFBdUQ7d0JBQ3ZELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztxQkFDWDtpQkFHRjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO29CQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQTtvQkFDL0QsZ0VBQWdFO29CQUN0RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNqQix1REFBdUQ7b0JBQ3ZELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDWCxZQUFZLENBQUMsT0FBTyxDQUNsQixnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQ3JDLENBQUM7b0JBQ0YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDbEQsbUJBQW1CO29CQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUN6QjtnQkFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFNUMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxXQUFXLENBQUMsTUFBVTtRQUNwQixJQUFJLEdBQUcsR0FBRTtZQUNMLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsRUFBRTtTQUNoQyxDQUFBO1FBQ0QsSUFBRyxNQUFNLEVBQUM7WUFDUixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3RDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNWLFlBQVksQ0FBQyxPQUFPLENBQ2xCLGlCQUFpQixFQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUM3QyxDQUFDO2dCQUNKLENBQUM7YUFDRixDQUFDLENBQUE7U0FDSDtJQUNILENBQUM7SUFDRCxjQUFjLENBQUMsS0FBVTtRQUN2Qiw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsOENBQThDO1FBQzlDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBR2xDLHlDQUF5QztRQUN6QyxNQUFNLGFBQWEsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUV0RixrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7UUFFakUscUVBQXFFO1FBQ3JFLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUM1QixPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDNUIsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQzlCLE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUc3Qix5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLDBFQUEwRTtRQUMxRSxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDN0UsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUN4QixrQ0FBa0M7UUFDbEMscURBQXFEO1FBQ3JELGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFJRCxNQUFNLEdBQU87UUFDWCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN6QixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckUsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZFLFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUMzQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7U0FDekM7UUFDRCxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekUsWUFBWSxFQUFFO1lBQ1osS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzdDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztTQUM1QztLQUNGLENBQUM7SUFFQSxpQkFBaUIsQ0FBQyxLQUFVO1FBQzFCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdEMsSUFBRyxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsS0FBSyxFQUFFLEVBQUM7Z0JBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFjLEVBQUUsRUFBRTtvQkFDckMsTUFBTSxXQUFXLEdBQ2YsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDdEUsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUM5QyxDQUFDLENBQUM7YUFDSDtpQkFBTTtnQkFDTixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBYyxFQUFFLEVBQUU7b0JBQzNDLE1BQU0sV0FBVyxHQUNmLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ3ZFLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDOUMsQ0FBQyxDQUFDO2FBQ0U7U0FFTDtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDN0MsSUFDRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUNuQztnQkFDQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDL0MsSUFBSSxRQUFRLEdBQUc7b0JBQ2IsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQ3pELFlBQVksQ0FDYjtvQkFDRCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7aUJBQ3RFLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO2dCQUNyQyxZQUFZLENBQUMsT0FBTyxDQUNsQixnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQ3JDLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtnQkFDMUIscURBQXFEO2FBQ3BEO1NBQ0Y7SUFDSCxDQUFDO0lBQ0QsWUFBWSxDQUFDLENBQVk7UUFDdkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ3pDLENBQUM7SUFDRCxZQUFZO1FBQ1YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVM7YUFDN0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzthQUNsQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMseUZBQXlGO1FBQ3pGLElBQUksR0FBRyxHQUFFO1lBQ1IsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQ3hGLE9BQU87WUFDUCxJQUFJLEVBQUUsRUFBRTtZQUNSLEtBQUssRUFBRSxFQUFFO1NBQ1QsQ0FBQTtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuQyxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBWSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JILHlEQUF5RDtnQkFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzNELElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDZixtRUFBbUU7b0JBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO2lCQUN0RCxDQUFDLENBQUMsQ0FBQztnQkFFSiw0RUFBNEU7Z0JBQzVFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNqRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ3JELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3JHLE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztvQkFDeEYsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7aUJBQ3pDO2dCQUVELElBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFO29CQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFZLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUE7aUJBQzlJO2dCQUNELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakgsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNoQyxVQUFVLENBQUMsR0FBRSxFQUFFO3dCQUNiLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDakIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsd0NBQXdDO29CQUMzRCxDQUFDLEVBQUMsSUFBSSxDQUFDLENBQUE7aUJBQ1I7Z0JBRUQsSUFBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO29CQUM5QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7aUJBQ2xCO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEQsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXBFLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTO2FBQzNGLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxpQkFBaUI7YUFDN0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RSxPQUFPLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUNoQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLFlBQVksQ0FBQztJQUM5QyxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVM7YUFDM0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzthQUNsQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUM7UUFDVCxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVM7YUFDbEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQzthQUNwQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEMsSUFBRyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNqQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUNILE1BQU0sR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFDLElBQUksRUFBQyxRQUFRLEVBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBRSxFQUFFLENBQUM7UUFDOUgsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2pDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekgsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNwRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7b0JBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO29CQUNuRSxxRkFBcUY7aUJBQ3RGLENBQUMsQ0FBQyxDQUFDO2dCQUNKLElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDO2dCQUNqQyxJQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFO29CQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO2lCQUN4SDtxQkFDSTtvQkFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztpQkFDdEM7Z0JBRUQsNkNBQTZDO2dCQUM3QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4RyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM3QixVQUFVLENBQUMsR0FBRSxFQUFFO3dCQUNiLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QztvQkFDM0QsQ0FBQyxFQUFDLElBQUksQ0FBQyxDQUFBO2lCQUNSO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0MsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBZ0Q7UUFDN0QsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRTtZQUM5QiwwRkFBMEY7WUFDMUYsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7YUFBTTtZQUNMLHdFQUF3RTtZQUN4RSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUV6QixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLHdFQUF3RTtnQkFDeEUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3RHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFDbkI7YUFDRjtZQUVELElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRTtnQkFDcEIsMkVBQTJFO2dCQUMzRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUztxQkFDbEMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO3FCQUN0QyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFcEMsNkZBQTZGO2dCQUMvRixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7b0JBQ3BHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDbEI7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsQ0FBQyw0Q0FBNEM7aUJBQ3ZFO2FBQ0Y7WUFFRCxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUU7Z0JBQ3BCLHdFQUF3RTtnQkFDeEUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQzlGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDakI7YUFDRjtTQUNBO0lBQ0gsQ0FBQztJQUdELHdCQUF3QjtRQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssT0FBTyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQ0QsbUJBQW1CO1FBQ2pCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0ssT0FBTyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDaEMsQ0FBQyxDQUFDLEVBQUU7WUFDSixDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUM3QixDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQzdCLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLFdBQVcsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVmLENBQUM7SUFHRCxtQkFBbUI7UUFFakIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2xHLENBQUM7SUFFRCxRQUFRO1FBQ04sTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVM7YUFDN0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzthQUNsQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVM7YUFDeEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQzthQUNwQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVU7YUFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzthQUM5QixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakMsTUFBTSxJQUFJLEdBQUc7WUFDWCxPQUFPO1lBQ1AsSUFBSTtZQUNKLFFBQVEsRUFBRSxLQUFLO1lBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTTtTQUM3RCxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3hDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRTtvQkFDM0Isc0NBQXNDO29CQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO29CQUNsQyxnREFBZ0Q7b0JBQ2hELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTTt3QkFDbEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzt3QkFDcEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDUCwyQkFBMkI7b0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUMxQixLQUFLLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNOzRCQUNwQyxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMseUJBQXlCOzRCQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsMkNBQTJDO29CQUN2RCxDQUFDLENBQUMsQ0FBQztvQkFFSCxnREFBZ0Q7b0JBQ2hELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUU7d0JBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDL0MsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUMzRSxDQUFDO3FCQUNIO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDeEM7b0JBRUQsK0RBQStEO29CQUMvRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQzlELE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTzt3QkFDdEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO3dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87cUJBQ3ZCLENBQUMsQ0FBQyxDQUFDO29CQUNKLDBDQUEwQztvQkFFMUMsdUNBQXVDO29CQUN2QyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7b0JBRTdFLDhCQUE4QjtvQkFDOUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDekI7cUJBQU07b0JBQ0wsaUNBQWlDO29CQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDekI7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx1Q0FBdUM7SUFDL0IsZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6SixPQUFPLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNoQyxDQUFDLENBQUMsVUFBVTtZQUNaLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDN0IsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sU0FBUyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUNILDJDQUEyQztJQUMzQyxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RixJQUFJLGFBQWEsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLDhDQUE4QzthQUNuRztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsOERBQThEO1FBQzlELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpFLGdEQUFnRDtRQUNoRCxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFN0UsbUNBQW1DO1FBQ25DLHFEQUFxRDtRQUVyRCx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0Msd0JBQXdCLENBQUMsS0FBVTtRQUNqQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUN2QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQscUJBQXFCLENBQUMsS0FBWTtRQUNoQyxNQUFNLE9BQU8sR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxPQUFPLENBQUM7UUFFM0QsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNGLElBQUksYUFBYSxFQUFFO2dCQUNqQixLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLDhDQUE4QzthQUN4RTtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsd0RBQXdEO1FBQ3hELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUI7YUFDMUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO2FBQ3RDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFZLEVBQUUsRUFBRTtZQUM5QyxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RixJQUFHLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7YUFDOUQ7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFFLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFFLEVBQUUsQ0FBQTtZQUNuQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7WUFDMUQsMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBRWhEO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDRDQUE0QztZQUN0RSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDcEM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsQ0FBQyx1QkFBdUI7UUFDakQsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsNkJBQTZCO0lBQy9CLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFVO1FBQzlCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLHNEQUFzRDtRQUN0RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYzthQUN2QyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDaEMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRTtZQUN4QyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEcsSUFBRyxjQUFjLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDekQ7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFFLEVBQUUsQ0FBQztZQUNoQywwRUFBMEU7WUFDMUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDOUM7YUFBTTtZQUNMLG1EQUFtRDtZQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUV6QixtRUFBbUU7WUFDbkUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUU3RSx3QkFBd0I7WUFDeEIscURBQXFEO1NBQ3REO1FBRUQsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFHRCxLQUFLO1FBQ0gsVUFBVSxDQUFDLEdBQUUsRUFBRTtZQUNkLCtDQUErQztZQUNsRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFBO1lBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUMsQ0FBQywwQkFBMEI7WUFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRSxFQUFFLENBQUM7WUFBQSxJQUFJLENBQUMsVUFBVSxHQUFFLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxNQUFNLEdBQUUsRUFBRSxDQUFDO1lBQ3RELDRCQUE0QjtZQUM1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFFLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEdBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxHQUFFLEVBQUUsQ0FBQztZQUcvQiw0Q0FBNEM7WUFDNUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLHVDQUF1QztZQUd2QyxrREFBa0Q7WUFDbEQscUJBQXFCO1lBQ3JCLHNEQUFzRDtZQUN0RCxnQkFBZ0I7WUFDaEIsbURBQW1EO1lBQ25ELFNBQVM7WUFFVCx5REFBeUQ7WUFDekQsc0VBQXNFO1lBQ3RFLGdCQUFnQjtZQUNoQixvQkFBb0I7WUFDcEIsU0FBUztZQUVQLHNEQUFzRDtZQUN0RCxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDaEYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtZQUNyQiw4REFBOEQ7WUFDOUQscURBQXFEO1lBQ3JELDJCQUEyQjtZQUMzQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLDJEQUEyRDtZQUcxRCwwQ0FBMEM7WUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDNUIsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUtELGVBQWU7UUFDYixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFekQsSUFBSSxVQUFVLEVBQUU7WUFDZCw4Q0FBOEM7WUFDOUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTO2lCQUNwQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQixHQUFHLFFBQVE7Z0JBQ1gsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLElBQUksS0FBSzthQUN0RixDQUFDLENBQUM7aUJBQ0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQ2pCLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUNuRCxDQUFDO1NBQ0w7YUFBTTtZQUNMLGlFQUFpRTtZQUNqRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxHQUFHLFFBQVE7Z0JBQ1gsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLEtBQUs7YUFDbkcsQ0FBQyxDQUFDLENBQUM7U0FDTDtJQUNILENBQUM7SUFHRCxZQUFZO1FBQ1YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV0RCxJQUFJLFVBQVUsRUFBRTtZQUNkLDhDQUE4QztZQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVO2lCQUNsQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNiLEdBQUcsS0FBSztnQkFDUixPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLElBQUksS0FBSzthQUMxRixDQUFDLENBQUM7aUJBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ2QsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQ3JELENBQUM7U0FDTDthQUFNO1lBQ0wsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRCxHQUFHLEtBQUs7Z0JBQ1IsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxJQUFJLEtBQUs7YUFDdkcsQ0FBQyxDQUFDLENBQUM7U0FDTDtJQUNILENBQUM7SUFHRCxZQUFZO1FBQ1YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RCwyQ0FBMkM7UUFDM0MsSUFBSSxVQUFVLEVBQUU7WUFDZCw2REFBNkQ7WUFDN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTTtpQkFDOUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDYixHQUFHLEtBQUs7Z0JBQ1Isc0dBQXNHO2dCQUN0RyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLO2FBQ3RILENBQUMsQ0FBQztpQkFDRixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ3hFO2FBQU07WUFDTCwyRkFBMkY7WUFDM0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLEdBQUcsS0FBSztnQkFDUiwyREFBMkQ7Z0JBQzNELE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUs7YUFDdEgsQ0FBQyxDQUFDLENBQUM7U0FDTDtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUdELFlBQVksQ0FBQyxLQUFpQjtRQUM1QixNQUFNLGFBQWEsR0FBSSxLQUFLLENBQUMsTUFBc0IsQ0FBQyxPQUFPLENBQ3pELHFCQUFxQixDQUN0QixDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQUksS0FBSyxDQUFDLE1BQXNCLENBQUMsT0FBTyxDQUMxRCxZQUFZLENBQ2IsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO1FBQ0QsSUFBRyxDQUFDLGNBQWMsRUFBRTtZQUNsQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7SUFFSCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLDhGQUE4RjtJQUM5RixlQUFlO0lBQ2YsK0ZBQStGO0lBQy9GLE1BQU07SUFDTiwwQ0FBMEM7SUFDMUMsNEJBQTRCO0lBQzVCLG9JQUFvSTtJQUNwSSxrRUFBa0U7SUFDbEUsNEVBQTRFO0lBQzVFLDZDQUE2QztJQUM3QyxnRkFBZ0Y7SUFDaEYsYUFBYTtJQUViLHFGQUFxRjtJQUNyRiwyRkFBMkY7SUFDM0YsbUVBQW1FO0lBQ25FLDRIQUE0SDtJQUM1SCxpR0FBaUc7SUFDakcsY0FBYztJQUNkLGlCQUFpQjtJQUNqQixtREFBbUQ7SUFDbkQsVUFBVTtJQUVWLHNDQUFzQztJQUN0QyxzSkFBc0o7SUFDdEosVUFBVTtJQUNWLDRIQUE0SDtJQUM1SCw0Q0FBNEM7SUFDNUMsMkJBQTJCO0lBQzNCLHNFQUFzRTtJQUN0RSxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFNBQVM7SUFDVCx3QkFBd0I7SUFDeEIseURBQXlEO0lBQ3pELFNBQVM7SUFDVCxRQUFRO0lBQ1IsSUFBSTtJQUVKLHFDQUFxQztJQUNyQyxrR0FBa0c7SUFDbEcsdUdBQXVHO0lBQ3ZHLDhFQUE4RTtJQUM5RSwwQ0FBMEM7SUFDMUMsV0FBVztJQUNYLHVDQUF1QztJQUN2Qyw2QkFBNkI7SUFDN0IsaURBQWlEO0lBQ2pELElBQUk7SUFFSixzQ0FBc0M7SUFDdEMscUVBQXFFO0lBRXJFLElBQUk7SUFDSixnQ0FBZ0M7SUFDaEMsNkRBQTZEO0lBRTdELHNCQUFzQjtJQUN0QixxREFBcUQ7SUFDckQsOENBQThDO0lBQzlDLDJCQUEyQjtJQUMzQixzQkFBc0I7SUFDdEIsMkdBQTJHO0lBQzNHLFlBQVk7SUFDWiw0QkFBNEI7SUFDNUIsbUVBQW1FO0lBQ25FLFdBQVc7SUFDWCxhQUFhO0lBQ2Isd0VBQXdFO0lBQ3hFLGdFQUFnRTtJQUNoRSxvQkFBb0I7SUFDcEIscUhBQXFIO0lBQ3JILFdBQVc7SUFDWCxNQUFNO0lBQ04sSUFBSTtJQUdGLFVBQVU7UUFDVixJQUFJLEdBQUcsR0FBRztZQUNSLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtTQUMxRixDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2xDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQiw0REFBNEQ7Z0JBQzVELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUUxSCxxQ0FBcUM7Z0JBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMxRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLDRFQUE0RTtvQkFDNUUsbUVBQW1FO29CQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztpQkFFNUQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQy9FLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDckQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDMUcsT0FBTyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUN4RixDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztpQkFDekM7Z0JBR0QsdUNBQXVDO2dCQUN2QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFHN0Msc0RBQXNEO2dCQUN0RCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUN4QjtnQkFFRCxtREFBbUQ7Z0JBQ25ELElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUUsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNoQyxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNkLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsZUFBZTtvQkFDbEMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNWO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEQsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTTtZQUNyRCxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEYsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNuQyxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxZQUFZLENBQUM7SUFDOUMsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFeEQsSUFBSSxVQUFVLEVBQUU7WUFDZCxvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTO2lCQUNwQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNmLEdBQUcsT0FBTztnQkFDVixPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sSUFBSSxLQUFLO2FBQzNGLENBQUMsQ0FBQztpQkFDRixNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQzFFO2FBQU07WUFDTCxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDakUsR0FBRyxPQUFPO2dCQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sSUFBSSxLQUFLO2FBQ3pHLENBQUMsQ0FBQyxDQUFDO1NBQ0w7SUFDSCxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBQ0Qsd0JBQXdCLENBQUMsS0FBVTtRQUNqQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUN2QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUVqQyxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLHdEQUF3RDtRQUN4RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUI7YUFDN0MsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2FBQ3BDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtZQUM3QyxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RixJQUFHLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7YUFDNUQ7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtZQUM3RCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRSxFQUFFLENBQUE7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QztZQUMxRCwwRUFBMEU7WUFDMUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUV2RDthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsQ0FBQyw0Q0FBNEM7WUFDdEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1NBQ25DO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLENBQUMsdUJBQXVCO1FBQ2pELElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLDZCQUE2QjtJQUMvQixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFRCxLQUFLO1FBQ0gscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTFCLDJDQUEyQztRQUMzQyxNQUFNLGFBQWEsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBSSxJQUFJLENBQUE7UUFFbEMsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN0RCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQy9DLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4Riw2Q0FBNkM7UUFDN0MsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQzdFLHFEQUFxRDtRQUNyRCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ3hCLDJDQUEyQztRQUMzQyxxREFBcUQ7UUFDckQsK0JBQStCO1FBQy9CLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7d0dBL29DVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiw2SENoQm5DLG9rWUFrUU07OzRGRGxQTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3NLQW9EOUIsT0FBTztzQkFETixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXkyQjFDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBPbkluaXQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xyXG5pbXBvcnQgXCJkYXlqcy9sb2NhbGUvZW5cIjtcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLXRyYWZmaWMtaGVhZGVyXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi90cmFmZmljLWhlYWRlci5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vdHJhZmZpYy1oZWFkZXIuY29tcG9uZW50LnNjc3NcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFRyYWZmaWNIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGRheWpzID0gZGF5anM7XHJcbiAgaXNDdXN0b21EYXRlID0gKG06IGRheWpzLkRheWpzKSA9PiB7XHJcbiAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9IG0gPiB0aGlzLmRheWpzKCk7XHJcbiAgICByZXR1cm4gaXNWYWxpZERhdGUgPyBcImludmFsaWQtZGF0ZVwiIDogZmFsc2U7XHJcbiAgfTtcclxuXHJcbiAgc2VsZWN0ZWREYXRlUmFuZ2U6IGFueSA9IHsgc3RhcnREYXRlOiBkYXlqcygpLnN1YnRyYWN0KDMwLCAnZGF5cycpLFxyXG4gICAgZW5kRGF0ZTogZGF5anMoKS5zdWJ0cmFjdCgxLCBcImRheXNcIiksfTtcclxuICBzZWxlY3RlZEZpbHRlcnM6IGFueSA9IHtcclxuICAgIGNsaWVudDogbnVsbCxcclxuICAgIGNsaWVudE5hbWU6IG51bGwsXHJcbiAgICBjbGllbnRzOiBbXSxcclxuICAgIHN0b3JlOiBudWxsLFxyXG4gICAgc3RvcmVzOiBbXSxcclxuICAgIGRhdGU6IG51bGwsXHJcbiAgICBncm91cDogW10sXHJcbiAgICBsb2NhdGlvbjogW10sXHJcbiAgICBjb3VudHJ5OiBbXSxcclxuICB9O1xyXG4gIE9wZW5kcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duT3Blbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vICdsb2NhdGlvbicgb3IgJ2dyb3VwJ1xyXG4gIHNlYXJjaExvY2F0aW9uVGV4dDogc3RyaW5nID0gXCJcIjtcclxuICBzZWFyY2hHcm91cFRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgbG9jYXRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkTG9jYXRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIGdyb3Vwc0RhdGE6IGFueVtdID0gW107XHJcbiAgZmlsdGVyZWRHcm91cHM6IGFueVtdID0gW107XHJcbiAgZmlsdGVyZWRTdG9yZXM6IGFueVtdID0gW107XHJcbiAgc3RvcmVzOmFueVtdID0gW11cclxuICBzZWFyY2hTdG9yZVRleHQ6c3RyaW5nID0gJyc7XHJcbiAgY2xpZW50TGlzdDphbnkgPSBbXVxyXG4gIHNlbGVjdGVkQ2xpZW50OmFueVxyXG4gIGxvY2F0aW9uTGFiZWw6IGFueVtdPVtdO1xyXG4gIGdyb3VwTGFiZWw6IGFueVtdPVtdO1xyXG4gIHVzZXJzOiBhbnk7XHJcbiAgdXJsOiBhbnk7XHJcbiAgZmlsdGVyZWRDb3VudHJpZXM6IGFueVtdID0gW107XHJcbiAgY291bnRyeUxhYmVsOiBhbnlbXT1bXTtcclxuICBzZWFyY2hDb3VudHJ5VGV4dDogc3RyaW5nID0gXCJcIjtcclxuICBjb3VudHJpZXM6IGFueVtdID0gW107XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGF1dGg6IEF1dGhTZXJ2aWNlLCAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHVibGljIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHt9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkNsaWNrIChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYoIXRhcmdldC5jbG9zZXN0KCcuZHJvcGRvd24yJykpIHtcclxuICAgICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgY2xvc2VEcm9wZG93bjEoKXtcclxuICAgIHRoaXMuT3BlbmRyb3Bkb3duID0gZmFsc2U7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gdGhpcy5zZXRSYW5nZXNCYXNlZE9uUm91dGUoKTtcclxuXHJcbiAgICAvLyBMaXN0ZW4gZm9yIHJvdXRlIGNoYW5nZXMgdG8gdXBkYXRlIHJhbmdlc1xyXG4gICAgLy8gdGhpcy5yb3V0ZXI/LmV2ZW50cz8uc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgLy8gICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XHJcbiAgICAvLyAgICAgdGhpcy5zZXRSYW5nZXNCYXNlZE9uUm91dGUoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgICB0aGlzLnVybCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIj9cIilbMF0uc3BsaXQoJy8nKTtcclxuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSBhcyBzdHJpbmcpO1xyXG4gICAgdGhpcy51c2VycyA9IHVzZXI7XHJcbiAgICB0aGlzLmdzPy5tYW5hZ2VSZWZyZXNoVHJpZ2dlcj8uc3Vic2NyaWJlKChlKSA9PiB7ICAgICAgXHJcbiAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgaWYgKHVzZXIudXNlclR5cGUgPT09ICd0YW5nbycpIHtcclxuICAgICAgICB0aGlzLmdldENsaWVudCgpO1xyXG4gICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgIGNvbnN0IHN0b3JlZEZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpO1xyXG4gICAgICAgICAgaWYgKHN0b3JlZEZpbHRlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnMgPSBKU09OLnBhcnNlKHN0b3JlZEZpbHRlcnMpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IGhlYWRlckZpbHRlcnM/LnN0b3Jlcy5tYXAoKHN0b3JlOmFueSkgPT4gKHtcclxuICAgICAgICAgICAgLi4uc3RvcmUsXHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHN0b3JlLmNoZWNrZWRcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuIFxyXG4gICAgLy8gRmV0Y2ggY2xpZW50IGRhdGEgaWYgdGhlIHVzZXIgaXMgb2YgdHlwZSAndGFuZ28nXHJcbiAgICBpZiAodXNlci51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICB0aGlzLmdldENsaWVudCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRDb3VudHJ5KCk7XHJcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgY29uc3QgY2xpZW50RmlsdGVycyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY2xpZW50LWRldGFpbHNcIik7XHJcbiAgICAgIGlmIChjbGllbnRGaWx0ZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyY2xpZW50RmlsdGVycyA9IEpTT04ucGFyc2UoY2xpZW50RmlsdGVycyk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSB7XHJcbiAgICAgIHRyYWZmaWNEYXRlUmFuZ2UgOiBoZWFkZXJjbGllbnRGaWx0ZXJzLnRyYWZmaWNEYXRlUmFuZ2VcclxuICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgIFxyXG4gICAgLy8gTG9hZCBmaWx0ZXJzIGZyb20gbG9jYWxTdG9yYWdlIGlmIHRoZXkgZXhpc3RcclxuICAgIGNvbnN0IHN0b3JlZEZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpO1xyXG4gICAgaWYgKHN0b3JlZEZpbHRlcnMpIHtcclxuICAgICAgY29uc3QgaGVhZGVyRmlsdGVycyA9IEpTT04ucGFyc2Uoc3RvcmVkRmlsdGVycyk7XHJcbiAgXHJcbiAgICAgIC8vIEluaXRpYWxpemUgc2VsZWN0ZWRGaWx0ZXJzIHdpdGggZGVmYXVsdHMgb3IgZXhpc3RpbmcgdmFsdWVzXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzID0ge1xyXG4gICAgICAgIGNsaWVudDogaGVhZGVyRmlsdGVycy5jbGllbnQgfHwgdGhpcy51c2Vycy5jbGllbnQsXHJcbiAgICAgICAgY2xpZW50TmFtZTogaGVhZGVyRmlsdGVycy5jbGllbnROYW1lIHx8ICcnLFxyXG4gICAgICAgIGNsaWVudHM6IGhlYWRlckZpbHRlcnMuY2xpZW50cyB8fCBbXSxcclxuICAgICAgICBzdG9yZTogaGVhZGVyRmlsdGVycy5zdG9yZSB8fCBudWxsLFxyXG4gICAgICAgIGRhdGU6IGhlYWRlckZpbHRlcnMuZGF0ZSB8fCB7fSxcclxuICAgICAgICBzdG9yZXM6IGhlYWRlckZpbHRlcnMuc3RvcmVzIHx8IFtdLFxyXG4gICAgICAgIGdyb3VwOiBoZWFkZXJGaWx0ZXJzLmdyb3VwIHx8IFtdLFxyXG4gICAgICAgIGxvY2F0aW9uOiBoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uIHx8IFtdLFxyXG4gICAgICAgIGNvdW50cnk6IGhlYWRlckZpbHRlcnMuY291bnRyeSB8fCBbXVxyXG4gICAgICB9O1xyXG4gIFxyXG4gICAgICAvLyBTeW5jIGZpbHRlcmVkIGRhdGEgd2l0aCBzdG9yZWQgc2VsZWN0aW9uc1xyXG4gICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5zeW5jV2l0aExvY2FsU3RvcmFnZShoZWFkZXJGaWx0ZXJzLmNvdW50cnkpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5zeW5jV2l0aExvY2FsU3RvcmFnZShoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uKTtcclxuICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IHRoaXMuc3luY1dpdGhMb2NhbFN0b3JhZ2UoaGVhZGVyRmlsdGVycy5ncm91cCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN5bmNXaXRoTG9jYWxTdG9yYWdlKGhlYWRlckZpbHRlcnMuc3RvcmVzKTtcclxuICBcclxuICAgICAgLy8gRm9ybWF0IGRhdGUgcmFuZ2UgaWYgaXQgZXhpc3RzXHJcbiAgICAgIGlmIChoZWFkZXJGaWx0ZXJzLmRhdGUpIHtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB7XHJcbiAgICAgICAgICBzdGFydERhdGU6IHRoaXMuZGF5anMoaGVhZGVyRmlsdGVycy5kYXRlLnN0YXJ0RGF0ZSwgXCJZWVlZLU1NLUREXCIpLmZvcm1hdChcIkRELU1NLVlZWVlcIiksXHJcbiAgICAgICAgICBlbmREYXRlOiB0aGlzLmRheWpzKGhlYWRlckZpbHRlcnMuZGF0ZS5lbmREYXRlLCBcIllZWVktTU0tRERcIikuZm9ybWF0KFwiREQtTU0tWVlZWVwiKSxcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB7XHJcbiAgICAgICAgICBzdGFydERhdGU6IHRoaXMuZGF5anModGhpcy5zZWxlY3RlZERhdGVSYW5nZS5zdGFydERhdGUsIFwiWVlZWS1NTS1ERFwiKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpLFxyXG4gICAgICAgICAgZW5kRGF0ZTogdGhpcy5kYXlqcyh0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLmVuZERhdGUsIFwiWVlZWS1NTS1ERFwiKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgLy8gY29uc29sZS5sb2coXCIzXCIpXHJcbiAgICAgIC8vIEVtaXQgZGF0YSB2aWEgc2VydmljZSBhbmQgdXBkYXRlIGxvY2FsU3RvcmFnZVxyXG50aGlzLmVtaXRBbmRTdG9yZUZpbHRlcnMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEluaXRpYWxpemUgZW1wdHkgc3RhdGVzIGlmIG5vIGhlYWRlciBmaWx0ZXJzIGFyZSBwcmVzZW50IGluIGxvY2FsU3RvcmFnZVxyXG4gICAgICB0aGlzLnJlc2V0RmlsdGVycygpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIjJcIilcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBzeW5jV2l0aExvY2FsU3RvcmFnZShpdGVtczogYW55W10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gaXRlbXNcclxuICAgICAgPyBpdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBjaGVja2VkOiBpdGVtLmNoZWNrZWQgPT09IHRydWVcclxuICAgICAgICB9KSlcclxuICAgICAgOiBbXTtcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBlbWl0QW5kU3RvcmVGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwiMVwiKVxyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBSZXNldCBzZWxlY3RlZEZpbHRlcnMgYW5kIGFsbCByZWxhdGVkIGFycmF5cyB0byBlbXB0eSBzdGF0ZXNcclxuICAgKi9cclxuICBwcml2YXRlIHJlc2V0RmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzID0ge1xyXG4gICAgICBjbGllbnQ6IG51bGwsXHJcbiAgICAgIGNsaWVudE5hbWU6ICcnLFxyXG4gICAgICBjbGllbnRzOiBbXSxcclxuICAgICAgc3RvcmU6IG51bGwsXHJcbiAgICAgIGRhdGU6IHt9LFxyXG4gICAgICBzdG9yZXM6IFtdLFxyXG4gICAgICBncm91cDogW10sXHJcbiAgICAgIGxvY2F0aW9uOiBbXSxcclxuICAgICAgY291bnRyeTogW11cclxuICAgIH07XHJcbiAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gW107XHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107XHJcbiAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gW107XHJcbiAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gW107XHJcbiAgfVxyXG5nZXRDbGllbnQoKXtcclxuICB0aGlzLmF1dGguZ2V0Q2xpZW50cygpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50TGlzdCA9IGUuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoaGVhZGVyRmlsdGVycy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50TGlzdC5maW5kKChvYmo6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAob2JqLmNsaWVudElkID09PSBoZWFkZXJGaWx0ZXJzLmNsaWVudCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy8gY29uc3Qgc3RhcnREYXRlID0gdGhpcy5kYXlqcyhoZWFkZXJGaWx0ZXJzLmRhdGUuc3RhcnREYXRlKTtcclxuICAgICAgICAgIC8vIGNvbnN0IGVuZERhdGUgPSB0aGlzLmRheWpzKGhlYWRlckZpbHRlcnMuZGF0ZS5lbmREYXRlKTtcclxuICAgICAgICAgIC8vIGNvbnN0IGRpZmZlcmVuY2VJbkRheXMgPSBlbmREYXRlLmRpZmYoc3RhcnREYXRlLCAnZGF5cycpO1xyXG4gICAgICAgICAgLy8gaWYgKGRpZmZlcmVuY2VJbkRheXMgPj0gOTAgJiYgdGhpcy5zZWxlY3RlZENsaWVudD8udHJhZmZpY0RhdGVSYW5nZSA9PT0gOTApIHtcclxuICAgICAgICAgIC8vICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHtcclxuICAgICAgICAgIC8vICAgICBzdGFydERhdGU6IHRoaXMuZGF5anMoaGVhZGVyRmlsdGVycy5kYXRlLnN0YXJ0RGF0ZSwgXCJZWVlZLU1NLUREXCIpLnN1YnRyYWN0KC05MCwgJ2RheXMnKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpLFxyXG4gICAgICAgICAgLy8gICAgIGVuZERhdGU6IHRoaXMuZGF5anMoaGVhZGVyRmlsdGVycy5kYXRlLmVuZERhdGUsIFwiWVlZWS1NTS1ERFwiKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpLFxyXG4gICAgICAgICAgLy8gICB9O1xyXG4gICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgIC8vICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHtcclxuICAgICAgICAgIC8vICAgICBzdGFydERhdGU6IHRoaXMuZGF5anModGhpcy5zZWxlY3RlZERhdGVSYW5nZS5zdGFydERhdGUsIFwiWVlZWS1NTS1ERFwiKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpLFxyXG4gICAgICAgICAgLy8gICAgIGVuZERhdGU6IHRoaXMuZGF5anModGhpcy5zZWxlY3RlZERhdGVSYW5nZS5lbmREYXRlLCBcIllZWVktTU0tRERcIikuZm9ybWF0KFwiREQtTU0tWVlZWVwiKSxcclxuICAgICAgICAgIC8vICAgfTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9IGhlYWRlckZpbHRlcnMuY2xpZW50O1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50TmFtZSA9IGhlYWRlckZpbHRlcnMuY2xpZW50TmFtZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudHMgPSBoZWFkZXJGaWx0ZXJzLmNsaWVudHM7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZSA9IGhlYWRlckZpbHRlcnMuc3RvcmU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5kYXRlID0gaGVhZGVyRmlsdGVycy5kYXRlO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gaGVhZGVyRmlsdGVycy5zdG9yZXM7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IGhlYWRlckZpbHRlcnMuZ3JvdXA7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IGhlYWRlckZpbHRlcnMubG9jYXRpb247XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5ID0gaGVhZGVyRmlsdGVycy5jb3VudHJ5O1xyXG4gICAgICAgICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMlwiKVxyXG4gICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgbG9hZGVkIGJlZm9yZSBmZXRjaGluZyBzdG9yZXNcclxuIHRoaXMuZ2V0Q291bnRyeSgpOyAgXHJcbiB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gdGhpcy5nZXRHcm91cHMoKTtcclxuICAvLyBGZXRjaCBzdG9yZXMgb25seSBhZnRlciBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgc2V0XHJcbiAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSB0aGlzLmNsaWVudExpc3RbMF07XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID0gIHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50SWQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50TmFtZSA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50TmFtZVxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnRzID0gaGVhZGVyRmlsdGVycy5jbGllbnRzO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZSA9IGhlYWRlckZpbHRlcnMuc3RvcmU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmRhdGUgPSBoZWFkZXJGaWx0ZXJzLmRhdGU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IGhlYWRlckZpbHRlcnMuc3RvcmVzO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IGhlYWRlckZpbHRlcnMuZ3JvdXA7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gaGVhZGVyRmlsdGVycy5sb2NhdGlvbjtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9IGhlYWRlckZpbHRlcnMuY291bnRyeTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgIFwiaGVhZGVyLWZpbHRlcnNcIixcclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSBcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCIzXCIpXHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgIC8vIEVuc3VyZSBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgbG9hZGVkIGJlZm9yZSBmZXRjaGluZyBzdG9yZXNcclxuIHRoaXMuZ2V0Q291bnRyeSgpO1xyXG4gdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgLy8gRmV0Y2ggc3RvcmVzIG9ubHkgYWZ0ZXIgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIHNldFxyXG4gIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0gdGhpcy5jbGllbnRMaXN0WzBdO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPSAgdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnRJZDtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50TmFtZSA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50TmFtZVxyXG4gICAgICAgLy8gRW5zdXJlIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBsb2FkZWQgYmVmb3JlIGZldGNoaW5nIHN0b3Jlc1xyXG4gdGhpcy5nZXRDb3VudHJ5KCk7XHJcbiB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gdGhpcy5nZXRHcm91cHMoKTtcclxuIC8vIEZldGNoIHN0b3JlcyBvbmx5IGFmdGVyIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBzZXRcclxuIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgXCJoZWFkZXItZmlsdGVyc1wiLFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSBcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCI0XCIpXHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIHRoaXMuZ2V0VXNlckluZm8odGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50KTtcclxuXHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcbmdldFVzZXJJbmZvKGNsaWVudDphbnkpe1xyXG4gIGxldCBvYmogPXtcclxuICAgICAgY2xpZW50SWQ6IGNsaWVudCA/IGNsaWVudCA6JydcclxuICB9XHJcbiAgaWYoY2xpZW50KXtcclxuICAgIHRoaXMuYXV0aC5nZXRIZWFkZXJVc2VycyhvYmopLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChlKSA9PiB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICBcInVzZXJzRW1haWwtaW5mb1wiLFxyXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZT8uZGF0YT8udXNlckVtYWlsRGF0YSB8fCBbXSlcclxuICAgICAgICApO1xyXG4gICAgICB9IFxyXG4gICAgfSlcclxuICB9XHJcbn1cclxub25DbGllbnRTZWxlY3QoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgY2xpZW50XHJcbiAgdGhpcy5zZWxlY3RlZENsaWVudCA9IGV2ZW50O1xyXG4gIC8vIENsZWFyIHByZXZpb3VzIGZpbHRlcmVkIGRhdGEgYW5kIHNlbGVjdGlvbnNcclxuICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107XHJcbiAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSBbXTtcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBbXTtcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gW107XHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9IFtdO1xyXG5cclxuXHJcbiAgLy8gRmV0Y2ggaGVhZGVyIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcclxuICBjb25zdCBoZWFkZXJGaWx0ZXJzOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiKTtcclxuICBcclxuICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIGZpbHRlcnMgd2l0aCB0aGUgbmV3IGNsaWVudFxyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50SWQ7XHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50TmFtZSA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50TmFtZTtcclxuICBcclxuICAvLyBSZW1vdmUgb2xkIHN0b3JlLCBncm91cCwgYW5kIGxvY2F0aW9uIGRhdGEgZnJvbSB0aGUgaGVhZGVyIGZpbHRlcnNcclxuICBkZWxldGUgaGVhZGVyRmlsdGVycy5zdG9yZXM7XHJcbiAgZGVsZXRlIGhlYWRlckZpbHRlcnMuZ3JvdXBzO1xyXG4gIGRlbGV0ZSBoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uO1xyXG4gIGRlbGV0ZSBoZWFkZXJGaWx0ZXJzLmNvdW50cnk7XHJcblxyXG4gIFxyXG4gIC8vIEZldGNoIG5ldyBkYXRhIGJhc2VkIG9uIHRoZSBuZXcgY2xpZW50XHJcbiAgdGhpcy5nZXRDb3VudHJ5KCk7XHJcbiAgdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgdGhpcy5nZXRHcm91cHMoKTtcclxuXHJcbiAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSB3aXRoIHRoZSBuZXcgY2xpZW50IHNlbGVjdGlvbiBhbmQgZW1wdHkgZmlsdGVyIGRhdGFcclxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gIC8vIEVtaXQgZGF0YSB0byB0aGUgZ2xvYmFsIHNlcnZpY2VcclxuICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byByZWZsZWN0IFVJIGNoYW5nZXNcclxuICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxufVxyXG5cclxuXHJcblxyXG5yYW5nZXM6YW55ID0ge1xyXG4gIFRvZGF5OiBbZGF5anMoKSwgZGF5anMoKV0sXHJcbiAgWWVzdGVyZGF5OiBbZGF5anMoKS5zdWJ0cmFjdCgxLCAnZGF5cycpLCBkYXlqcygpLnN1YnRyYWN0KDEsICdkYXlzJyldLFxyXG4gICdUaGlzIFdlZWsnOiBbZGF5anMoKS5zdWJ0cmFjdCg3LCAnZGF5cycpLCBkYXlqcygpLnN1YnRyYWN0KDEsICdkYXlzJyldLFxyXG4gICdMYXN0IFdlZWsnOiBbXHJcbiAgICBkYXlqcygpLnN1YnRyYWN0KDE0LCAnZGF5cycpLnN0YXJ0T2YoJ2RheScpLFxyXG4gICAgZGF5anMoKS5zdWJ0cmFjdCg4LCAnZGF5cycpLmVuZE9mKCdkYXknKSxcclxuICBdLFxyXG4gICdUaGlzIE1vbnRoJzogW2RheWpzKCkuc3VidHJhY3QoMzAsICdkYXlzJyksIGRheWpzKCkuc3VidHJhY3QoMSwgJ2RheXMnKV0sXHJcbiAgJ0xhc3QgTW9udGgnOiBbXHJcbiAgICBkYXlqcygpLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJyksXHJcbiAgICBkYXlqcygpLnN1YnRyYWN0KDEsICdtb250aCcpLmVuZE9mKCdtb250aCcpLFxyXG4gIF0sXHJcbn07XHJcblxyXG4gIG9uU3RhcnREYXRlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZSkuaXNWYWxpZCgpKSB7XHJcbiAgICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRDbGllbnQ/LnRyYXhEYXRlUmFuZ2UgPT09IDkwKXtcclxuICAgICAgICAgICAgIHRoaXMuaXNDdXN0b21EYXRlID0gKG06IGRheWpzLkRheWpzKSA9PiB7XHJcbiAgICAgICAgICAgICAgIGNvbnN0IGlzVmFsaWREYXRlID1cclxuICAgICAgICAgICAgICAgICBtID4gdGhpcy5kYXlqcygpIHx8IG0gPiB0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZS5hZGQoOTAsIFwiZGF5c1wiKSk7XHJcbiAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZSA/IFwiaW52YWxpZC1kYXRlXCIgOiBmYWxzZTtcclxuICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc0N1c3RvbURhdGUgPSAobTogZGF5anMuRGF5anMpID0+IHtcclxuICAgICAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9XHJcbiAgICAgICAgICBtID4gdGhpcy5kYXlqcygpIHx8IG0gPiB0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZS5hZGQoMTgwLCBcImRheXNcIikpO1xyXG4gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZSA/IFwiaW52YWxpZC1kYXRlXCIgOiBmYWxzZTtcclxuICAgICAgfTtcclxuICAgICAgICAgfVxyXG4gICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkYXRlY2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudCAmJiBldmVudC5zdGFydERhdGUgJiYgZXZlbnQuZW5kRGF0ZSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5kYXlqcyhldmVudC5zdGFydERhdGUpLmlzVmFsaWQoKSAmJlxyXG4gICAgICAgIHRoaXMuZGF5anMoZXZlbnQuZW5kRGF0ZSkuaXNWYWxpZCgpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2Uuc3RhcnREYXRlID0gZXZlbnQuc3RhcnREYXRlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UuZW5kRGF0ZSA9IGV2ZW50LmVuZERhdGU7XHJcbiAgICAgICAgdmFyIGRhdGV0aW1lID0ge1xyXG4gICAgICAgICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZSwgXCJERC1NTS1ZWVlZXCIpLmZvcm1hdChcclxuICAgICAgICAgICAgXCJZWVlZLU1NLUREXCJcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBlbmREYXRlOiB0aGlzLmRheWpzKGV2ZW50LmVuZERhdGUsIFwiREQtTU0tWVlZWVwiKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZGF0ZSA9IGRhdGV0aW1lO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgXCJoZWFkZXItZmlsdGVyc1wiLFxyXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcclxuICAgICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgICAgfVxyXG4gICAgfSBcclxuICB9XHJcbiAgb3BlbmRyb3Bkb3duKGU6TW91c2VFdmVudCkge1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuT3BlbmRyb3Bkb3duID0gIXRoaXMuT3BlbmRyb3Bkb3duO1xyXG4gIH1cclxuICBnZXRMb2NhdGlvbnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNcclxuICAgIC5maWx0ZXIoY291bnRyeSA9PiBjb3VudHJ5LmNoZWNrZWQpXHJcbiAgICAubWFwKGNvdW50cnkgPT4gY291bnRyeS5jb3VudHJ5KTsgIFxyXG4gICAgLy8gY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIik7XHJcbiAgICBsZXQgb2JqID17XHJcbiAgICAgY2xpZW50SWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA/IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA6dGhpcy51c2Vycy5jbGllbnRJZCxcclxuICAgICBjb3VudHJ5LFxyXG4gICAgIGNpdHk6IFtdLFxyXG4gICAgIGdyb3VwOiBbXSxcclxuICAgIH1cclxuICAgIHRoaXMuYXV0aC5nZXRMb2NhdGlvbihvYmopLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBjaXR5TGlzdCA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzPy5sb2NhdGlvbj8uZmlsdGVyKChsb2NhdGlvbjphbnkpID0+IGxvY2F0aW9uLmNoZWNrZWQpLm1hcCgobG9jOmFueSkgPT4gbG9jLmNpdHkpO1xyXG4gICAgICAgIC8vIE1hcCB0aGUgZmV0Y2hlZCBsb2NhdGlvbnMgd2l0aCBkZWZhdWx0IHVuY2hlY2tlZCBzdGF0ZVxyXG4gICAgICAgIHRoaXMubG9jYXRpb25zID0gcmVzPy5kYXRhPy5sb2NhdGlvbkRhdGEubWFwKChjaXR5OiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBjaXR5OiBjaXR5LmNpdHksXHJcbiAgICAgICAgICAvLyBjaGVja2VkOiBjaXR5TGlzdD8ubGVuZ3RoID8gY2l0eUxpc3QuaW5jbHVkZXMoY2l0eS5jaXR5KSA6IHRydWUsXHJcbiAgICAgICAgICBjaGVja2VkOiBjaXR5TGlzdD8uaW5jbHVkZXMoY2l0eS5jaXR5KSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICB9KSk7XHJcbiAgXHJcbiAgICAgICAgLy8gU3luYyB0aGUgZmV0Y2hlZCBsb2NhdGlvbnMgd2l0aCBhbnkgc3RvcmVkIGNoZWNrZWQgdmFsdWVzIGluIGxvY2FsU3RvcmFnZVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uKSkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25zLm1hcChsb2NhdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRMb2NhdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uLmZpbmQoKGxvYzogYW55KSA9PiBsb2MuY2l0eSA9PT0gbG9jYXRpb24uY2l0eSk7XHJcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVkTG9jYXRpb24gPyB7IC4uLmxvY2F0aW9uLCBjaGVja2VkOiBtYXRjaGVkTG9jYXRpb24uY2hlY2tlZCB9IDogbG9jYXRpb247XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodGhpcy5zZWFyY2hMb2NhdGlvblRleHQpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5maWx0ZXIoKGxvY2F0aW9uOmFueSkgPT4gbG9jYXRpb24uY2l0eS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0LnRvTG93ZXJDYXNlKCkpKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZWxlY3RlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25zLmZpbHRlcigobG9jYXRpb24pID0+IGxvY2F0aW9uLmNoZWNrZWQpLm1hcCgobG9jYXRpb24pID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RvcmUoKTsgLy8gRmV0Y2ggc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgICAgICAgfSwxMDAwKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIXNlbGVjdGVkTG9jYXRpb25zLmxlbmd0aCAmJiBjb3VudHJ5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRHcm91cHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCBsb2NhdGlvbnNcIiwgZXJyKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuICBpc0FsbExvY2F0aW9uc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMuZXZlcnkobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCk7XHJcblxyXG4gIH1cclxuICBcclxuICBzZWxlY3RlZExvY2F0aW9uc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25MYWJlbCA9IHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0Lmxlbmd0aCA/IHRoaXMubG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpIDogIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcihsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAobG9jYXRpb24gPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gJydcclxuICAgICAgOiBzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGggPT09IDFcclxuICAgICAgPyBzZWxlY3RlZExvY2F0aW9uc1swXVxyXG4gICAgICA6IGAke3NlbGVjdGVkTG9jYXRpb25zLmxlbmd0aH0gbG9jYXRpb25zYDtcclxuICB9XHJcblxyXG4gIHJlbW92ZUxvY2F0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5SZXNldCgpO1xyXG4gIH1cclxuICBcclxuICBnZXRHcm91cHMoKTogdm9pZCB7ICBcclxuICAgIGNvbnN0IGNvdW50cnkgPSB0aGlzLmNvdW50cmllc1xyXG4gICAgICAuZmlsdGVyKGNvdW50cnkgPT4gY291bnRyeS5jaGVja2VkKVxyXG4gICAgICAubWFwKGNvdW50cnkgPT4gY291bnRyeS5jb3VudHJ5KTsgIFxyXG4gICAgbGV0IGNpdHk7XHJcbiAgICBjaXR5ID0gdGhpcy5sb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcihsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaGVja2VkKVxyXG4gICAgICAubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpO1xyXG5cclxuICAgICAgaWYoIWNpdHkubGVuZ3RoICYmIGNvdW50cnkubGVuZ3RoKSB7XHJcbiAgICAgICAgY2l0eSA9IHRoaXMubG9jYXRpb25zLm1hcCgobG9jKSA9PiBsb2MuY2l0eSk7XHJcbiAgICAgIH1cclxuICAgIGNvbnN0IG9iaiA9IHsgY291bnRyeSxjaXR5LGNsaWVudElkOnRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA/IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA6dGhpcy51c2Vycy5jbGllbnRJZCxncm91cDpbXSB9O1xyXG4gICAgdGhpcy5hdXRoLmdldEdyb3VwcyhvYmopLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBjaGVja2VkR3JvdXAgPSB0aGlzLnNlbGVjdGVkRmlsdGVycz8uZ3JvdXA/LmZpbHRlcigoZ3JvdXA6YW55KSA9PiBncm91cC5jaGVja2VkKS5tYXAoKGdyb3VwOmFueSkgPT4gZ3JvdXAuZ3JvdXBOYW1lKTtcclxuICAgICAgICBjb25zdCBjb21iaW5lZEdyb3VwcyA9IHJlcz8uZGF0YT8uZ3JvdXBEYXRhPy5tYXAoKGdyb3VwTmFtZTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgZ3JvdXBOYW1lOiBncm91cE5hbWUuZ3JvdXBOYW1lLFxyXG4gICAgICAgICAgY2hlY2tlZDogY2hlY2tlZEdyb3VwPy5pbmNsdWRlcyhncm91cE5hbWUuZ3JvdXBOYW1lKSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICAgIC8vIGNoZWNrZWQ6IGNoZWNrZWRHcm91cD8ubGVuZ3RoID8gY2hlY2tlZEdyb3VwLmluY2x1ZGVzKGdyb3VwTmFtZS5ncm91cE5hbWUpIDogdHJ1ZSxcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5ncm91cHNEYXRhID0gY29tYmluZWRHcm91cHM7XHJcbiAgICAgICAgaWYodGhpcy5zZWFyY2hHcm91cFRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gY29tYmluZWRHcm91cHMuZmlsdGVyKChpdGVtOmFueSkgPT4gaXRlbS5ncm91cE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaEdyb3VwVGV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBjb21iaW5lZEdyb3VwcztcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgLy8gQXV0by1mZXRjaCBzdG9yZXMgd2hlbiBncm91cHMgYXJlIHNlbGVjdGVkXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cHMgPSB0aGlzLmdyb3Vwc0RhdGEuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAuY2hlY2tlZCkubWFwKChncm91cCkgPT4gZ3JvdXAuZ3JvdXBOYW1lKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRHcm91cHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLmdldFN0b3JlKCk7IC8vIEZldGNoIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgICAgIH0sMTAwMClcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCBncm91cHNcIiwgZXJyKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRHJvcGRvd24odHlwZTogJ2NvdW50cnknIHwgJ2xvY2F0aW9uJyB8ICdncm91cCcgfCAnc3RvcmUnKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kcm9wZG93bk9wZW4gPT09IHR5cGUpIHtcclxuICAgICAgLy8gSWYgdGhlIGRyb3Bkb3duIGlzIG9wZW4sIGNsb3NlIGl0IGFuZCBhdm9pZCByZXNldHRpbmcgdGhlIHNlbGVjdGVkIHZhbHVlcyB1bm5lY2Vzc2FyaWx5XHJcbiAgICAgIHRoaXMuZHJvcGRvd25PcGVuID0gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE9wZW4gdGhlIHNwZWNpZmljIGRyb3Bkb3duIGFuZCBoYW5kbGUgZGF0YSBmZXRjaGluZyBvbmx5IGlmIG5lY2Vzc2FyeVxyXG4gICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IHR5cGU7XHJcblxyXG4gICAgICBpZiAodHlwZSA9PT0gJ2NvdW50cnknKSB7XHJcbiAgICAgICAgLy8gRmV0Y2ggY291bnRyaWVzIG9ubHkgaWYgbm90IGFscmVhZHkgZmV0Y2hlZCBhbmQgbm8gc2VhcmNoIHRleHQgZXhpc3RzXHJcbiAgICAgICAgaWYgKCghdGhpcy5maWx0ZXJlZENvdW50cmllcyB8fCB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmxlbmd0aCA9PT0gMCkgJiYgIXRoaXMuc2VhcmNoQ291bnRyeVRleHQudHJpbSgpKSB7XHJcbiAgICAgICAgICB0aGlzLmdldENvdW50cnkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgaWYgKHR5cGUgPT09ICdncm91cCcpIHtcclxuICAgICAgICAvLyBGZXRjaCBncm91cHMgb25seSBpZiB0aGVyZSBhcmUgc2VsZWN0ZWQgY2l0aWVzIGFuZCBubyBhY3RpdmUgc2VhcmNoIHRleHRcclxuICAgICAgICBjb25zdCBzZWxlY3RlZENpdGllcyA9IHRoaXMubG9jYXRpb25zXHJcbiAgICAgICAgICAuZmlsdGVyKChsb2NhdGlvbikgPT4gbG9jYXRpb24uY2hlY2tlZClcclxuICAgICAgICAgIC5tYXAoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICBcclxuICAgICAgICAvLyBGZXRjaCBncm91cHMgb25seSBpZiBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkLCBubyBzZWFyY2ggdGV4dCBleGlzdHMsIGFuZCBkcm9wZG93biBpcyBvcGVuZWRcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMubGVuZ3RoID4gMCB8fCAoc2VsZWN0ZWRDaXRpZXMubGVuZ3RoID4gMCAmJiAhdGhpcy5zZWFyY2hHcm91cFRleHQudHJpbSgpKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdOyAvLyBDbGVhciBncm91cHMgaWYgbm8gbG9jYXRpb25zIGFyZSBzZWxlY3RlZFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGUgPT09ICdzdG9yZScpIHtcclxuICAgICAgLy8gRmV0Y2ggc3RvcmVzIG9ubHkgaWYgbm90IGFscmVhZHkgZmV0Y2hlZCBhbmQgbm8gc2VhcmNoIHRleHQgaXMgYWN0aXZlXHJcbiAgICAgIGlmICgoIXRoaXMuZmlsdGVyZWRTdG9yZXMgfHwgdGhpcy5maWx0ZXJlZFN0b3Jlcy5sZW5ndGggPT09IDApICYmICF0aGlzLnNlYXJjaFN0b3JlVGV4dC50cmltKCkpIHtcclxuICAgICAgICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIH0gXHJcbiAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIFxyXG4gIGhhbmRsZUdyb3VwRHJvcGRvd25DbGljaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRyb3Bkb3duT3BlbiA9PT0gJ2dyb3VwJykge1xyXG4gICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRHcm91cHMoKTtcclxuICAgIH1cclxuICAgIHRoaXMudG9nZ2xlRHJvcGRvd24oJ2dyb3VwJyk7XHJcbiAgfVxyXG5cclxuICByZXNldFNlbGVjdGVkR3JvdXBzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJlZEdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gKGdyb3VwLmNoZWNrZWQgPSBmYWxzZSkpO1xyXG4gICAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSBcIlwiO1xyXG4gIH1cclxuICBzZWxlY3RlZEdyb3Vwc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZ3JvdXBMYWJlbCA9IHRoaXMuc2VhcmNoR3JvdXBUZXh0Lmxlbmd0aCA/IHRoaXMuZ3JvdXBzRGF0YS5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKSA6IHRoaXMuZmlsdGVyZWRHcm91cHMuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAuY2hlY2tlZCk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRHcm91cHMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gXCJcIlxyXG4gICAgICA6IHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA9PT0gMVxyXG4gICAgICA/IHNlbGVjdGVkR3JvdXBzWzBdLmdyb3VwTmFtZVxyXG4gICAgICA6IGAke3NlbGVjdGVkR3JvdXBzLmxlbmd0aH0gQ2x1c3RlcnNgO1xyXG4gIH1cclxuICByZW1vdmVHcm91cCgpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVzZXQoKTtcclxuICAgXHJcbiAgfVxyXG4gIFxyXG5cclxuICBpc0FsbEdyb3Vwc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgXHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZEdyb3Vwcy5sZW5ndGggPyB0aGlzLmZpbHRlcmVkR3JvdXBzLmV2ZXJ5KChncm91cCkgPT4gZ3JvdXAuY2hlY2tlZCkgOiBmYWxzZTtcclxuICB9XHJcbiAgICAgICAgXHJcbiAgZ2V0U3RvcmUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNcclxuICAgIC5maWx0ZXIoY291bnRyeSA9PiBjb3VudHJ5LmNoZWNrZWQpXHJcbiAgICAubWFwKGNvdW50cnkgPT4gY291bnRyeS5jb3VudHJ5KTtcclxuICAgIGNvbnN0IGNpdHkgPSB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAobG9jYXRpb24gPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzRGF0YVxyXG4gICAgICAuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoZ3JvdXAgPT4gZ3JvdXAuZ3JvdXBOYW1lKTtcclxuICBcclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIGNvdW50cnksXHJcbiAgICAgIGNpdHksXHJcbiAgICAgIGNsdXN0ZXJzOiBncm91cCxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMudXNlcnMuY2xpZW50SWQgfHwgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50XHJcbiAgICB9O1xyXG4gIFxyXG4gICAgdGhpcy5hdXRoLmdldEhlYWRlclN0b3JlcyhkYXRhKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIC8vIEluaXRpYWxpemUgc3RvcmVzIGZyb20gQVBJIHJlc3BvbnNlXHJcbiAgICAgICAgICB0aGlzLnN0b3JlcyA9IHJlcy5kYXRhLnN0b3Jlc0RhdGE7XHJcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcHJldmlvdXNseSBzZWxlY3RlZCBzdG9yZXNcclxuICAgICAgICAgIGNvbnN0IGNoZWNrZWRTdG9yZUlkcyA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzPy5zdG9yZXNcclxuICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMuZmlsdGVyKChzdG9yZTphbnkpID0+IHN0b3JlLmNoZWNrZWQpLm1hcCgoc3RvcmU6YW55KSA9PiBzdG9yZS5zdG9yZUlkKVxyXG4gICAgICAgICAgICA6IFtdO1xyXG4gICAgICAgICAgLy8gU3luYyB0aGUgYGNoZWNrZWRgIHN0YXRlXHJcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHtcclxuICAgICAgICAgICAgc3RvcmUuY2hlY2tlZCA9IGNoZWNrZWRTdG9yZUlkcy5sZW5ndGhcclxuICAgICAgICAgICAgICA/IGNoZWNrZWRTdG9yZUlkcy5pbmNsdWRlcyhzdG9yZS5zdG9yZUlkKSAvLyBVc2UgcHJldmlvdXMgc2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgOiB0cnVlOyAvLyBEZWZhdWx0IHRvIHRydWUgaWYgbm8gcHJldmlvdXMgc2VsZWN0aW9uXHJcbiAgICAgICAgICB9KTtcclxuICBcclxuICAgICAgICAgIC8vIEFwcGx5IHNlYXJjaCBmaWx0ZXIgaWYgc2VhcmNoIHRleHQgaXMgcHJlc2VudFxyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoU3RvcmVUZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXMuZmlsdGVyKHN0b3JlID0+XHJcbiAgICAgICAgICAgICAgc3RvcmUuc3RvcmVOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hTdG9yZVRleHQudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbLi4udGhpcy5zdG9yZXNdO1xyXG4gICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgLy8gVXBkYXRlIGBzZWxlY3RlZEZpbHRlcnMuc3RvcmVzYCB0byByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXRlXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSB0aGlzLmZpbHRlcmVkU3RvcmVzLm1hcChzdG9yZSA9PiAoe1xyXG4gICAgICAgICAgICBzdG9yZUlkOiBzdG9yZS5zdG9yZUlkLFxyXG4gICAgICAgICAgICBzdG9yZU5hbWU6IHN0b3JlLnN0b3JlTmFtZSxcclxuICAgICAgICAgICAgY2hlY2tlZDogc3RvcmUuY2hlY2tlZFxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9IGNvdW50cnk7XHJcbiAgXHJcbiAgICAgICAgICAvLyBTYXZlIHVwZGF0ZWQgZmlsdGVycyB0byBsb2NhbFN0b3JhZ2VcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgXHJcbiAgICAgICAgICAvLyBUcmlnZ2VyIFVJIGNoYW5nZSBkZXRlY3Rpb25cclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBIYW5kbGUgZW1wdHkgb3IgZXJyb3IgcmVzcG9uc2VcclxuICAgICAgICAgIHRoaXMuY2xlYXJTdG9yZXNTdGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIHN0b3Jlc1wiLCBlcnIpO1xyXG4gICAgICAgIHRoaXMuY2xlYXJTdG9yZXNTdGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgLy8gQ2xlYXIgc3RvcmVzIHN0YXRlIGFuZCByZXNldCBmaWx0ZXJzXHJcbiAgcHJpdmF0ZSBjbGVhclN0b3Jlc1N0YXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9yZXMgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IFtdO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICB9XHJcbiAgXHJcbiAgcmVzZXRTZWxlY3RlZFN0b3JlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMuZm9yRWFjaCgoc3RvcmUpID0+IChzdG9yZS5jaGVja2VkID0gZmFsc2UpKTtcclxuICAgIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gXCJcIjtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkU3RvcmVzID0gdGhpcy5zZWFyY2hTdG9yZVRleHQubGVuZ3RoID8gdGhpcy5zdG9yZXMuZmlsdGVyKChzdG9yZSkgPT4gc3RvcmUuY2hlY2tlZCkgOiB0aGlzLmZpbHRlcmVkU3RvcmVzLmZpbHRlcigoc3RvcmUpID0+IHN0b3JlLmNoZWNrZWQpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/IFwiMCBTdG9yZXNcIlxyXG4gICAgICA6IHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMVxyXG4gICAgICA/IHNlbGVjdGVkU3RvcmVzWzBdLnN0b3JlTmFtZVxyXG4gICAgICA6IGAke3NlbGVjdGVkU3RvcmVzLmxlbmd0aH0gU3RvcmVzYDtcclxuICB9XHJcblxyXG4gIGlzQWxsU3RvcmVzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZFN0b3Jlcy5sZW5ndGggPiAwICYmIHRoaXMuZmlsdGVyZWRTdG9yZXMuZXZlcnkoc3RvcmUgPT4gc3RvcmUuY2hlY2tlZCk7XHJcbiAgfVxyXG4vLyBNZXRob2QgdG8gaGFuZGxlIGRyb3Bkb3duIGl0ZW0gc2VsZWN0aW9uXHJcbnVwZGF0ZVNlbGVjdGVkU3RvcmVzKCk6IHZvaWQge1xyXG4gIHRoaXMuZmlsdGVyZWRTdG9yZXMuZm9yRWFjaChzdG9yZSA9PiB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZFN0b3JlID0gdGhpcy5zdG9yZXMuZmluZEluZGV4KGZTdG9yZSA9PiBmU3RvcmUuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk7XHJcbiAgICBpZiAoZmlsdGVyZWRTdG9yZSAhPSAtMSkge1xyXG4gICAgICB0aGlzLnN0b3Jlc1tmaWx0ZXJlZFN0b3JlXS5jaGVja2VkID0gc3RvcmUuY2hlY2tlZDsgLy8gU3luYyB0aGUgY2hlY2tlZCBzdGF0ZSB3aXRoIGZ1bGwgc3RvcmUgbGlzdFxyXG4gICAgfVxyXG4gIH0pOyAgXHJcbiAgLy8gVXBkYXRlIHNlbGVjdGVkRmlsdGVycyBiYXNlZCBvbiB0aGUgY3VycmVudCBzdG9yZSBzZWxlY3Rpb25cclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSB0aGlzLnN0b3Jlcy5maWx0ZXIoc3RvcmUgPT4gc3RvcmUuY2hlY2tlZCk7XHJcblxyXG4gIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2Ugd2l0aCB0aGUgbGF0ZXN0IHNlbGVjdGlvblxyXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcblxyXG4gIC8vIEVtaXQgdXBkYXRlZCBmaWx0ZXJzIHZpYSBzZXJ2aWNlXHJcbiAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuXHJcbiAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGlmIG5lY2Vzc2FyeVxyXG4gIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG59XHJcbiAgdG9nZ2xlU2VsZWN0QWxsTG9jYXRpb25zKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xyXG4gICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucy5mb3JFYWNoKChsb2NhdGlvbikgPT4gKGxvY2F0aW9uLmNoZWNrZWQgPSBpc0NoZWNrZWQpKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRMb2NhdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdEFsbFN0b3JlcyhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgXHJcbiAgICAvLyBBcHBseSB0aGUgc2VsZWN0aW9uIHRvIGJvdGggZmlsdGVyZWQgYW5kIGZ1bGwgbGlzdCBvZiBzdG9yZXNcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMuZm9yRWFjaChzdG9yZSA9PiBzdG9yZS5jaGVja2VkID0gY2hlY2tlZCk7XHJcbiAgICB0aGlzLnN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHtcclxuICAgICAgY29uc3QgZmlsdGVyZWRTdG9yZSA9IHRoaXMuZmlsdGVyZWRTdG9yZXMuZmluZChmU3RvcmUgPT4gZlN0b3JlLnN0b3JlSWQgPT09IHN0b3JlLnN0b3JlSWQpO1xyXG4gICAgICBpZiAoZmlsdGVyZWRTdG9yZSkge1xyXG4gICAgICAgIHN0b3JlLmNoZWNrZWQgPSBjaGVja2VkOyAvLyBTeW5jIHRoZSBjaGVja2VkIHN0YXRlIHdpdGggZnVsbCBzdG9yZSBsaXN0XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIFxyXG4gICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCBzdG9yZXMgYW5kIHBlcnNpc3QgdGhlIHNlbGVjdGlvblxyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZFN0b3JlcygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0ZWRMb2NhdGlvbnMoKTogdm9pZCB7XHJcbiAgICAvLyBXaGVuIGxvY2F0aW9ucyBhcmUgc2VsZWN0ZWQsIGZldGNoIHRoZSByZWxhdGVkIGdyb3Vwc1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRDaXRpZXMgPSB0aGlzLmZpbHRlcmVkTG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKVxyXG4gICAgICAubWFwKChsb2NhdGlvbikgPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uOmFueSkgPT4ge1xyXG4gICAgICBsZXQgZmluZExvY2F0aW9uSW5kZXggPSB0aGlzLmxvY2F0aW9ucy5maW5kSW5kZXgoKGxvYzphbnkpID0+IGxvYy5jaXR5ID09IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgICBpZihmaW5kTG9jYXRpb25JbmRleCAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25zW2ZpbmRMb2NhdGlvbkluZGV4XS5jaGVja2VkID0gbG9jYXRpb24uY2hlY2tlZDtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGlmIChzZWxlY3RlZENpdGllcy5sZW5ndGggPiAwIHx8ICFzZWxlY3RlZENpdGllcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID1bXTtcclxuICAgICAgdGhpcy5ncm91cHNEYXRhID1bXVxyXG4gICAgICB0aGlzLmdldEdyb3VwcygpOyAvLyBGZXRjaCBncm91cHMgYmFzZWQgb24gc2VsZWN0ZWQgY2l0aWVzXHJcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBzZWxlY3RlZCBncm91cHMsIGZldGNoIHRoZSBzdG9yZXMgYmFzZWQgb24gc2VsZWN0ZWQgZ3JvdXBzXHJcbiAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSB0aGlzLmxvY2F0aW9ucztcclxuICAgICBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBbXTsgLy8gQ2xlYXIgZ3JvdXBzIGlmIG5vIGxvY2F0aW9ucyBhcmUgc2VsZWN0ZWRcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSBbXTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTsgLy8gUmVzZXQgc3RvcmVzIGFzIHdlbGxcclxuICAgIHRoaXMuc2VhcmNoR3JvdXBUZXh0ID0gJyc7XHJcbiAgICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9ICcnO1xyXG4gICAgLy8gdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdEFsbEdyb3VwcyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgIHRoaXMuZmlsdGVyZWRHcm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IChncm91cC5jaGVja2VkID0gaXNDaGVja2VkKSk7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkR3JvdXBzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZEdyb3VwcygpOiB2b2lkIHtcclxuICAgIC8vIEZldGNoIHRoZSByZWxldmFudCBzdG9yZXMgYWZ0ZXIgZ3JvdXBzIGFyZSBzZWxlY3RlZFxyXG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cHMgPSB0aGlzLmZpbHRlcmVkR3JvdXBzXHJcbiAgICAgIC5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKVxyXG4gICAgICAubWFwKChncm91cCkgPT4gZ3JvdXAuZ3JvdXBOYW1lKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzLmZvckVhY2goKGdyb3VwOmFueSkgPT4ge1xyXG4gICAgICBsZXQgZmluZEdyb3VwSW5kZXggPSB0aGlzLmdyb3Vwc0RhdGEuZmluZEluZGV4KChpdGVtOmFueSkgPT4gaXRlbS5ncm91cE5hbWUgPT0gZ3JvdXAuZ3JvdXBOYW1lKTtcclxuICAgICAgaWYoZmluZEdyb3VwSW5kZXggIT0gLTEpIHtcclxuICAgICAgICB0aGlzLmdyb3Vwc0RhdGFbZmluZEdyb3VwSW5kZXhdLmNoZWNrZWQgPSBncm91cC5jaGVja2VkO1xyXG4gICAgICB9XHJcbiAgICB9KSBcclxuICAgIGlmIChzZWxlY3RlZEdyb3Vwcy5sZW5ndGggPiAwIHx8ICFzZWxlY3RlZEdyb3Vwcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID1bXTtcclxuICAgICAgLy8gSWYgdGhlcmUgYXJlIHNlbGVjdGVkIGdyb3VwcywgZmV0Y2ggdGhlIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IHRoaXMuZ3JvdXBzRGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIElmIG5vIGdyb3VwcyBhcmUgc2VsZWN0ZWQsIGNsZWFyIHRoZSBzdG9yZXMgbGlzdFxyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gW107XHJcbiAgICAgIFxyXG4gICAgICAvLyBBbHNvLCB1cGRhdGUgbG9jYWxTdG9yYWdlIHRvIHJlZmxlY3QgdGhlIGNsZWFyZWQgc3RvcmUgc2VsZWN0aW9uXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IFtdO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gIFxyXG4gICAgICAvLyBFbWl0IGRhdGEgdmlhIHNlcnZpY2VcclxuICAgICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIH1cclxuICBcclxuICAgIC8vIENsZWFyIHRoZSBzZWFyY2ggc3RvcmUgdGV4dCB3aGVuIGdyb3VwcyBhcmUgdXBkYXRlZFxyXG4gICAgdGhpcy5zZWFyY2hTdG9yZVRleHQgPSAnJztcclxuICB9XHJcbiAgXHJcblxyXG4gIFJlc2V0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgIC8vIENsZWFyIHNlbGVjdGVkIGdyb3Vwcywgc3RvcmVzLCBhbmQgbG9jYXRpb25zXHJcbiAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IFtdXHJcbiAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdO1xyXG4gIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTtcclxuICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gW107IC8vIFJlc2V0IGxvY2F0aW9ucyBhcyB3ZWxsXHJcbnRoaXMubG9jYXRpb25zID1bXTt0aGlzLmdyb3Vwc0RhdGEgPVtdOyB0aGlzLnN0b3JlcyA9W107XHJcbiAgLy8gQ2xlYXIgc2VhcmNoIGlucHV0IGZpZWxkc1xyXG4gIHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0ID0gXCJcIjtcclxuICB0aGlzLnNlYXJjaEdyb3VwVGV4dCA9IFwiXCI7XHJcbiAgdGhpcy5zZWFyY2hTdG9yZVRleHQgPSBcIlwiO1xyXG50aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPVtdO1xyXG50aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9W107XHJcbnRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID1bXTtcclxudGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9W107XHJcblxyXG4gXHJcbiAgLy8gRmV0Y2ggbG9jYXRpb25zLCBncm91cHMsIGFuZCBzdG9yZXMgYWdhaW5cclxuICB0aGlzLmdldENvdW50cnkoKTtcclxuICB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gIHRoaXMuZ2V0U3RvcmUoKTtcclxuICB0aGlzLmdldEdyb3VwcygpO1xyXG4gIC8vIFJlc2V0IHRoZSBmaWx0ZXJzIGluIHNlbGVjdGVkRmlsdGVyc1xyXG5cclxuXHJcbiAgLy8gLy8gT25jZSBzdG9yZXMgYXJlIGZldGNoZWQsIG1hcmsgYWxsIGFzIGNoZWNrZWRcclxuICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAvLyAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAvLyAgICAgLi4uc3RvcmUsXHJcbiAgLy8gICAgIGNoZWNrZWQ6IHRydWUgIC8vIE1hcmsgYWxsIHN0b3JlcyBhcyBjaGVja2VkXHJcbiAgLy8gICB9KSk7XHJcblxyXG4gIC8vICAgLy8gU3luYyBzZWxlY3RlZEZpbHRlcnMgd2l0aCB0aGUgdXBkYXRlZCBzdG9yZSBzdGF0ZVxyXG4gIC8vICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAvLyAgICAgLi4uc3RvcmUsXHJcbiAgLy8gICAgIGNoZWNrZWQ6IHRydWVcclxuICAvLyAgIH0pKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIHdpdGggdGhlIGxhdGVzdCBzZWxlY3RlZEZpbHRlcnNcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcclxuICAgIC8vIEVtaXQgdGhlIHJlc2V0IGZpbHRlcnMgdG8gdXBkYXRlIG90aGVyIGNvbXBvbmVudHMgaWYgbmVlZGVkXHJcbiAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgLy8gQWRkaW5nIGEgc2xpZ2h0IGRlbGF5IHRvIGVuc3VyZSBzdG9yZXMgYXJlIGZldGNoZWQgZmlyc3RcclxuIFxyXG4gIFxyXG4gICAgLy8gQ2xvc2UgZHJvcGRvd24gYWZ0ZXIgcmVzZXQgaWYgbmVjZXNzYXJ5XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIH0sMTAwKVxyXG4gIH1cclxuICBcclxuICBcclxuICBcclxuXHJcbiAgZmlsdGVyTG9jYXRpb25zKCk6IHZvaWQgeyAgICBcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBkdXJpbmcgZmlsdGVyaW5nXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAgIC5tYXAobG9jYXRpb24gPT4gKHtcclxuICAgICAgICAgIC4uLmxvY2F0aW9uLFxyXG4gICAgICAgICAgY2hlY2tlZDogdGhpcy5maWx0ZXJlZExvY2F0aW9ucy5maW5kKGwgPT4gbC5jaXR5ID09PSBsb2NhdGlvbi5jaXR5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIobG9jYXRpb24gPT5cclxuICAgICAgICAgIGxvY2F0aW9uPy5jaXR5Py50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNoZWNrZWQgc3RhdGUgd2hlbiBzZWFyY2ggdGV4dCBpcyBjbGVhcmVkXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5tYXAobG9jYXRpb24gPT4gKHtcclxuICAgICAgICAuLi5sb2NhdGlvbixcclxuICAgICAgICBjaGVja2VkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbi5maW5kKChsOmFueSkgPT4gbC5jaXR5ID09PSBsb2NhdGlvbi5jaXR5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG5cclxuICBmaWx0ZXJHcm91cHMoKTogdm9pZCB7ICBcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaEdyb3VwVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBkdXJpbmcgZmlsdGVyaW5nXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSB0aGlzLmdyb3Vwc0RhdGFcclxuICAgICAgICAubWFwKGdyb3VwID0+ICh7XHJcbiAgICAgICAgICAuLi5ncm91cCxcclxuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuZmlsdGVyZWRHcm91cHMuZmluZChnID0+IGcuZ3JvdXBOYW1lID09PSBncm91cC5ncm91cE5hbWUpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgLmZpbHRlcihncm91cCA9PlxyXG4gICAgICAgICAgZ3JvdXA/Lmdyb3VwTmFtZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjaGVja2VkIHN0YXRlIHdoZW4gc2VhcmNoIHRleHQgaXMgY2xlYXJlZFxyXG4gICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gdGhpcy5ncm91cHNEYXRhLm1hcChncm91cCA9PiAoe1xyXG4gICAgICAgIC4uLmdyb3VwLFxyXG4gICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwLmZpbmQoKGc6YW55KSA9PiBnLmdyb3VwTmFtZSA9PT0gZ3JvdXAuZ3JvdXBOYW1lKT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIFxyXG4gIGZpbHRlclN0b3JlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaFN0b3JlVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgLy8gUHJlc2VydmUgY2hlY2tlZCBzdGF0ZXMgZHVyaW5nIGZpbHRlcmluZ1xyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgLy8gRmlsdGVyIGJhc2VkIG9uIHNlYXJjaCB0ZXh0IHdoaWxlIHByZXNlcnZpbmcgY2hlY2tlZCBzdGF0ZVxyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXNcclxuICAgICAgICAubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdG9yZSBpcyBhbHJlYWR5IGNoZWNrZWQgaW4gZmlsdGVyZWRTdG9yZXMsIGZhbGxiYWNrIHRvIG9yaWdpbmFsIHN0b3JlcycgY2hlY2tlZCBzdGF0ZVxyXG4gICAgICAgICAgY2hlY2tlZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzLmZpbmQoKHM6IGFueSkgPT4gcy5zdG9yZUlkID09PSBzdG9yZS5zdG9yZUlkKT8uY2hlY2tlZCB8fCBzdG9yZS5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgLmZpbHRlcihzdG9yZSA9PiBzdG9yZS5zdG9yZU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBXaGVuIHRoZSBzZWFyY2ggdGV4dCBpcyBjbGVhcmVkLCByZXN0b3JlIHRoZSBvcmlnaW5hbCBsaXN0IHdpdGggcHJlc2VydmVkIGNoZWNrZWQgc3RhdGVzXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgZmlsdGVyc1xyXG4gICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3Jlcy5maW5kKChzOiBhbnkpID0+IHMuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk/LmNoZWNrZWQgfHwgc3RvcmUuY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZURyb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kcm9wZG93bk9wZW4gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OmNsaWNrXCIsIFtcIiRldmVudFwiXSlcclxuICBjbGlja091dHNpZGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFxyXG4gICAgICBcIi5kcm9wZG93bi1jb250YWluZXJcIlxyXG4gICAgKTtcclxuICAgIGNvbnN0IGNsaWNrZWRvdXRTaWRlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcclxuICAgICAgXCIuZHJvcGRvd24yXCJcclxuICAgICk7XHJcbiAgICBpZiAoIWNsaWNrZWRJbnNpZGUpIHtcclxuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XHJcbiAgICB9XHJcbiAgICBpZighY2xpY2tlZG91dFNpZGUpIHtcclxuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duMSgpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8vIGdldENvdW50cnkoKTogdm9pZCB7XHJcbiAgLy8gICAvLyBjb25zdCBoZWFkZXJGaWx0ZXJzOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiKTtcclxuICAvLyAgIGxldCBvYmogPXtcclxuICAvLyAgICBjbGllbnRJZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID8gdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50IDp0aGlzLnVzZXJzLmNsaWVudElkLFxyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5hdXRoLmdldENvdW50cnkob2JqKS5zdWJzY3JpYmUoe1xyXG4gIC8vICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAvLyAgICAgICBsZXQgY291bnRyeUxpc3QgPSB0aGlzLnNlbGVjdGVkRmlsdGVycz8uY291bnRyeT8uZmlsdGVyKChjb3VudHJ5OmFueSkgPT4gY291bnRyeS5jaGVja2VkKS5tYXAoKGxvYzphbnkpID0+IGxvYy5hbGxDb3VudHJ5KTtcclxuICAvLyAgICAgICAvLyBNYXAgdGhlIGZldGNoZWQgY291bnRyaWVzIHdpdGggZGVmYXVsdCB1bmNoZWNrZWQgc3RhdGVcclxuICAvLyAgICAgICB0aGlzLmNvdW50aXJlcyA9IHJlcz8uZGF0YT8uY291bnRyeURhdGEubWFwKChhbGxDb3VudHJ5OiBhbnkpID0+ICh7XHJcbiAgLy8gICAgICAgICBhbGxDb3VudHJ5OiBhbGxDb3VudHJ5LmFsbENvdW50cnksXHJcbiAgLy8gICAgICAgICBjaGVja2VkOiBjb3VudHJ5TGlzdD8uaW5jbHVkZXMoYWxsQ291bnRyeS5hbGxDb3VudHJ5KSA/IHRydWUgOiBmYWxzZSxcclxuICAvLyAgICAgICB9KSk7XHJcbiAgXHJcbiAgLy8gICAgICAgLy8gU3luYyB0aGUgZmV0Y2hlZCBjb3VudHJpZXMgd2l0aCBhbnkgc3RvcmVkIGNoZWNrZWQgdmFsdWVzIGluIGxvY2FsU3RvcmFnZVxyXG4gIC8vICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5ICYmIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSkpIHtcclxuICAvLyAgICAgICAgIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllcy5tYXAoY291bnRyeSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IG1hdGNoZWRMb2NhdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkuZmluZCgobG9jOiBhbnkpID0+IGxvYy5hbGxDb3VudHJ5ID09PSBjb3VudHJ5LmFsbENvdW50cnkpO1xyXG4gIC8vICAgICAgICAgICByZXR1cm4gbWF0Y2hlZExvY2F0aW9uID8geyAuLi5jb3VudHJ5LCBjaGVja2VkOiBtYXRjaGVkTG9jYXRpb24uY2hlY2tlZCB9IDogY291bnRyeTtcclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudHJpZXM7XHJcbiAgLy8gICAgICAgfVxyXG5cclxuICAvLyAgICAgICBpZih0aGlzLnNlYXJjaExvY2F0aW9uVGV4dCkge1xyXG4gIC8vICAgICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzLmZpbHRlcigoY291bnRyeTphbnkpID0+IGNvdW50cnkuY2l0eS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0LnRvTG93ZXJDYXNlKCkpKVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBjb25zdCBzZWxlY3RlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzLmZpbHRlcigoY291bnRyeSkgPT4gY291bnRyeS5jaGVja2VkKS5tYXAoKGNvdW50cnkpID0+IGNvdW50cnkuYWxsQ291bnRyeSk7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdGVkQ291bnRyaWVzLmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAvLyAgICAgICAgICAgdGhpcy5nZXRTdG9yZSgpOyAvLyBGZXRjaCBzdG9yZXMgYmFzZWQgb24gc2VsZWN0ZWQgZ3JvdXBzXHJcbiAgLy8gICAgICAgICB9LDEwMDApXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggY291bnRyaWVzXCIsIGVycik7XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNlbGVjdGVkQ291bnRyaWVzTGFiZWwoKTogc3RyaW5nIHtcclxuICAvLyAgIGNvbnN0IHNlbGVjdGVkQ291bnRyaWVzID0gdGhpcy5jb3VudHJ5TGFiZWwgPSB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC5sZW5ndGggPyB0aGlzLmNvdW50cmllc1xyXG4gIC8vICAgICAuZmlsdGVyKGNvdW50cnkgPT4gY291bnRyeS5jaGVja2VkKS5tYXAoY291bnRyeSA9PiBjb3VudHJ5LmFsbENvdW50cnkpIDogIHRoaXMuZmlsdGVyZWRDb3VudHJpZXNcclxuICAvLyAgICAgLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKGNvdW50cnkgPT4gY291bnRyeS5hbGxDb3VudHJ5KTtcclxuICAvLyAgIHJldHVybiBzZWxlY3RlZENvdW50cmllcy5sZW5ndGggPT09IDBcclxuICAvLyAgICAgPyAnJ1xyXG4gIC8vICAgICA6IHNlbGVjdGVkQ291bnRyaWVzLmxlbmd0aCA9PT0gMVxyXG4gIC8vICAgICA/IHNlbGVjdGVkQ291bnRyaWVzWzBdXHJcbiAgLy8gICAgIDogYCR7c2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RofSBjb3VudHJpZXNgO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gaXNBbGxDb3VudHJpZXNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAvLyAgIHJldHVybiB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmV2ZXJ5KGNvdW50cnkgPT4gY291bnRyeS5jaGVja2VkKTtcclxuXHJcbiAgLy8gfVxyXG4gIC8vIGZpbHRlckNvdW50cmllcygpOiB2b2lkIHsgICAgXHJcbiAgLy8gICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hDb3VudHJ5VGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgLy8gICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gIC8vICAgICAvLyBQcmVzZXJ2ZSB0aGUgY2hlY2tlZCBzdGF0ZSBkdXJpbmcgZmlsdGVyaW5nXHJcbiAgLy8gICAgIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50aXJlc1xyXG4gIC8vICAgICAgIC5tYXAoY291bnRyeSA9PiAoe1xyXG4gIC8vICAgICAgICAgLi4uY291bnRyeSxcclxuICAvLyAgICAgICAgIGNoZWNrZWQ6IHRoaXMuZmlsdGVyZWRDb3VudHJpZXMuZmluZChsID0+IGwuYWxsQ291bnRyeSA9PT0gY291bnRyeS5hbGxDb3VudHJ5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gIC8vICAgICAgIH0pKVxyXG4gIC8vICAgICAgIC5maWx0ZXIobG9jYXRpb24gPT5cclxuICAvLyAgICAgICAgIGxvY2F0aW9uPy5hbGxDb3VudHJ5Py50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpXHJcbiAgLy8gICAgICAgKTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNoZWNrZWQgc3RhdGUgd2hlbiBzZWFyY2ggdGV4dCBpcyBjbGVhcmVkXHJcbiAgLy8gICAgIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50aXJlcy5tYXAoY291bnRyeSA9PiAoe1xyXG4gIC8vICAgICAgIC4uLmNvdW50cnksXHJcbiAgLy8gICAgICAgY2hlY2tlZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeS5maW5kKChsOmFueSkgPT4gbC5hbGxDb3VudHJ5ID09PSBjb3VudHJ5LmFsbENvdW50cnkpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgLy8gICAgIH0pKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgXHJcblxyXG4gICAgZ2V0Q291bnRyeSgpOiB2b2lkIHtcclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPyB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgOiB0aGlzLnVzZXJzLmNsaWVudElkLFxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgdGhpcy5hdXRoLmdldENvdW50cnkob2JqKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAvLyBFeHRyYWN0IHNlbGVjdGVkIGNvdW50cmllcyBmcm9tIGV4aXN0aW5nIGZpbHRlcnMgKGlmIGFueSlcclxuICAgICAgICBsZXQgY291bnRyeUxpc3QgPSB0aGlzLnNlbGVjdGVkRmlsdGVycz8uY291bnRyeT8uZmlsdGVyKChjb3VudHJ5OiBhbnkpID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKChsb2M6IGFueSkgPT4gbG9jLmNvdW50cnkpO1xyXG4gIFxyXG4gICAgICAgIC8vIE1hcCBBUEkgcmVzcG9uc2UgdG8gZnJvbnRlbmQgbW9kZWxcclxuICAgICAgICB0aGlzLmNvdW50cmllcyA9IHJlcz8uZGF0YT8uY291bnRyeURhdGEubWFwKChpdGVtOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBjb3VudHJ5OiBpdGVtLmNvdW50cnksXHJcbiAgICAgICAgICAvLyBjaGVja2VkOiBjb3VudHJ5TGlzdD8ubGVuZ3RoID8gY291bnRyeUxpc3QuaW5jbHVkZXMoaXRlbS5jb3VudHJ5KSA6IHRydWUsXHJcbiAgICAgICAgICAvLyBjaGVja2VkOiBjaXR5TGlzdD8ubGVuZ3RoID8gY2l0eUxpc3QuaW5jbHVkZXMoY2l0eS5jaXR5KSA6IHRydWUsXHJcbiAgICAgICAgICBjaGVja2VkOiBjb3VudHJ5TGlzdD8uaW5jbHVkZXMoaXRlbS5jb3VudHJ5KSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICAgIFxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkpKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudHJpZXMubWFwKGxvY2F0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZExvY2F0aW9uID0gdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeS5maW5kKChsb2M6IGFueSkgPT4gbG9jLmNvdW50cnkgPT09IGxvY2F0aW9uLmNvdW50cnkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlZExvY2F0aW9uID8geyAuLi5sb2NhdGlvbiwgY2hlY2tlZDogbWF0Y2hlZExvY2F0aW9uLmNoZWNrZWQgfSA6IGxvY2F0aW9uO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllcztcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvLyBJbml0aWFsbHksIGFsbCBjb3VudHJpZXMgYXJlIHZpc2libGVcclxuICAgICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gWy4uLnRoaXMuY291bnRyaWVzXTtcclxuICAgICAgICBcclxuXHJcbiAgICAgICAgLy8gSWYgYSBzZWFyY2ggdGV4dCBhbHJlYWR5IGV4aXN0cywgZmlsdGVyIGltbWVkaWF0ZWx5XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoQ291bnRyeVRleHQpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyQ291bnRyaWVzKCk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIC8vIEZldGNoIHN0b3JlcyBpZiBhdCBsZWFzdCBvbmUgY291bnRyeSBpcyBzZWxlY3RlZFxyXG4gICAgICAgIGxldCBzZWxlY3RlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzLmZpbHRlcigoY291bnRyeSkgPT4gY291bnRyeS5jaGVja2VkKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RvcmUoKTsgLy8gZmV0Y2ggc3RvcmVzXHJcbiAgICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCBjb3VudHJpZXNcIiwgZXJyKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRDb3VudHJpZXNMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJpZXMgPSB0aGlzLnNlYXJjaENvdW50cnlUZXh0Lmxlbmd0aFxyXG4gICAgICA/IHRoaXMuZmlsdGVyZWRDb3VudHJpZXMuZmlsdGVyKGNvdW50cnkgPT4gY291bnRyeS5jaGVja2VkKS5tYXAoY291bnRyeSA9PiBjb3VudHJ5LmNvdW50cnkpXHJcbiAgICAgIDogdGhpcy5jb3VudHJpZXMuZmlsdGVyKGNvdW50cnkgPT4gY291bnRyeS5jaGVja2VkKS5tYXAoY291bnRyeSA9PiBjb3VudHJ5LmNvdW50cnkpO1xyXG4gIFxyXG4gICAgcmV0dXJuIHNlbGVjdGVkQ291bnRyaWVzLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/ICcnXHJcbiAgICAgIDogc2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RoID09PSAxXHJcbiAgICAgID8gc2VsZWN0ZWRDb3VudHJpZXNbMF1cclxuICAgICAgOiBgJHtzZWxlY3RlZENvdW50cmllcy5sZW5ndGh9IGNvdW50cmllc2A7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJDb3VudHJpZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hDb3VudHJ5VGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICAvLyBGaWx0ZXIgYW5kIHByZXNlcnZlIGNoZWNrZWQgc3RhdGVcclxuICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzXHJcbiAgICAgICAgLm1hcChjb3VudHJ5ID0+ICh7XHJcbiAgICAgICAgICAuLi5jb3VudHJ5LFxyXG4gICAgICAgICAgY2hlY2tlZDogdGhpcy5maWx0ZXJlZENvdW50cmllcy5maW5kKGMgPT4gYy5jb3VudHJ5ID09PSBjb3VudHJ5LmNvdW50cnkpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY291bnRyeS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFJlc2V0IHRvIGZ1bGwgbGlzdFxyXG4gICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudHJpZXMubWFwKChjb3VudHJ5OiBDb3VudHJ5KSA9PiAoe1xyXG4gICAgICAgIC4uLmNvdW50cnksXHJcbiAgICAgICAgY2hlY2tlZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeT8uZmluZCgoYzogYW55KSA9PiBjLmNvdW50cnkgPT09IGNvdW50cnkuY291bnRyeSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNBbGxDb3VudHJpZXNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmxlbmd0aCA+IDAgJiYgdGhpcy5maWx0ZXJlZENvdW50cmllcy5ldmVyeShjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCk7XHJcbiAgfVxyXG4gIHRvZ2dsZVNlbGVjdEFsbENvdW50cmllcyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMuZm9yRWFjaCgoY291bnRyeSkgPT4gKGNvdW50cnkuY2hlY2tlZCA9IGlzQ2hlY2tlZCkpO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZENvdW50cmllcygpO1xyXG4gICAgXHJcbiAgfVxyXG4gIFxyXG4gIHVwZGF0ZVNlbGVjdGVkQ291bnRyaWVzKCk6IHZvaWQge1xyXG4gICAgLy8gV2hlbiBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkLCBmZXRjaCB0aGUgcmVsYXRlZCBncm91cHNcclxuICAgIGNvbnN0IHNlbGVjdGVkQ291bnRyaWVzID0gdGhpcy5maWx0ZXJlZENvdW50cmllc1xyXG4gICAgICAuZmlsdGVyKChjb3VudHJ5KSA9PiBjb3VudHJ5LmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKGNvdW50cnkpID0+IGNvdW50cnkuY291bnRyeSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmZvckVhY2goKGNvdW50cnk6YW55KSA9PiB7XHJcbiAgICAgIGxldCBmaW5kQ291bnRyeUluZGV4ID0gdGhpcy5jb3VudHJpZXMuZmluZEluZGV4KChsb2M6YW55KSA9PiBsb2MuY291bnRyeSA9PSBjb3VudHJ5LmNvdW50cnkpO1xyXG4gICAgICBpZihmaW5kQ291bnRyeUluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgdGhpcy5jb3VudHJpZXNbZmluZENvdW50cnlJbmRleF0uY2hlY2tlZCA9IGNvdW50cnkuY2hlY2tlZDtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGlmIChzZWxlY3RlZENvdW50cmllcy5sZW5ndGggPiAwIHx8ICFzZWxlY3RlZENvdW50cmllcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID1bXTtcclxuICAgICAgdGhpcy5ncm91cHNEYXRhID1bXVxyXG4gICAgICB0aGlzLmxvY2F0aW9ucyA9W107XHJcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7IC8vIEZldGNoIGdyb3VwcyBiYXNlZCBvbiBzZWxlY3RlZCBjaXRpZXNcclxuICAgICAgLy8gSWYgdGhlcmUgYXJlIHNlbGVjdGVkIGdyb3VwcywgZmV0Y2ggdGhlIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5ID0gdGhpcy5maWx0ZXJlZENvdW50cmllcztcclxuICAgICBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBbXTsgLy8gQ2xlYXIgZ3JvdXBzIGlmIG5vIGxvY2F0aW9ucyBhcmUgc2VsZWN0ZWRcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9IFtdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdOyAvLyBSZXNldCBzdG9yZXMgYXMgd2VsbFxyXG4gICAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSAnJztcclxuICAgIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gJyc7XHJcbiAgICAvLyB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ291bnRyeSgpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVzZXQoKTtcclxuICB9XHJcblxyXG4gIEFwcGx5KCk6IHZvaWQge1xyXG4gICAgLy8gQ2xvc2UgdGhlIGRyb3Bkb3duXHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIFxyXG4gICAgLy8gRmV0Y2ggZXhpc3RpbmcgZmlsdGVycyBmcm9tIGxvY2FsU3RvcmFnZVxyXG4gICAgY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIik7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZSA9ICBudWxsXHJcbiAgXHJcbiAgICAvLyBFbnN1cmUgY3VycmVudCBzZWxlY3Rpb25zIGFyZSByZWZsZWN0ZWRcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgPSB0aGlzLmZpbHRlcmVkQ291bnRyaWVzO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSB0aGlzLmxvY2F0aW9ucztcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gdGhpcy5ncm91cHNEYXRhO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gaGVhZGVyRmlsdGVycy5zdG9yZXMgPyBoZWFkZXJGaWx0ZXJzLnN0b3JlcyA6IHRoaXMuc3RvcmVzO1xyXG4gICAgLy8gU3RvcmUgdXBkYXRlZCBmaWx0ZXJzIGJhY2sgaW4gbG9jYWxTdG9yYWdlXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXHJcbiAgICAvLyBFbWl0IHRoZSB1cGRhdGVkIGZpbHRlcnMgdmlhIHRoZSBzZXJ2aWNlXHJcbiAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgLy8gVHJpZ2dlciByZWZyZXNoIGlmIG5lY2Vzc2FyeVxyXG4gICAgLy8gdGhpcy5ncy5tYW5hZ2VSZWZyZXNoVHJpZ2dlci5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIFxyXG5cclxuXHJcbn1cclxuaW50ZXJmYWNlIENpdHkge1xyXG4gIGNpdHk6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIExvY2F0aW9uIHtcclxuICBjaXR5OiBDaXR5O1xyXG4gIGNoZWNrZWQ6IGJvb2xlYW47XHJcbn1cclxuaW50ZXJmYWNlIENvdW50cnkge1xyXG4gIGNvdW50cnk6IHN0cmluZztcclxuICBjaGVja2VkOiBib29sZWFuO1xyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJtZS0zXCI+XHJcbiAgICA8bGFiZWwgKm5nSWY9XCJzZWxlY3RlZENvdW50cmllc0xhYmVsKClcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LWRlZmF1bHQgbXgtMlwiPnt7c2VsZWN0ZWRDb3VudHJpZXNMYWJlbCgpfX0gXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVDb3VudHJ5KClcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuICAgIDxsYWJlbCAqbmdJZj1cInNlbGVjdGVkTG9jYXRpb25zTGFiZWwoKVwiIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdCBteC0yXCI+e3tzZWxlY3RlZExvY2F0aW9uc0xhYmVsKCl9fSBcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJlbW92ZUxvY2F0aW9uKClcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuICAgIDxsYWJlbCAqbmdJZj1cInNlbGVjdGVkR3JvdXBzTGFiZWwoKVwiICBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LWRlZmF1bHQgbXgtMlwiPnt7c2VsZWN0ZWRHcm91cHNMYWJlbCgpfX0gXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVHcm91cCgpXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8bGFiZWwgIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdFwiPnt7c2VsZWN0ZWRTdG9yZXNMYWJlbCgpfX08L2xhYmVsPlxyXG48L2Rpdj5cclxuXHJcblxyXG48ZGl2IGNsYXNzPVwid3JhcHBlciBtZS0zXCIgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8udXNlclR5cGUgPT09ICd0YW5nbydcIj5cclxuPGxpYi1zZWxlY3QgW2l0ZW1zXT1cImNsaWVudExpc3RcIiBbbXVsdGldPVwiZmFsc2VcIiBbc2VhcmNoRmllbGRdPVwiJ2NsaWVudE5hbWUnXCIgW2Rpc2FibGVkXT1cImZhbHNlXCIgW2lkRmllbGRdPVwiJ2NsaWVudElkJ1wiXHJcbihzZWxlY3RlZCk9XCJvbkNsaWVudFNlbGVjdCgkZXZlbnQpXCIgW3NlbGVjdGVkVmFsdWVzXT1cIltzZWxlY3RlZENsaWVudF1cIj48L2xpYi1zZWxlY3Q+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwb3NpdGlvbi1yZWxhdGl2ZSBteS0xXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXMtM1wiPlxyXG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xMy4zMzMzIDEuNjY2NjNWNC45OTk5Nk02LjY2NjY3IDEuNjY2NjNWNC45OTk5Nk0yLjUgOC4zMzMyOUgxNy41TTQuMTY2NjcgMy4zMzMyOUgxNS44MzMzQzE2Ljc1MzggMy4zMzMyOSAxNy41IDQuMDc5NDggMTcuNSA0Ljk5OTk2VjE2LjY2NjZDMTcuNSAxNy41ODcxIDE2Ljc1MzggMTguMzMzMyAxNS44MzMzIDE4LjMzMzNINC4xNjY2N0MzLjI0NjE5IDE4LjMzMzMgMi41IDE3LjU4NzEgMi41IDE2LjY2NjZWNC45OTk5NkMyLjUgNC4wNzk0OCAzLjI0NjE5IDMuMzMzMjkgNC4xNjY2NyAzLjMzMzI5WlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8aW5wdXQgY2xhc3M9XCJmeC1kYXRlLXJhbmdlIGZvcm0tY29udHJvbCBwcy0xNFwiIHN0eWxlPVwibWluLXdpZHRoOiAyNjBweCAhaW1wb3J0YW50O1wiIHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXRcclxuICAgICAgICBuZ3hEYXRlcmFuZ2VwaWNrZXJNZCBbZHJvcHNdPVwiJ2Rvd24nXCIgW29wZW5zXT1cIidyaWdodCdcIiBbcmFuZ2VzXT1cInJhbmdlc1wiIFtzaG93Q3VzdG9tUmFuZ2VMYWJlbF09XCJ0cnVlXCIgW2F1dG9BcHBseV09XCJ0cnVlXCJcclxuICAgICAgICBbYWx3YXlzU2hvd0NhbGVuZGFyc109XCJmYWxzZVwiIFtrZWVwQ2FsZW5kYXJPcGVuaW5nV2l0aFJhbmdlXT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJ0cnVlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRGF0ZVJhbmdlXCIgKHN0YXJ0RGF0ZUNoYW5nZWQpPVwib25TdGFydERhdGVDaGFuZ2UoJGV2ZW50KVwiIFtpc0N1c3RvbURhdGVdPVwiaXNDdXN0b21EYXRlXCJcclxuICAgICAgICBbbG9jYWxlXT1cInsgZm9ybWF0OiAnREQtTU0tWVlZWScsIGZpcnN0RGF5OiAxLCBtb250aE5hbWVzOiBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXSB9XCJcclxuICAgICAgICAoZGF0ZXNVcGRhdGVkKT1cImRhdGVjaGFuZ2UoJGV2ZW50KVwiIG5hbWU9XCJkYXRlcmFuZ2VcIiBbcmVhZG9ubHldPVwidHJ1ZVwiIC8+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvcGVuZHJvcGRvd24oJGV2ZW50KVwiICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBteC0yIHJvdW5kZWQtMyB0ZXh0LW5vd3JhcCBib3JkZXItdmFsXCI+XHJcbiAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1lLTJcIj5GaWx0ZXI8L3NwYW4+IC0tPlxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJwbC0zXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgMTBIMTVNMi41IDVIMTcuNU03LjUgMTVIMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiT3BlbmRyb3Bkb3duXCIgY2xhc3M9XCJjYXJkIHAtNSBkcm9wZG93bjIgcG9zaXRpb24tYWJzb2x1dGUgei0xIGVuZC0wXCIgc3R5bGU9XCJ6LWluZGV4OiAxICFpbXBvcnRhbnQ7XCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duMSgpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRpdGxlIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0yXCI+RmlsdGVyIE9wdGlvbnNcclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTI1IG1zLTMgYnRuLXJlc2l6ZVwiIChjbGljayk9XCJSZXNldCgpXCI+IFJlc2V0IDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMjUgIGJ0bi1yZXNpemVcIiAoY2xpY2spPVwiQXBwbHkoKVwiPkFwcGx5PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgPCEtLSBDb3VudHJ5IERyb3Bkb3duIC0tPlxyXG48ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyXCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ2NvdW50cnknKVwiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZHJvcGRvd24taW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkQ291bnRyaWVzTGFiZWwoKVwiXHJcbiAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvdW50cnlcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IGN1c3RvbS1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJkcm9wZG93bk9wZW4gPT09ICdjb3VudHJ5J1wiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWItMiBkcm9wZG93bi1zZWFyY2hcIiBcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY291bnRyeVwiIFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaENvdW50cnlUZXh0XCIgXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckNvdW50cmllcygpXCIgXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yIGRyb3Bkb3duLWl0ZW0gY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsQ291bnRyaWVzXCIgXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbENvdW50cmllc1NlbGVjdGVkKClcIiBcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsQ291bnRyaWVzKCRldmVudClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbENvdW50cmllc1wiPlxyXG4gICAgICAgICAgICAgICAgU2VsZWN0IEFsbFxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBmb3JtLWNoZWNrIGN1c3RvbS1kcm9wZG93bi1pdGVtXCIgXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb3VudHJ5IG9mIGZpbHRlcmVkQ291bnRyaWVzXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPGlucHV0IFxyXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgIFtpZF09XCJjb3VudHJ5LmNvdW50cnlcIiBcclxuICAgICAgICBbKG5nTW9kZWwpXT1cImNvdW50cnkuY2hlY2tlZFwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZENvdW50cmllcygpXCIgXHJcbiAgICAgIC8+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImNvdW50cnkuY291bnRyeVwiPlxyXG4gICAgICAgIHt7IGNvdW50cnkuY291bnRyeSB9fVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbiAgICAgPCEtLSBMb2NhdGlvbiBEcm9wZG93biAtLT5cclxuPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBtdC0zXCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ2xvY2F0aW9uJylcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZExvY2F0aW9uc0xhYmVsKClcIlxyXG4gICAgICAgICAgICByZWFkb25seVxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBSZWdpb25cIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IGN1c3RvbS1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJkcm9wZG93bk9wZW4gPT09ICdsb2NhdGlvbidcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG1iLTIgZHJvcGRvd24tc2VhcmNoXCIgXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFJlZ2lvblwiIFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaExvY2F0aW9uVGV4dFwiIFxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJMb2NhdGlvbnMoKVwiIFxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItMiBkcm9wZG93bi1pdGVtIGN1c3RvbS1kcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBpZD1cInNlbGVjdEFsbExvY2F0aW9uc1wiIFxyXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxMb2NhdGlvbnNTZWxlY3RlZCgpXCIgXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbExvY2F0aW9ucygkZXZlbnQpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzZWxlY3RBbGxMb2NhdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IFxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZm9ybS1jaGVjayBjdXN0b20tZHJvcGRvd24taXRlbVwiIFxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgbG9jYXRpb24gb2YgZmlsdGVyZWRMb2NhdGlvbnNcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIFtpZF09XCJsb2NhdGlvbi5jaXR5XCIgXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImxvY2F0aW9uLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImxvY2F0aW9uLmNpdHlcIj5cclxuICAgICAgICAgICAgICAgIHt7IGxvY2F0aW9uLmNpdHkgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gR3JvdXAgRHJvcGRvd24gLS0+XHJcbjxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXIgbXQtM1wiIChjbGlja091dHNpZGUpPVwiY2xvc2VEcm9wZG93bigpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCdncm91cCcpXCI+XHJcbiAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBkcm9wZG93bi1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRHcm91cHNMYWJlbCgpXCIgcmVhZG9ubHlcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY2x1c3RlcnNcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IGN1c3RvbS1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJkcm9wZG93bk9wZW4gPT09ICdncm91cCdcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG1iLTIgZHJvcGRvd24tc2VhcmNoXCIgXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNsdXN0ZXJzXCIgXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoR3JvdXBUZXh0XCIgXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckdyb3VwcygpXCIgXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yIGRyb3Bkb3duLWl0ZW0gY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsR3JvdXBzXCIgXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbEdyb3Vwc1NlbGVjdGVkKClcIiBcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsR3JvdXBzKCRldmVudClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbEdyb3Vwc1wiPlxyXG4gICAgICAgICAgICAgICAgU2VsZWN0IEFsbFxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBmb3JtLWNoZWNrIGN1c3RvbS1kcm9wZG93bi1pdGVtXCIgXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBncm91cCBvZiBmaWx0ZXJlZEdyb3Vwc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImdyb3VwLmdyb3VwTmFtZVwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdyb3VwLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZEdyb3VwcygpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImdyb3VwLmdyb3VwTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZ3JvdXAuZ3JvdXBOYW1lIH19XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuPCEtLSBTdG9yZSBEcm9wZG93biAtLT5cclxuPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBtdC0zXCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ3N0b3JlJylcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkU3RvcmVzTGFiZWwoKVwiXHJcbiAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHN0b3Jlc1wiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgY3VzdG9tLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImRyb3Bkb3duT3BlbiA9PT0gJ3N0b3JlJ1wiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWItMiBkcm9wZG93bi1zZWFyY2ggXCIgXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHN0b3Jlc1wiIFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFN0b3JlVGV4dFwiIFxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJTdG9yZXMoKVwiIFxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItMiBkcm9wZG93bi1pdGVtIGN1c3RvbS1kcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBpZD1cInNlbGVjdEFsbFN0b3Jlc1wiIFxyXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxTdG9yZXNTZWxlY3RlZCgpXCIgXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbFN0b3JlcygkZXZlbnQpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzZWxlY3RBbGxTdG9yZXNcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IFxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZm9ybS1jaGVjayBjdXN0b20tZHJvcGRvd24taXRlbVwiIFxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3RvcmUgb2YgZmlsdGVyZWRTdG9yZXNcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIFtpZF09XCJzdG9yZS5zdG9yZUlkXCJcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RvcmUuY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkU3RvcmVzKClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwic3RvcmUuc3RvcmVJZFwiPlxyXG4gICAgICAgICAgICAgICAge3sgc3RvcmUuc3RvcmVOYW1lIH19XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==