@norwegian/core-components 5.18.0 → 5.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (515) hide show
  1. package/esm2020/lib/components/accordion/accordion.component.mjs +148 -0
  2. package/esm2020/lib/components/accordion/accordion.module.mjs +20 -0
  3. package/esm2020/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.mjs +610 -0
  4. package/esm2020/lib/components/airport-select/airport-select.component.mjs +438 -0
  5. package/esm2020/lib/components/airport-select/airport-select.module.mjs +42 -0
  6. package/esm2020/lib/components/airport-select/services/airport-select-dropdown.service.mjs +35 -0
  7. package/esm2020/lib/components/airport-select/services/airport-select.service.mjs +38 -0
  8. package/esm2020/lib/components/autocomplete/autocomplete.component.mjs +287 -0
  9. package/esm2020/lib/components/autocomplete/autocomplete.module.mjs +43 -0
  10. package/esm2020/lib/components/backdrop/backdrop.component.mjs +56 -0
  11. package/esm2020/lib/components/backdrop/backdrop.module.mjs +24 -0
  12. package/esm2020/lib/components/box/box.component.mjs +68 -0
  13. package/esm2020/lib/components/box/box.module.mjs +19 -0
  14. package/esm2020/lib/components/button/button.component.mjs +167 -0
  15. package/esm2020/lib/components/button/button.module.mjs +20 -0
  16. package/esm2020/lib/components/checkbox/checkbox.component.mjs +148 -0
  17. package/esm2020/lib/components/checkbox/checkbox.module.mjs +20 -0
  18. package/esm2020/lib/components/chip/chip.component.mjs +53 -0
  19. package/esm2020/lib/components/chip/chip.module.mjs +24 -0
  20. package/esm2020/lib/components/container/container.component.mjs +50 -0
  21. package/esm2020/lib/components/container/container.module.mjs +19 -0
  22. package/esm2020/lib/components/continue/continue.component.mjs +194 -0
  23. package/esm2020/lib/components/continue/continue.module.mjs +34 -0
  24. package/esm2020/lib/components/cover/cover.component.mjs +75 -0
  25. package/esm2020/lib/components/cover/cover.module.mjs +21 -0
  26. package/esm2020/lib/components/datepicker/calendar/calendar.component.mjs +583 -0
  27. package/esm2020/lib/components/datepicker/datepicker.component.mjs +550 -0
  28. package/esm2020/lib/components/datepicker/datepicker.module.mjs +55 -0
  29. package/esm2020/lib/components/datepicker/services/calendar.service.mjs +213 -0
  30. package/esm2020/lib/components/datepicker-combo/datepicker-combo.component.mjs +355 -0
  31. package/esm2020/lib/components/datepicker-combo/datepicker-combo.module.mjs +31 -0
  32. package/esm2020/lib/components/divider/divider.component.mjs +61 -0
  33. package/esm2020/lib/components/divider/divider.module.mjs +20 -0
  34. package/esm2020/lib/components/dropdown/dropdown.component.mjs +169 -0
  35. package/esm2020/lib/components/dropdown/dropdown.module.mjs +32 -0
  36. package/esm2020/lib/components/filter/filter.component.mjs +1253 -0
  37. package/esm2020/lib/components/filter/filter.module.mjs +73 -0
  38. package/esm2020/lib/components/grid/col/col.component.mjs +49 -0
  39. package/esm2020/lib/components/grid/grid.component.mjs +72 -0
  40. package/esm2020/lib/components/grid/grid.module.mjs +20 -0
  41. package/esm2020/lib/components/icon/icon.component.mjs +44 -0
  42. package/esm2020/lib/components/icon/icon.module.mjs +24 -0
  43. package/esm2020/lib/components/icon-list/icon-list.component.mjs +50 -0
  44. package/esm2020/lib/components/icon-list/icon-list.module.mjs +20 -0
  45. package/esm2020/lib/components/info/info.component.mjs +106 -0
  46. package/esm2020/lib/components/info/info.module.mjs +36 -0
  47. package/esm2020/lib/components/input/input.component.mjs +179 -0
  48. package/esm2020/lib/components/input/input.module.mjs +21 -0
  49. package/esm2020/lib/components/journey/journey.component.mjs +126 -0
  50. package/esm2020/lib/components/journey/journey.module.mjs +28 -0
  51. package/esm2020/lib/components/journey-availability/journey-availability.component.mjs +126 -0
  52. package/esm2020/lib/components/journey-availability/journey-availability.module.mjs +39 -0
  53. package/esm2020/lib/components/journey-availability-list/journey-availability-list.component.mjs +185 -0
  54. package/{esm2015/lib/components/journey-availability-list/journey-availability-list.module.js → esm2020/lib/components/journey-availability-list/journey-availability-list.module.mjs} +27 -14
  55. package/esm2020/lib/components/journey-selection/journey-selection.component.mjs +112 -0
  56. package/esm2020/lib/components/journey-selection/journey-selection.module.mjs +35 -0
  57. package/esm2020/lib/components/journey-stopover/journey-stopover.component.mjs +125 -0
  58. package/esm2020/lib/components/journey-stopover/journey-stopover.module.mjs +28 -0
  59. package/esm2020/lib/components/list/list-item/list-item.component.mjs +52 -0
  60. package/esm2020/lib/components/list/list.component.mjs +78 -0
  61. package/esm2020/lib/components/list/list.module.mjs +20 -0
  62. package/esm2020/lib/components/modal/modal.component.mjs +141 -0
  63. package/esm2020/lib/components/modal/modal.module.mjs +38 -0
  64. package/esm2020/lib/components/number-field/number-field.component.mjs +135 -0
  65. package/esm2020/lib/components/number-field/number-field.module.mjs +39 -0
  66. package/esm2020/lib/components/page-footer/page-footer.component.mjs +54 -0
  67. package/esm2020/lib/components/page-footer/page-footer.module.mjs +21 -0
  68. package/esm2020/lib/components/page-header/hamburger/hamburger.component.mjs +22 -0
  69. package/esm2020/lib/components/page-header/page-header.component.mjs +142 -0
  70. package/esm2020/lib/components/page-header/page-header.module.mjs +23 -0
  71. package/esm2020/lib/components/page-header/search/search.component.mjs +49 -0
  72. package/{esm2015/lib/components/passenger-select/models/passengers.model.js → esm2020/lib/components/passenger-select/models/passengers.model.mjs} +1 -1
  73. package/esm2020/lib/components/passenger-select/passenger-select.component.mjs +225 -0
  74. package/esm2020/lib/components/passenger-select/passenger-select.module.mjs +28 -0
  75. package/esm2020/lib/components/phone-number/phone-number.component.mjs +148 -0
  76. package/esm2020/lib/components/phone-number/phone-number.module.mjs +44 -0
  77. package/esm2020/lib/components/premium-toggle/premium-toggle.component.mjs +69 -0
  78. package/esm2020/lib/components/premium-toggle/premium-toggle.module.mjs +28 -0
  79. package/esm2020/lib/components/radio/radio.component.mjs +98 -0
  80. package/esm2020/lib/components/radio/radio.module.mjs +20 -0
  81. package/esm2020/lib/components/select/optgroup/optgroup.component.mjs +29 -0
  82. package/esm2020/lib/components/select/option/option.component.mjs +26 -0
  83. package/esm2020/lib/components/select/select.component.mjs +354 -0
  84. package/esm2020/lib/components/select/select.module.mjs +30 -0
  85. package/esm2020/lib/components/simple-list/simple-list.component.mjs +48 -0
  86. package/esm2020/lib/components/simple-list/simple-list.module.mjs +19 -0
  87. package/esm2020/lib/components/slide-toggle/slide-toggle.component.mjs +111 -0
  88. package/esm2020/lib/components/slide-toggle/slide-toggle.module.mjs +31 -0
  89. package/esm2020/lib/components/slider/slider.component.mjs +501 -0
  90. package/esm2020/lib/components/slider/slider.module.mjs +28 -0
  91. package/esm2020/lib/components/sort/sort.component.mjs +93 -0
  92. package/esm2020/lib/components/sort/sort.module.mjs +36 -0
  93. package/esm2020/lib/components/spinner/spinner.component.mjs +112 -0
  94. package/esm2020/lib/components/spinner/spinner.module.mjs +19 -0
  95. package/esm2020/lib/components/subsidy-discount/subsidy-discount.component.mjs +110 -0
  96. package/esm2020/lib/components/subsidy-discount/subsidy-discount.module.mjs +36 -0
  97. package/esm2020/lib/components/suggestions/suggestions.component.mjs +43 -0
  98. package/esm2020/lib/components/suggestions/suggestions.module.mjs +28 -0
  99. package/esm2020/lib/components/tab-group/tab/tab.component.mjs +131 -0
  100. package/esm2020/lib/components/tab-group/tab-group.component.mjs +87 -0
  101. package/esm2020/lib/components/tab-group/tab-group.module.mjs +29 -0
  102. package/esm2020/lib/components/table/column/column.component.mjs +16 -0
  103. package/esm2020/lib/components/table/column-group/column-group.component.mjs +30 -0
  104. package/esm2020/lib/components/table/services/table.service.mjs +21 -0
  105. package/esm2020/lib/components/table/table-body/table-body.component.mjs +23 -0
  106. package/esm2020/lib/components/table/table-foot/table-foot.component.mjs +23 -0
  107. package/esm2020/lib/components/table/table-head/table-head.component.mjs +23 -0
  108. package/esm2020/lib/components/table/table-row/table-data/table-data.component.mjs +15 -0
  109. package/esm2020/lib/components/table/table-row/table-header/table-header.component.mjs +15 -0
  110. package/esm2020/lib/components/table/table-row/table-row.component.mjs +23 -0
  111. package/esm2020/lib/components/table/table.component.mjs +29 -0
  112. package/esm2020/lib/components/table/table.module.mjs +68 -0
  113. package/esm2020/lib/components/textarea/textarea.component.mjs +93 -0
  114. package/esm2020/lib/components/textarea/textarea.module.mjs +31 -0
  115. package/esm2020/lib/components/toggle/toggle.component.mjs +103 -0
  116. package/esm2020/lib/components/toggle/toggle.module.mjs +35 -0
  117. package/esm2020/lib/components/trip-summary/trip-summary.component.mjs +170 -0
  118. package/esm2020/lib/components/trip-summary/trip-summary.module.mjs +36 -0
  119. package/esm2020/lib/components/weather-icon/weather-icon.component.mjs +60 -0
  120. package/esm2020/lib/components/weather-icon/weather-icon.module.mjs +19 -0
  121. package/esm2020/lib/core/base/nas-component.base.mjs +47 -0
  122. package/esm2020/lib/core/directives/nas-class/nas-class.directive.mjs +80 -0
  123. package/esm2020/lib/core/directives/nas-class/nas-class.module.mjs +22 -0
  124. package/{esm2015/lib/core/extensions/html-element.extension.js → esm2020/lib/core/extensions/html-element.extension.mjs} +1 -1
  125. package/esm2020/lib/core/services/abandoned-basket/abandoned-basket.service.mjs +58 -0
  126. package/esm2020/lib/core/services/animate-helper/animate-helper.service.mjs +49 -0
  127. package/esm2020/lib/core/services/bem-helper/bem-helper.service.mjs +44 -0
  128. package/esm2020/lib/core/services/date/date-helper.service.mjs +199 -0
  129. package/esm2020/lib/core/services/device/device-helper.service.mjs +46 -0
  130. package/esm2020/lib/core/services/geolocation/geolocation.service.mjs +63 -0
  131. package/esm2020/lib/core/services/language/language-helper.service.mjs +129 -0
  132. package/esm2020/lib/core/services/sort/sort.service.mjs +22 -0
  133. package/esm2020/lib/core/services/viewport/viewport.service.mjs +32 -0
  134. package/esm2020/lib/services/get-position.service.mjs +23 -0
  135. package/esm2020/norwegian-core-components.mjs +5 -0
  136. package/fesm2015/norwegian-core-components.mjs +11843 -0
  137. package/fesm2015/norwegian-core-components.mjs.map +1 -0
  138. package/fesm2020/norwegian-core-components.mjs +11829 -0
  139. package/fesm2020/norwegian-core-components.mjs.map +1 -0
  140. package/index.d.ts +5 -0
  141. package/lib/components/accordion/accordion.component.d.ts +3 -0
  142. package/lib/components/accordion/accordion.module.d.ts +8 -0
  143. package/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.d.ts +5 -2
  144. package/lib/components/airport-select/airport-select.component.d.ts +5 -2
  145. package/lib/components/airport-select/airport-select.module.d.ts +11 -0
  146. package/lib/components/airport-select/services/airport-select-dropdown.service.d.ts +3 -0
  147. package/lib/components/airport-select/services/airport-select.service.d.ts +3 -0
  148. package/lib/components/autocomplete/autocomplete.component.d.ts +5 -2
  149. package/lib/components/autocomplete/autocomplete.module.d.ts +11 -0
  150. package/lib/components/backdrop/backdrop.component.d.ts +3 -0
  151. package/lib/components/backdrop/backdrop.module.d.ts +7 -0
  152. package/lib/components/box/box.component.d.ts +3 -4
  153. package/lib/components/box/box.module.d.ts +7 -0
  154. package/lib/components/button/button.component.d.ts +3 -0
  155. package/lib/components/button/button.module.d.ts +8 -0
  156. package/lib/components/checkbox/checkbox.component.d.ts +5 -2
  157. package/lib/components/checkbox/checkbox.module.d.ts +8 -0
  158. package/lib/components/chip/chip.component.d.ts +3 -0
  159. package/lib/components/chip/chip.module.d.ts +7 -0
  160. package/lib/components/container/container.component.d.ts +3 -4
  161. package/lib/components/container/container.module.d.ts +7 -0
  162. package/lib/components/continue/continue.component.d.ts +3 -0
  163. package/lib/components/continue/continue.module.d.ts +9 -0
  164. package/lib/components/cover/cover.component.d.ts +3 -0
  165. package/lib/components/cover/cover.module.d.ts +9 -0
  166. package/lib/components/datepicker/calendar/calendar.component.d.ts +5 -2
  167. package/lib/components/datepicker/datepicker.component.d.ts +5 -2
  168. package/lib/components/datepicker/datepicker.module.d.ts +14 -0
  169. package/lib/components/datepicker/services/calendar.service.d.ts +3 -0
  170. package/lib/components/datepicker-combo/datepicker-combo.component.d.ts +3 -0
  171. package/lib/components/datepicker-combo/datepicker-combo.module.d.ts +8 -0
  172. package/lib/components/divider/divider.component.d.ts +3 -4
  173. package/lib/components/divider/divider.module.d.ts +8 -0
  174. package/lib/components/dropdown/dropdown.component.d.ts +3 -0
  175. package/lib/components/dropdown/dropdown.module.d.ts +9 -0
  176. package/lib/components/filter/filter.component.d.ts +5 -2
  177. package/lib/components/filter/filter.module.d.ts +18 -0
  178. package/lib/components/grid/col/col.component.d.ts +4 -1
  179. package/lib/components/grid/grid.component.d.ts +3 -4
  180. package/lib/components/grid/grid.module.d.ts +8 -0
  181. package/lib/components/icon/icon.component.d.ts +3 -4
  182. package/lib/components/icon/icon.module.d.ts +7 -0
  183. package/lib/components/icon-list/icon-list.component.d.ts +3 -0
  184. package/lib/components/icon-list/icon-list.module.d.ts +8 -0
  185. package/lib/components/info/info.component.d.ts +3 -0
  186. package/lib/components/info/info.module.d.ts +10 -0
  187. package/lib/components/input/input.component.d.ts +5 -2
  188. package/lib/components/input/input.module.d.ts +9 -0
  189. package/lib/components/journey/journey.component.d.ts +3 -0
  190. package/lib/components/journey/journey.module.d.ts +8 -0
  191. package/lib/components/journey-availability/journey-availability.component.d.ts +3 -0
  192. package/lib/components/journey-availability/journey-availability.module.d.ts +10 -0
  193. package/lib/components/journey-availability-list/journey-availability-list.component.d.ts +3 -0
  194. package/lib/components/journey-availability-list/journey-availability-list.module.d.ts +10 -0
  195. package/lib/components/journey-selection/journey-selection.component.d.ts +3 -0
  196. package/lib/components/journey-selection/journey-selection.module.d.ts +9 -0
  197. package/lib/components/journey-stopover/journey-stopover.component.d.ts +3 -0
  198. package/lib/components/journey-stopover/journey-stopover.module.d.ts +8 -0
  199. package/lib/components/list/list-item/list-item.component.d.ts +3 -0
  200. package/lib/components/list/list.component.d.ts +4 -1
  201. package/lib/components/list/list.module.d.ts +8 -0
  202. package/lib/components/modal/modal.component.d.ts +3 -0
  203. package/lib/components/modal/modal.module.d.ts +10 -0
  204. package/lib/components/number-field/number-field.component.d.ts +5 -2
  205. package/lib/components/number-field/number-field.module.d.ts +10 -0
  206. package/lib/components/page-footer/page-footer.component.d.ts +3 -0
  207. package/lib/components/page-footer/page-footer.module.d.ts +9 -0
  208. package/lib/components/page-header/hamburger/hamburger.component.d.ts +3 -0
  209. package/lib/components/page-header/page-header.component.d.ts +3 -0
  210. package/lib/components/page-header/page-header.module.d.ts +11 -0
  211. package/lib/components/page-header/search/search.component.d.ts +3 -0
  212. package/lib/components/passenger-select/models/passengers.model.d.ts +2 -2
  213. package/lib/components/passenger-select/passenger-select.component.d.ts +5 -2
  214. package/lib/components/passenger-select/passenger-select.module.d.ts +8 -0
  215. package/lib/components/phone-number/phone-number.component.d.ts +5 -2
  216. package/lib/components/phone-number/phone-number.module.d.ts +11 -0
  217. package/lib/components/premium-toggle/premium-toggle.component.d.ts +3 -0
  218. package/lib/components/premium-toggle/premium-toggle.module.d.ts +8 -0
  219. package/lib/components/radio/radio.component.d.ts +5 -2
  220. package/lib/components/radio/radio.module.d.ts +8 -0
  221. package/lib/components/select/optgroup/optgroup.component.d.ts +3 -0
  222. package/lib/components/select/option/option.component.d.ts +3 -0
  223. package/lib/components/select/select.component.d.ts +6 -3
  224. package/lib/components/select/select.module.d.ts +10 -0
  225. package/lib/components/simple-list/simple-list.component.d.ts +4 -1
  226. package/lib/components/simple-list/simple-list.module.d.ts +7 -0
  227. package/lib/components/slide-toggle/slide-toggle.component.d.ts +5 -2
  228. package/lib/components/slide-toggle/slide-toggle.module.d.ts +8 -0
  229. package/lib/components/slider/slider.component.d.ts +5 -2
  230. package/lib/components/slider/slider.module.d.ts +8 -0
  231. package/lib/components/sort/sort.component.d.ts +3 -0
  232. package/lib/components/sort/sort.module.d.ts +10 -0
  233. package/lib/components/spinner/spinner.component.d.ts +11 -4
  234. package/lib/components/spinner/spinner.module.d.ts +7 -0
  235. package/lib/components/subsidy-discount/subsidy-discount.component.d.ts +3 -0
  236. package/lib/components/subsidy-discount/subsidy-discount.module.d.ts +10 -0
  237. package/lib/components/suggestions/suggestions.component.d.ts +3 -0
  238. package/lib/components/suggestions/suggestions.module.d.ts +8 -0
  239. package/lib/components/tab-group/tab/tab.component.d.ts +3 -0
  240. package/lib/components/tab-group/tab-group.component.d.ts +3 -0
  241. package/lib/components/tab-group/tab-group.module.d.ts +9 -0
  242. package/lib/components/table/column/column.component.d.ts +3 -0
  243. package/lib/components/table/column-group/column-group.component.d.ts +3 -0
  244. package/lib/components/table/services/table.service.d.ts +3 -0
  245. package/lib/components/table/table-body/table-body.component.d.ts +3 -0
  246. package/lib/components/table/table-foot/table-foot.component.d.ts +3 -0
  247. package/lib/components/table/table-head/table-head.component.d.ts +3 -0
  248. package/lib/components/table/table-row/table-data/table-data.component.d.ts +3 -0
  249. package/lib/components/table/table-row/table-header/table-header.component.d.ts +3 -0
  250. package/lib/components/table/table-row/table-row.component.d.ts +3 -0
  251. package/lib/components/table/table.component.d.ts +3 -0
  252. package/lib/components/table/table.module.d.ts +15 -0
  253. package/lib/components/textarea/textarea.component.d.ts +5 -2
  254. package/lib/components/textarea/textarea.module.d.ts +8 -0
  255. package/lib/components/toggle/toggle.component.d.ts +6 -3
  256. package/lib/components/toggle/toggle.module.d.ts +9 -0
  257. package/lib/components/trip-summary/trip-summary.component.d.ts +3 -0
  258. package/lib/components/trip-summary/trip-summary.module.d.ts +10 -0
  259. package/lib/components/weather-icon/weather-icon.component.d.ts +3 -0
  260. package/lib/components/weather-icon/weather-icon.module.d.ts +7 -0
  261. package/lib/core/directives/nas-class/nas-class.directive.d.ts +3 -0
  262. package/lib/core/directives/nas-class/nas-class.module.d.ts +6 -0
  263. package/lib/core/services/abandoned-basket/abandoned-basket.service.d.ts +3 -0
  264. package/lib/core/services/animate-helper/animate-helper.service.d.ts +3 -0
  265. package/lib/core/services/bem-helper/bem-helper.service.d.ts +3 -0
  266. package/lib/core/services/date/date-helper.service.d.ts +3 -0
  267. package/lib/core/services/device/device-helper.service.d.ts +3 -0
  268. package/lib/core/services/geolocation/geolocation.service.d.ts +3 -0
  269. package/lib/core/services/language/language-helper.service.d.ts +3 -0
  270. package/lib/core/services/sort/sort.service.d.ts +3 -0
  271. package/lib/core/services/viewport/viewport.service.d.ts +3 -0
  272. package/lib/services/get-position.service.d.ts +3 -0
  273. package/package.json +21 -9
  274. package/bundles/norwegian-core-components.umd.js +0 -12174
  275. package/bundles/norwegian-core-components.umd.js.map +0 -1
  276. package/esm2015/lib/components/accordion/accordion.component.js +0 -130
  277. package/esm2015/lib/components/accordion/accordion.module.js +0 -15
  278. package/esm2015/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.js +0 -583
  279. package/esm2015/lib/components/airport-select/airport-select.component.js +0 -400
  280. package/esm2015/lib/components/airport-select/airport-select.module.js +0 -27
  281. package/esm2015/lib/components/airport-select/services/airport-select-dropdown.service.js +0 -34
  282. package/esm2015/lib/components/airport-select/services/airport-select.service.js +0 -37
  283. package/esm2015/lib/components/autocomplete/autocomplete.component.js +0 -265
  284. package/esm2015/lib/components/autocomplete/autocomplete.module.js +0 -26
  285. package/esm2015/lib/components/backdrop/backdrop.component.js +0 -54
  286. package/esm2015/lib/components/backdrop/backdrop.module.js +0 -17
  287. package/esm2015/lib/components/box/box.component.js +0 -61
  288. package/esm2015/lib/components/box/box.module.js +0 -14
  289. package/esm2015/lib/components/button/button.component.js +0 -140
  290. package/esm2015/lib/components/button/button.module.js +0 -15
  291. package/esm2015/lib/components/checkbox/checkbox.component.js +0 -127
  292. package/esm2015/lib/components/checkbox/checkbox.module.js +0 -15
  293. package/esm2015/lib/components/chip/chip.component.js +0 -50
  294. package/esm2015/lib/components/chip/chip.module.js +0 -17
  295. package/esm2015/lib/components/container/container.component.js +0 -47
  296. package/esm2015/lib/components/container/container.module.js +0 -14
  297. package/esm2015/lib/components/continue/continue.component.js +0 -173
  298. package/esm2015/lib/components/continue/continue.module.js +0 -23
  299. package/esm2015/lib/components/cover/cover.component.js +0 -61
  300. package/esm2015/lib/components/cover/cover.module.js +0 -16
  301. package/esm2015/lib/components/datepicker/calendar/calendar.component.js +0 -560
  302. package/esm2015/lib/components/datepicker/datepicker.component.js +0 -515
  303. package/esm2015/lib/components/datepicker/datepicker.module.js +0 -34
  304. package/esm2015/lib/components/datepicker/services/calendar.service.js +0 -217
  305. package/esm2015/lib/components/datepicker-combo/datepicker-combo.component.js +0 -317
  306. package/esm2015/lib/components/datepicker-combo/datepicker-combo.module.js +0 -22
  307. package/esm2015/lib/components/divider/divider.component.js +0 -53
  308. package/esm2015/lib/components/divider/divider.module.js +0 -15
  309. package/esm2015/lib/components/dropdown/dropdown.component.js +0 -150
  310. package/esm2015/lib/components/dropdown/dropdown.module.js +0 -21
  311. package/esm2015/lib/components/filter/filter.component.js +0 -1122
  312. package/esm2015/lib/components/filter/filter.module.js +0 -44
  313. package/esm2015/lib/components/grid/col/col.component.js +0 -49
  314. package/esm2015/lib/components/grid/grid.component.js +0 -63
  315. package/esm2015/lib/components/grid/grid.module.js +0 -15
  316. package/esm2015/lib/components/icon/icon.component.js +0 -42
  317. package/esm2015/lib/components/icon/icon.module.js +0 -17
  318. package/esm2015/lib/components/icon-list/icon-list.component.js +0 -46
  319. package/esm2015/lib/components/icon-list/icon-list.module.js +0 -15
  320. package/esm2015/lib/components/info/info.component.js +0 -94
  321. package/esm2015/lib/components/info/info.module.js +0 -23
  322. package/esm2015/lib/components/input/input.component.js +0 -148
  323. package/esm2015/lib/components/input/input.module.js +0 -16
  324. package/esm2015/lib/components/journey/journey.component.js +0 -122
  325. package/esm2015/lib/components/journey/journey.module.js +0 -19
  326. package/esm2015/lib/components/journey-availability/journey-availability.component.js +0 -125
  327. package/esm2015/lib/components/journey-availability/journey-availability.module.js +0 -26
  328. package/esm2015/lib/components/journey-availability-list/journey-availability-list.component.js +0 -175
  329. package/esm2015/lib/components/journey-selection/journey-selection.component.js +0 -110
  330. package/esm2015/lib/components/journey-selection/journey-selection.module.js +0 -24
  331. package/esm2015/lib/components/journey-stopover/journey-stopover.component.js +0 -121
  332. package/esm2015/lib/components/journey-stopover/journey-stopover.module.js +0 -19
  333. package/esm2015/lib/components/list/list-item/list-item.component.js +0 -56
  334. package/esm2015/lib/components/list/list.component.js +0 -75
  335. package/esm2015/lib/components/list/list.module.js +0 -15
  336. package/esm2015/lib/components/modal/modal.component.js +0 -131
  337. package/esm2015/lib/components/modal/modal.module.js +0 -25
  338. package/esm2015/lib/components/number-field/number-field.component.js +0 -118
  339. package/esm2015/lib/components/number-field/number-field.module.js +0 -24
  340. package/esm2015/lib/components/page-footer/page-footer.component.js +0 -49
  341. package/esm2015/lib/components/page-footer/page-footer.module.js +0 -16
  342. package/esm2015/lib/components/page-header/hamburger/hamburger.component.js +0 -24
  343. package/esm2015/lib/components/page-header/page-header.component.js +0 -126
  344. package/esm2015/lib/components/page-header/page-header.module.js +0 -18
  345. package/esm2015/lib/components/page-header/search/search.component.js +0 -47
  346. package/esm2015/lib/components/passenger-select/passenger-select.component.js +0 -207
  347. package/esm2015/lib/components/passenger-select/passenger-select.module.js +0 -19
  348. package/esm2015/lib/components/phone-number/phone-number.component.js +0 -115
  349. package/esm2015/lib/components/phone-number/phone-number.module.js +0 -27
  350. package/esm2015/lib/components/premium-toggle/premium-toggle.component.js +0 -66
  351. package/esm2015/lib/components/premium-toggle/premium-toggle.module.js +0 -19
  352. package/esm2015/lib/components/radio/radio.component.js +0 -79
  353. package/esm2015/lib/components/radio/radio.module.js +0 -15
  354. package/esm2015/lib/components/select/optgroup/optgroup.component.js +0 -31
  355. package/esm2015/lib/components/select/option/option.component.js +0 -29
  356. package/esm2015/lib/components/select/select.component.js +0 -325
  357. package/esm2015/lib/components/select/select.module.js +0 -21
  358. package/esm2015/lib/components/simple-list/simple-list.component.js +0 -42
  359. package/esm2015/lib/components/simple-list/simple-list.module.js +0 -14
  360. package/esm2015/lib/components/slide-toggle/slide-toggle.component.js +0 -105
  361. package/esm2015/lib/components/slide-toggle/slide-toggle.module.js +0 -20
  362. package/esm2015/lib/components/slider/slider.component.js +0 -475
  363. package/esm2015/lib/components/slider/slider.module.js +0 -19
  364. package/esm2015/lib/components/sort/sort.component.js +0 -87
  365. package/esm2015/lib/components/sort/sort.module.js +0 -23
  366. package/esm2015/lib/components/spinner/spinner.component.js +0 -84
  367. package/esm2015/lib/components/spinner/spinner.module.js +0 -14
  368. package/esm2015/lib/components/subsidy-discount/subsidy-discount.component.js +0 -101
  369. package/esm2015/lib/components/subsidy-discount/subsidy-discount.module.js +0 -23
  370. package/esm2015/lib/components/suggestions/suggestions.component.js +0 -40
  371. package/esm2015/lib/components/suggestions/suggestions.module.js +0 -19
  372. package/esm2015/lib/components/tab-group/tab/tab.component.js +0 -123
  373. package/esm2015/lib/components/tab-group/tab-group.component.js +0 -85
  374. package/esm2015/lib/components/tab-group/tab-group.module.js +0 -20
  375. package/esm2015/lib/components/table/column/column.component.js +0 -17
  376. package/esm2015/lib/components/table/column-group/column-group.component.js +0 -34
  377. package/esm2015/lib/components/table/services/table.service.js +0 -20
  378. package/esm2015/lib/components/table/table-body/table-body.component.js +0 -27
  379. package/esm2015/lib/components/table/table-foot/table-foot.component.js +0 -27
  380. package/esm2015/lib/components/table/table-head/table-head.component.js +0 -27
  381. package/esm2015/lib/components/table/table-row/table-data/table-data.component.js +0 -15
  382. package/esm2015/lib/components/table/table-row/table-header/table-header.component.js +0 -15
  383. package/esm2015/lib/components/table/table-row/table-row.component.js +0 -27
  384. package/esm2015/lib/components/table/table.component.js +0 -29
  385. package/esm2015/lib/components/table/table.module.js +0 -45
  386. package/esm2015/lib/components/textarea/textarea.component.js +0 -73
  387. package/esm2015/lib/components/textarea/textarea.module.js +0 -20
  388. package/esm2015/lib/components/toggle/toggle.component.js +0 -86
  389. package/esm2015/lib/components/toggle/toggle.module.js +0 -22
  390. package/esm2015/lib/components/trip-summary/trip-summary.component.js +0 -152
  391. package/esm2015/lib/components/trip-summary/trip-summary.module.js +0 -23
  392. package/esm2015/lib/components/weather-icon/weather-icon.component.js +0 -56
  393. package/esm2015/lib/components/weather-icon/weather-icon.module.js +0 -14
  394. package/esm2015/lib/core/base/nas-component.base.js +0 -48
  395. package/esm2015/lib/core/directives/nas-class/nas-class.directive.js +0 -75
  396. package/esm2015/lib/core/directives/nas-class/nas-class.module.js +0 -17
  397. package/esm2015/lib/core/services/abandoned-basket/abandoned-basket.service.js +0 -55
  398. package/esm2015/lib/core/services/animate-helper/animate-helper.service.js +0 -47
  399. package/esm2015/lib/core/services/bem-helper/bem-helper.service.js +0 -41
  400. package/esm2015/lib/core/services/date/date-helper.service.js +0 -196
  401. package/esm2015/lib/core/services/device/device-helper.service.js +0 -43
  402. package/esm2015/lib/core/services/geolocation/geolocation.service.js +0 -60
  403. package/esm2015/lib/core/services/language/language-helper.service.js +0 -162
  404. package/esm2015/lib/core/services/sort/sort.service.js +0 -19
  405. package/esm2015/lib/core/services/viewport/viewport.service.js +0 -29
  406. package/esm2015/lib/services/get-position.service.js +0 -21
  407. package/esm2015/norwegian-core-components.js +0 -12
  408. package/fesm2015/norwegian-core-components.js +0 -10835
  409. package/fesm2015/norwegian-core-components.js.map +0 -1
  410. package/norwegian-core-components.d.ts +0 -11
  411. package/norwegian-core-components.metadata.json +0 -1
  412. /package/{esm2015/lib/components/accordion/index.js → esm2020/lib/components/accordion/index.mjs} +0 -0
  413. /package/{esm2015/lib/components/airport-select/index.js → esm2020/lib/components/airport-select/index.mjs} +0 -0
  414. /package/{esm2015/lib/components/airport-select/models/airport.model.js → esm2020/lib/components/airport-select/models/airport.model.mjs} +0 -0
  415. /package/{esm2015/lib/components/airport-select/models/results-labels.model.js → esm2020/lib/components/airport-select/models/results-labels.model.mjs} +0 -0
  416. /package/{esm2015/lib/components/autocomplete/index.js → esm2020/lib/components/autocomplete/index.mjs} +0 -0
  417. /package/{esm2015/lib/components/autocomplete/models/autocomplete.model.js → esm2020/lib/components/autocomplete/models/autocomplete.model.mjs} +0 -0
  418. /package/{esm2015/lib/components/backdrop/index.js → esm2020/lib/components/backdrop/index.mjs} +0 -0
  419. /package/{esm2015/lib/components/box/index.js → esm2020/lib/components/box/index.mjs} +0 -0
  420. /package/{esm2015/lib/components/button/index.js → esm2020/lib/components/button/index.mjs} +0 -0
  421. /package/{esm2015/lib/components/checkbox/index.js → esm2020/lib/components/checkbox/index.mjs} +0 -0
  422. /package/{esm2015/lib/components/chip/index.js → esm2020/lib/components/chip/index.mjs} +0 -0
  423. /package/{esm2015/lib/components/container/index.js → esm2020/lib/components/container/index.mjs} +0 -0
  424. /package/{esm2015/lib/components/continue/index.js → esm2020/lib/components/continue/index.mjs} +0 -0
  425. /package/{esm2015/lib/components/cover/index.js → esm2020/lib/components/cover/index.mjs} +0 -0
  426. /package/{esm2015/lib/components/datepicker/calendar/calendar-date.model.js → esm2020/lib/components/datepicker/calendar/calendar-date.model.mjs} +0 -0
  427. /package/{esm2015/lib/components/datepicker/calendar/enums/week-start.enum.js → esm2020/lib/components/datepicker/calendar/enums/week-start.enum.mjs} +0 -0
  428. /package/{esm2015/lib/components/datepicker/calendar/models/day.model.js → esm2020/lib/components/datepicker/calendar/models/day.model.mjs} +0 -0
  429. /package/{esm2015/lib/components/datepicker/calendar/models/select-option.model.js → esm2020/lib/components/datepicker/calendar/models/select-option.model.mjs} +0 -0
  430. /package/{esm2015/lib/components/datepicker/calendar/models/week.model.js → esm2020/lib/components/datepicker/calendar/models/week.model.mjs} +0 -0
  431. /package/{esm2015/lib/components/datepicker/index.js → esm2020/lib/components/datepicker/index.mjs} +0 -0
  432. /package/{esm2015/lib/components/datepicker-combo/index.js → esm2020/lib/components/datepicker-combo/index.mjs} +0 -0
  433. /package/{esm2015/lib/components/divider/index.js → esm2020/lib/components/divider/index.mjs} +0 -0
  434. /package/{esm2015/lib/components/dropdown/index.js → esm2020/lib/components/dropdown/index.mjs} +0 -0
  435. /package/{esm2015/lib/components/filter/enums/trip-type.enum.js → esm2020/lib/components/filter/enums/trip-type.enum.mjs} +0 -0
  436. /package/{esm2015/lib/components/filter/index.js → esm2020/lib/components/filter/index.mjs} +0 -0
  437. /package/{esm2015/lib/components/grid/index.js → esm2020/lib/components/grid/index.mjs} +0 -0
  438. /package/{esm2015/lib/components/icon/index.js → esm2020/lib/components/icon/index.mjs} +0 -0
  439. /package/{esm2015/lib/components/icon-list/icon-list.model.js → esm2020/lib/components/icon-list/icon-list.model.mjs} +0 -0
  440. /package/{esm2015/lib/components/icon-list/index.js → esm2020/lib/components/icon-list/index.mjs} +0 -0
  441. /package/{esm2015/lib/components/index.js → esm2020/lib/components/index.mjs} +0 -0
  442. /package/{esm2015/lib/components/info/index.js → esm2020/lib/components/info/index.mjs} +0 -0
  443. /package/{esm2015/lib/components/info/models/info.model.js → esm2020/lib/components/info/models/info.model.mjs} +0 -0
  444. /package/{esm2015/lib/components/input/index.js → esm2020/lib/components/input/index.mjs} +0 -0
  445. /package/{esm2015/lib/components/journey/index.js → esm2020/lib/components/journey/index.mjs} +0 -0
  446. /package/{esm2015/lib/components/journey/models/journey-flight.model.js → esm2020/lib/components/journey/models/journey-flight.model.mjs} +0 -0
  447. /package/{esm2015/lib/components/journey/models/journey.model.js → esm2020/lib/components/journey/models/journey.model.mjs} +0 -0
  448. /package/{esm2015/lib/components/journey-availability/index.js → esm2020/lib/components/journey-availability/index.mjs} +0 -0
  449. /package/{esm2015/lib/components/journey-availability-list/enums/availability-sort-option.enum.js → esm2020/lib/components/journey-availability-list/enums/availability-sort-option.enum.mjs} +0 -0
  450. /package/{esm2015/lib/components/journey-availability-list/index.js → esm2020/lib/components/journey-availability-list/index.mjs} +0 -0
  451. /package/{esm2015/lib/components/journey-selection/index.js → esm2020/lib/components/journey-selection/index.mjs} +0 -0
  452. /package/{esm2015/lib/components/journey-selection/models/journey-selection-collapsed.model.js → esm2020/lib/components/journey-selection/models/journey-selection-collapsed.model.mjs} +0 -0
  453. /package/{esm2015/lib/components/journey-selection/models/journey-selection-common.model.js → esm2020/lib/components/journey-selection/models/journey-selection-common.model.mjs} +0 -0
  454. /package/{esm2015/lib/components/journey-selection/models/journey-selection-expanded.model.js → esm2020/lib/components/journey-selection/models/journey-selection-expanded.model.mjs} +0 -0
  455. /package/{esm2015/lib/components/journey-selection/models/journey-selection.model.js → esm2020/lib/components/journey-selection/models/journey-selection.model.mjs} +0 -0
  456. /package/{esm2015/lib/components/journey-stopover/index.js → esm2020/lib/components/journey-stopover/index.mjs} +0 -0
  457. /package/{esm2015/lib/components/journey-stopover/models/stopover-time.model.js → esm2020/lib/components/journey-stopover/models/stopover-time.model.mjs} +0 -0
  458. /package/{esm2015/lib/components/list/index.js → esm2020/lib/components/list/index.mjs} +0 -0
  459. /package/{esm2015/lib/components/modal/index.js → esm2020/lib/components/modal/index.mjs} +0 -0
  460. /package/{esm2015/lib/components/number-field/index.js → esm2020/lib/components/number-field/index.mjs} +0 -0
  461. /package/{esm2015/lib/components/page-footer/index.js → esm2020/lib/components/page-footer/index.mjs} +0 -0
  462. /package/{esm2015/lib/components/page-header/index.js → esm2020/lib/components/page-header/index.mjs} +0 -0
  463. /package/{esm2015/lib/components/passenger-select/enums/passenger-type.enum.js → esm2020/lib/components/passenger-select/enums/passenger-type.enum.mjs} +0 -0
  464. /package/{esm2015/lib/components/passenger-select/index.js → esm2020/lib/components/passenger-select/index.mjs} +0 -0
  465. /package/{esm2015/lib/components/phone-number/index.js → esm2020/lib/components/phone-number/index.mjs} +0 -0
  466. /package/{esm2015/lib/components/premium-toggle/index.js → esm2020/lib/components/premium-toggle/index.mjs} +0 -0
  467. /package/{esm2015/lib/components/radio/index.js → esm2020/lib/components/radio/index.mjs} +0 -0
  468. /package/{esm2015/lib/components/select/index.js → esm2020/lib/components/select/index.mjs} +0 -0
  469. /package/{esm2015/lib/components/select/models/select-option.model.js → esm2020/lib/components/select/models/select-option.model.mjs} +0 -0
  470. /package/{esm2015/lib/components/simple-list/index.js → esm2020/lib/components/simple-list/index.mjs} +0 -0
  471. /package/{esm2015/lib/components/slide-toggle/index.js → esm2020/lib/components/slide-toggle/index.mjs} +0 -0
  472. /package/{esm2015/lib/components/slider/index.js → esm2020/lib/components/slider/index.mjs} +0 -0
  473. /package/{esm2015/lib/components/sort/index.js → esm2020/lib/components/sort/index.mjs} +0 -0
  474. /package/{esm2015/lib/components/spinner/index.js → esm2020/lib/components/spinner/index.mjs} +0 -0
  475. /package/{esm2015/lib/components/subsidy-discount/index.js → esm2020/lib/components/subsidy-discount/index.mjs} +0 -0
  476. /package/{esm2015/lib/components/subsidy-discount/models/subsidy-discount.model.js → esm2020/lib/components/subsidy-discount/models/subsidy-discount.model.mjs} +0 -0
  477. /package/{esm2015/lib/components/suggestions/index.js → esm2020/lib/components/suggestions/index.mjs} +0 -0
  478. /package/{esm2015/lib/components/tab-group/index.js → esm2020/lib/components/tab-group/index.mjs} +0 -0
  479. /package/{esm2015/lib/components/table/index.js → esm2020/lib/components/table/index.mjs} +0 -0
  480. /package/{esm2015/lib/components/textarea/index.js → esm2020/lib/components/textarea/index.mjs} +0 -0
  481. /package/{esm2015/lib/components/toggle/index.js → esm2020/lib/components/toggle/index.mjs} +0 -0
  482. /package/{esm2015/lib/components/toggle/models/options.model.js → esm2020/lib/components/toggle/models/options.model.mjs} +0 -0
  483. /package/{esm2015/lib/components/trip-summary/index.js → esm2020/lib/components/trip-summary/index.mjs} +0 -0
  484. /package/{esm2015/lib/components/weather-icon/index.js → esm2020/lib/components/weather-icon/index.mjs} +0 -0
  485. /package/{esm2015/lib/core/decorators/debounce.decorator.js → esm2020/lib/core/decorators/debounce.decorator.mjs} +0 -0
  486. /package/{esm2015/lib/core/directives/index.js → esm2020/lib/core/directives/index.mjs} +0 -0
  487. /package/{esm2015/lib/core/index.js → esm2020/lib/core/index.mjs} +0 -0
  488. /package/{esm2015/lib/core/models/abandoned-basket-item.model.js → esm2020/lib/core/models/abandoned-basket-item.model.mjs} +0 -0
  489. /package/{esm2015/lib/core/models/animate.model.js → esm2020/lib/core/models/animate.model.mjs} +0 -0
  490. /package/{esm2015/lib/core/models/class.model.js → esm2020/lib/core/models/class.model.mjs} +0 -0
  491. /package/{esm2015/lib/core/models/index.js → esm2020/lib/core/models/index.mjs} +0 -0
  492. /package/{esm2015/lib/core/models/link.model.js → esm2020/lib/core/models/link.model.mjs} +0 -0
  493. /package/{esm2015/lib/core/models/position.model.js → esm2020/lib/core/models/position.model.mjs} +0 -0
  494. /package/{esm2015/lib/core/models/utc-date.model.js → esm2020/lib/core/models/utc-date.model.mjs} +0 -0
  495. /package/{esm2015/lib/core/services/date/date-compare.enum.js → esm2020/lib/core/services/date/date-compare.enum.mjs} +0 -0
  496. /package/{esm2015/lib/core/services/geolocation/geolocation-state.enum.js → esm2020/lib/core/services/geolocation/geolocation-state.enum.mjs} +0 -0
  497. /package/{esm2015/lib/core/services/index.js → esm2020/lib/core/services/index.mjs} +0 -0
  498. /package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
  499. /package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  500. /package/{esm2015/lib/shared/index.js → esm2020/lib/shared/index.mjs} +0 -0
  501. /package/{esm2015/lib/shared/models/flight-details.js → esm2020/lib/shared/models/flight-details.mjs} +0 -0
  502. /package/{esm2015/lib/shared/models/index.js → esm2020/lib/shared/models/index.mjs} +0 -0
  503. /package/{esm2015/lib/shared/models/journey-availability-sort.model.js → esm2020/lib/shared/models/journey-availability-sort.model.mjs} +0 -0
  504. /package/{esm2015/lib/shared/models/journey-availability.model.js → esm2020/lib/shared/models/journey-availability.model.mjs} +0 -0
  505. /package/{esm2015/lib/shared/models/journey-details.model.js → esm2020/lib/shared/models/journey-details.model.mjs} +0 -0
  506. /package/{esm2015/lib/shared/models/journey-duration.model.js → esm2020/lib/shared/models/journey-duration.model.mjs} +0 -0
  507. /package/{esm2015/lib/shared/models/journey-stopover.model.js → esm2020/lib/shared/models/journey-stopover.model.mjs} +0 -0
  508. /package/{esm2015/lib/shared/models/journey-transit-info.model.js → esm2020/lib/shared/models/journey-transit-info.model.mjs} +0 -0
  509. /package/{esm2015/lib/shared/models/operating-carrier.model.js → esm2020/lib/shared/models/operating-carrier.model.mjs} +0 -0
  510. /package/{esm2015/lib/shared/models/sort-option.model.js → esm2020/lib/shared/models/sort-option.model.mjs} +0 -0
  511. /package/{esm2015/lib/shared/models/sort.model.js → esm2020/lib/shared/models/sort.model.mjs} +0 -0
  512. /package/{esm2015/lib/shared/models/trip-item-details.model.js → esm2020/lib/shared/models/trip-item-details.model.mjs} +0 -0
  513. /package/{esm2015/lib/shared/models/trip-summary-details.model.js → esm2020/lib/shared/models/trip-summary-details.model.mjs} +0 -0
  514. /package/{esm2015/lib/shared/models/trip-summary.model.js → esm2020/lib/shared/models/trip-summary.model.mjs} +0 -0
  515. /package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
@@ -1,1122 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Norwegian Air Shuttle. All Rights Reserved.
4
- */
5
- import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, ChangeDetectorRef } from '@angular/core';
6
- import { BehaviorSubject } from 'rxjs';
7
- import { TripType } from './enums/trip-type.enum';
8
- import { NasComponentBase } from '../../core/base/nas-component.base';
9
- import { AbandonedBasketService } from '../../core/services/abandoned-basket/abandoned-basket.service';
10
- import { DateHelper } from '../../core/services/date/date-helper.service';
11
- import { DeviceHelper } from '../../core/services/device/device-helper.service';
12
- import { SortService } from '../../core/services/sort/sort.service';
13
- /**
14
- * @description
15
- * Norwegian Filter Component | Functional
16
- */
17
- export class FilterComponent extends NasComponentBase {
18
- constructor(deviceHelper, sortService, abandonedBasketService, dateService, elementRef, changeDetector) {
19
- super('nas-filter');
20
- this.deviceHelper = deviceHelper;
21
- this.sortService = sortService;
22
- this.abandonedBasketService = abandonedBasketService;
23
- this.dateService = dateService;
24
- this.elementRef = elementRef;
25
- this.changeDetector = changeDetector;
26
- this.displaySummary = true;
27
- this.containerWidth = new BehaviorSubject(0);
28
- this.maximize = false;
29
- this.isNasGroupValid = false;
30
- /**
31
- * @description
32
- * A separator for the filter summary that is dispayed if minimizeOnMobile is true.
33
- *
34
- * ### Example
35
- * 1 traveller, round trip and direct/transit
36
- */
37
- this.defaultSummarySeparator = '';
38
- /**
39
- * A separator for the filter summary is are dispayed if minimizeOnMobile is true.
40
- *
41
- * ### Example
42
- * 1 traveller, round trip and direct/transit
43
- */
44
- this.lastSummarySeparator = '';
45
- /**
46
- * @description
47
- * A placeholder that will appear on the origin airport input field.
48
- */
49
- this.placeholderOrigin = '';
50
- /**
51
- * @description
52
- * A placeholder that will appear on the destination airport input field.
53
- */
54
- this.placeholderDestination = '';
55
- /**
56
- * @description
57
- * An event that is fired every time the origin dropdown selector opens or closes.
58
- */
59
- this.originOpenChange = new EventEmitter();
60
- /**
61
- * @description
62
- * An event that is fired every time the origin dropdown selector opens or closes.
63
- */
64
- this.destinationOpenChange = new EventEmitter();
65
- /**
66
- * @description
67
- * An event that is fired every time the passenger select dropdown opens or closes.
68
- */
69
- this.passengerSelectOpenChange = new EventEmitter();
70
- /**
71
- * @description
72
- * An event that is fired every time the selected origin airport changes.
73
- */
74
- this.originChange = new EventEmitter();
75
- /**
76
- * @description
77
- * An event that is fired every time the selected destination airport changes.
78
- */
79
- this.destinationChange = new EventEmitter();
80
- /**
81
- * @description
82
- * An event that is fired every time a passenger selection change is performed.
83
- */
84
- this.passengersChange = new EventEmitter();
85
- /**
86
- * @description
87
- * Sets and gets the selected trip type.
88
- */
89
- this.tripTypeChange = new EventEmitter();
90
- /**
91
- * @description
92
- * Sets and gets whether the selected transit type is direct only or not.
93
- */
94
- this.directOnlyChange = new EventEmitter();
95
- /**
96
- * @description
97
- * The display format of the date when user has selected the date and it is being shown in the input box for the date picker.
98
- * Please look at the angular Date pipe for valid formats and variations.
99
- */
100
- this.dateDisplayFormat = 'EEEE d, MMMM yyyy';
101
- /**
102
- * @description
103
- * The time display format.
104
- */
105
- this.timeDisplayFormat = 'HH:mm';
106
- /**
107
- * @description
108
- * A locale code for the locale format rules to use. When not supplied, uses the value of LOCALE_ID, which is en-US by default.
109
- * This requires that registerLocaleData is called with the respective locale.
110
- */
111
- this.locale = 'en-GB';
112
- /**
113
- * @description
114
- * Will display the destination input, set this to false to remove it. It's true by default.
115
- */
116
- this.enableDestinationSelect = true;
117
- /**
118
- * @description
119
- * Will display passenger select, set this to false to remove it. It's true by default.
120
- */
121
- this.enablePassengersSelect = true;
122
- /**
123
- * @description
124
- * Will display the trip switch, set this to false to remove it. It's true by default.
125
- */
126
- this.enableTripSwitch = true;
127
- /**
128
- * @description
129
- * Will display the transit switch, set this to false to remove it. It's true by default.
130
- */
131
- this.enableTransitSwitch = true;
132
- /**
133
- * @description
134
- * When selected datehas been changed on the outbound calendar.
135
- */
136
- this.outboundSelectedDateChange = new EventEmitter();
137
- /**
138
- * @description
139
- * When selected datehas been changed on the inbound calendar.
140
- */
141
- this.inboundSelectedDateChange = new EventEmitter();
142
- /**
143
- * @description
144
- * Outbound datepicker is open or closed.
145
- */
146
- this.outboundOpenChange = new EventEmitter();
147
- /**
148
- * @description
149
- * Inbound datepicker is open or closed.
150
- */
151
- this.inboundOpenChange = new EventEmitter();
152
- /**
153
- * @description
154
- * Outbound calendar changes month.
155
- */
156
- this.outboundMonthChange = new EventEmitter();
157
- /**
158
- * @description
159
- * Inbound calendar changes month.
160
- */
161
- this.inboundMonthChange = new EventEmitter();
162
- /**
163
- * @description
164
- * When a user has actively changed the date.
165
- */
166
- this.focusOnNextChange = new EventEmitter();
167
- /**
168
- * @description
169
- * The geolocation of the user. Will be emitted if 'enableSuggestions' is true.
170
- */
171
- this.positionChange = new EventEmitter();
172
- /**
173
- * @description
174
- * An even that is fired every time the info button on the subsidy discount is clicked.
175
- */
176
- this.subsidyDiscountInfoClick = new EventEmitter();
177
- this.outboundOpenValue = false;
178
- this.inboundOpenValue = false;
179
- this.passengersValue = new Array();
180
- this.nativeElement = elementRef.nativeElement;
181
- }
182
- get outboundOpen() {
183
- return this.outboundOpenValue;
184
- }
185
- set outboundOpen(value) {
186
- if (this.outboundOpenValue === value) {
187
- return;
188
- }
189
- if (value) {
190
- this.closeDropdowns();
191
- if (this.airportSelect) {
192
- this.airportSelect.originOpen = false;
193
- this.airportSelect.destinationOpen = false;
194
- }
195
- }
196
- this.outboundOpenValue = value;
197
- this.outboundOpenChange.emit(value);
198
- }
199
- get inboundOpen() {
200
- return this.inboundOpenValue;
201
- }
202
- set inboundOpen(value) {
203
- if (this.inboundOpenValue === value) {
204
- return;
205
- }
206
- if (value) {
207
- this.closeDropdowns();
208
- if (this.airportSelect) {
209
- this.airportSelect.originOpen = false;
210
- this.airportSelect.destinationOpen = false;
211
- }
212
- }
213
- clearTimeout(this.inboundOpenTimeout);
214
- this.inboundOpenTimeout = setTimeout(() => {
215
- this.inboundOpenValue = value;
216
- });
217
- this.inboundOpenChange.emit(value);
218
- }
219
- /**
220
- * @description
221
- * An array of different passenger types that will be displayed.
222
- */
223
- get passengers() {
224
- return this.passengersValue;
225
- }
226
- set passengers(value) {
227
- if (!value) {
228
- return;
229
- }
230
- this.passengersValue = value;
231
- this.passengersChange.emit(value);
232
- }
233
- /**
234
- * @description
235
- * Indicates if the edit search of accordion should be expended on mobile screen sizes.
236
- */
237
- get expandedAccordionMobile() {
238
- return this.expandedAccordionMobileValue;
239
- }
240
- set expandedAccordionMobile(value) {
241
- if (value === this.expandedAccordionMobileValue) {
242
- return;
243
- }
244
- this.expandedAccordionMobileValue = value;
245
- }
246
- get closestAirports() {
247
- return this.closestAirportsValue;
248
- }
249
- set closestAirports(airports) {
250
- if (!airports || airports.length < 1) {
251
- return;
252
- }
253
- this.closestAirportsValue = airports;
254
- if (this.exists(this.overrideOrigin)) {
255
- this.originAirportCode = airports[0].code;
256
- }
257
- }
258
- /**
259
- * @required
260
- * @description
261
- * All airports that will be populated into the dropdown lists.
262
- * If displayLatestSearches is true, it will try to get the latest searches from the abandoned basket.
263
- */
264
- get airports() {
265
- return this.airportsValue;
266
- }
267
- set airports(airports) {
268
- this.airportsValue = airports;
269
- if (this.exists(this.displayLatestSearches)) {
270
- const abandonedBasket = this.abandonedBasketService.getAll();
271
- this.setLatestSearches(abandonedBasket, this.airports);
272
- }
273
- }
274
- /**
275
- * @description
276
- * Sets and gets the selected trip type.
277
- */
278
- get tripType() {
279
- return this.tripTypeValue;
280
- }
281
- set tripType(tripType) {
282
- if (tripType === this.tripTypeValue) {
283
- return;
284
- }
285
- this.tripTypeValue = tripType;
286
- this.tripTypeChange.emit(this.tripType);
287
- }
288
- /**
289
- * @description
290
- * Sets and gets whether the selected transit type is direct only or not.
291
- */
292
- get directOnly() {
293
- return this.directOnlyValue;
294
- }
295
- set directOnly(directOnly) {
296
- if (directOnly === this.directOnlyValue) {
297
- return;
298
- }
299
- this.directOnlyValue = directOnly;
300
- this.directOnlyChange.emit(this.directOnly);
301
- }
302
- /**
303
- * @description
304
- * Selected datefor outbound calendar.
305
- */
306
- get outboundSelectedDate() {
307
- return this.outboundSelectedDateValue;
308
- }
309
- set outboundSelectedDate(date) {
310
- if (!date) {
311
- return;
312
- }
313
- setTimeout(() => {
314
- this.outboundSelectedDateValue = date;
315
- this.outboundSelectedDateChange.emit(date);
316
- });
317
- }
318
- /**
319
- * @description
320
- * Selected datefor inbound calendar.
321
- */
322
- get inboundSelectedDate() {
323
- return this.inboundSelectedDateValue;
324
- }
325
- set inboundSelectedDate(date) {
326
- if (!date) {
327
- return;
328
- }
329
- setTimeout(() => {
330
- this.inboundSelectedDateValue = date;
331
- this.inboundSelectedDateChange.emit(date);
332
- });
333
- }
334
- get inboundSelectedMonth() {
335
- return this.inboundSelectedMonthValue;
336
- }
337
- set inboundSelectedMonth(month) {
338
- if (this.dateService.isSameMonth(month, this.inboundSelectedMonthValue)) {
339
- return;
340
- }
341
- setTimeout(() => {
342
- this.inboundMonthChange.emit(month);
343
- this.inboundSelectedMonthValue = month;
344
- });
345
- }
346
- ngOnInit() {
347
- if (!this.nasFormGroup) {
348
- return;
349
- }
350
- this.nasFormGroup.statusChanges.subscribe(x => {
351
- setTimeout(() => {
352
- this.isNasGroupValid = x;
353
- });
354
- });
355
- if (this.nasFormControlNameDirectOnly) {
356
- const directOnlyControl = this.nasFormGroup.get(this.nasFormControlNameDirectOnly);
357
- if (directOnlyControl) {
358
- this.directOnly = directOnlyControl.value;
359
- }
360
- }
361
- if (this.nasFormControlNameTripType) {
362
- const tripTypeControl = this.nasFormGroup.get(this.nasFormControlNameTripType);
363
- if (tripTypeControl) {
364
- this.tripType = tripTypeControl.value;
365
- this.inboundDisabled = tripTypeControl.value === TripType.oneWay;
366
- if (this.nasFormControlNameInbound) {
367
- const inboundControl = this.nasFormGroup.get(this.nasFormControlNameInbound);
368
- if (inboundControl && this.inboundDisabled) {
369
- inboundControl.disable();
370
- }
371
- }
372
- tripTypeControl.valueChanges.subscribe((value) => {
373
- this.inboundDisabled = value === TripType.oneWay;
374
- this.tripType = value;
375
- });
376
- }
377
- }
378
- if (this.nasFormControlNameDirectOnly) {
379
- const directOnlyControl = this.nasFormGroup.get(this.nasFormControlNameDirectOnly);
380
- if (directOnlyControl) {
381
- directOnlyControl.valueChanges.subscribe((value) => {
382
- this.directOnly = value;
383
- });
384
- }
385
- }
386
- }
387
- ngAfterViewChecked() {
388
- this.containerWidth.next(this.container.nativeElement.offsetWidth);
389
- window.onresize = () => {
390
- this.containerWidth.next(this.container.nativeElement.offsetWidth);
391
- };
392
- }
393
- onSubsidyDiscountInfoClick() {
394
- this.subsidyDiscountInfoClick.emit();
395
- }
396
- onSubsidyDiscountSelectChange(model) {
397
- if (!this.nasFormGroup || !this.nasFormControlNameSubsidyDiscount) {
398
- return;
399
- }
400
- const subsidyDiscountControl = this.nasFormGroup.get(this.nasFormControlNameSubsidyDiscount);
401
- subsidyDiscountControl.patchValue(model);
402
- }
403
- getClosestAirports(position) {
404
- this.positionChange.emit(position);
405
- }
406
- getFilterClass(element, modifiersInput) {
407
- let modifiers = modifiersInput || new Array();
408
- if (typeof modifiersInput === 'string' || modifiersInput instanceof String) {
409
- modifiers = [modifiersInput];
410
- }
411
- const widths = [];
412
- if (this.deviceHelper.isWidthTablet(this.containerWidth.getValue())) {
413
- widths.push('md');
414
- }
415
- if (this.deviceHelper.isWidthDesktop(this.containerWidth.getValue())) {
416
- widths.push('lg');
417
- }
418
- modifiers = [...modifiers, ...widths];
419
- return this.getClass(element, modifiers);
420
- }
421
- getAirportSelectClass() {
422
- return this.getClass('airport-select', [
423
- this.deviceHelper.isWidthDesktop(this.containerWidth.getValue()) && 'lg',
424
- this.deviceHelper.isWidthTablet(this.containerWidth.getValue()) && 'md',
425
- this.exists(this.enableDatepickers) && 'no-border'
426
- ]);
427
- }
428
- getSuggestions() {
429
- const suggestions = Array.from(new Set([
430
- ...this.latestSearchesOrigin ? this.latestSearchesOrigin.filter(x => x.code !== this.originAirportCode) : [],
431
- ...this.closestAirports ? this.closestAirports.filter(x => x.code !== this.originAirportCode) : []
432
- ]));
433
- return suggestions.slice(0, 3);
434
- }
435
- getDatePickersClass() {
436
- return this.getFilterClass('date-combo', [
437
- this.exists(this.minimize) && 'minimized',
438
- this.containerWidth.getValue() > 500 && 'side-by-side'
439
- ]);
440
- }
441
- getTravelDetailsClass(element, modifiersInput) {
442
- let modifiers = modifiersInput || new Array();
443
- if (typeof modifiersInput === 'string' || modifiersInput instanceof String) {
444
- modifiers = [modifiersInput];
445
- }
446
- const widths = [
447
- this.deviceHelper.isWidthTablet(this.containerWidth.getValue()) && 'md',
448
- this.deviceHelper.isWidthDesktop(this.containerWidth.getValue()) && 'lg'
449
- ];
450
- modifiers = [...modifiers, ...widths];
451
- const travelDetailsBase = new NasComponentBase('travel-details');
452
- return travelDetailsBase.getClass(element, modifiers);
453
- }
454
- onInboundMonthChange(month) { this.inboundMonthChange.emit(month); }
455
- onOutboundMonthChange(month) { this.outboundMonthChange.emit(month); }
456
- onPassengersSelectFocusOnPrevious() {
457
- if (this.isMobileDisplay()) {
458
- this.onTransitSwitchOpen(true);
459
- this.focusAsync(this.transitSwitch.toggleElement);
460
- }
461
- else if (this.isTabletDisplay()) {
462
- this.selectPreviousControl();
463
- }
464
- }
465
- passengerKeyDown(event) {
466
- switch (event.key) {
467
- case 'Tab':
468
- if (event.shiftKey) {
469
- if (this.isMobileDisplay() || this.isTabletDisplay()) {
470
- break;
471
- }
472
- this.focusOnAirportSelectBackwards();
473
- break;
474
- }
475
- if (this.isMobileDisplay()) {
476
- if (this.subsidyDiscounts && this.subsidyDiscounts.length > 0) {
477
- this.subsidyDiscount.infoButton.button.nativeElement.focus();
478
- }
479
- else {
480
- this.focusOnNextChange.emit();
481
- }
482
- }
483
- break;
484
- case 'Enter':
485
- if (event.shiftKey || this.isMobileDisplay()) {
486
- break;
487
- }
488
- if (document.activeElement === this.passengerSelectDropdown.toggleElement.nativeElement) {
489
- if (this.passengerSelectDropdown.open) {
490
- this.onTripSwitchOpen(true);
491
- this.focusAsync(this.tripSwitch.toggleElement);
492
- }
493
- else {
494
- this.onPassengerSelectOpen(true);
495
- }
496
- }
497
- break;
498
- case 'Escape':
499
- this.onPassengerSelectOpen(false);
500
- event.preventDefault();
501
- this.setFocusOnNativeElement(this.passengerSelectDropdown.toggleElement);
502
- break;
503
- }
504
- }
505
- onTripSwitchKeyDown(event) {
506
- switch (event.key) {
507
- case 'ArrowRight':
508
- if (document.activeElement === this.tripTypeRoundTrip.nativeElement) {
509
- this.tripTypeOneway.nativeElement.focus();
510
- }
511
- break;
512
- case 'ArrowLeft':
513
- if (document.activeElement === this.tripTypeOneway.nativeElement) {
514
- this.tripTypeRoundTrip.nativeElement.focus();
515
- }
516
- break;
517
- case 'Tab':
518
- case 'Enter':
519
- if (event.shiftKey) {
520
- event.preventDefault();
521
- if (this.isMobileDisplay() || !this.passengerSelectDropdown) {
522
- this.selectPreviousControl();
523
- }
524
- else {
525
- this.onPassengerSelectOpen(true);
526
- this.focusAsync(this.passengerSelectDropdown.toggleElement);
527
- }
528
- }
529
- else {
530
- if (event.key === 'Tab') {
531
- this.onTransitSwitchOpen(true);
532
- }
533
- else {
534
- if (this.tripSwitch.open) {
535
- this.onTransitSwitchOpen(true);
536
- this.focusAsync(this.transitSwitch.toggleElement);
537
- }
538
- else {
539
- this.onTripSwitchOpen(true);
540
- }
541
- }
542
- }
543
- break;
544
- case 'Escape':
545
- this.onTripSwitchOpen(false);
546
- this.setFocusOnNativeElement(this.tripSwitch.toggleElement);
547
- break;
548
- }
549
- }
550
- transitKeyDown(event) {
551
- switch (event.key) {
552
- case 'ArrowRight':
553
- if (document.activeElement === this.transitTypeTransit.nativeElement) {
554
- this.transitTypeDirectOnly.nativeElement.focus();
555
- }
556
- break;
557
- case 'ArrowLeft':
558
- if (document.activeElement === this.transitTypeDirectOnly.nativeElement) {
559
- this.transitTypeTransit.nativeElement.focus();
560
- }
561
- break;
562
- case 'Tab':
563
- case 'Enter':
564
- if (event.shiftKey) {
565
- event.preventDefault();
566
- this.onTripSwitchOpen(true);
567
- this.focusAsync(this.tripSwitch.toggleElement);
568
- }
569
- else {
570
- if (this.isMobileDisplay()) {
571
- this.onPassengerSelectOpen(true);
572
- this.focusAsync(this.passengerSelectDropdown.toggleElement);
573
- }
574
- else {
575
- this.onTransitSwitchOpen(!this.transitSwitch.open);
576
- if (this.subsidyDiscounts && this.subsidyDiscounts.length > 0) {
577
- this.subsidyDiscount.infoButton.button.nativeElement.focus();
578
- }
579
- else {
580
- this.focusOnNextChange.emit();
581
- }
582
- }
583
- if (event.key === 'Tab') {
584
- event.preventDefault();
585
- }
586
- }
587
- break;
588
- case 'Escape':
589
- this.onTransitSwitchOpen(false);
590
- event.preventDefault();
591
- this.setFocusOnNativeElement(this.transitSwitch.toggleElement);
592
- break;
593
- }
594
- }
595
- onSubsidyDiscountInfoButtonKeydown(event) {
596
- switch (event.key) {
597
- case 'Tab':
598
- if (event.shiftKey) {
599
- if (this.isMobileDisplay()) {
600
- this.focusAsync(this.passengerSelectDropdown.toggleElement);
601
- }
602
- else {
603
- this.focusAsync(this.transitSwitch.toggleElement);
604
- }
605
- event.preventDefault();
606
- }
607
- break;
608
- default:
609
- break;
610
- }
611
- }
612
- onPassengersSelectFocusOnNext() {
613
- if (this.isMobileDisplay()) {
614
- this.passengerSelectDropdown.toggle();
615
- }
616
- else {
617
- this.onTripSwitchOpen(true);
618
- this.focusAsync(this.tripSwitch.toggleElement);
619
- }
620
- }
621
- focusAsync(refElement) {
622
- clearTimeout(this.focusAsyncTimout);
623
- this.focusAsyncTimout = setTimeout(() => this.setFocusOnNativeElement(refElement));
624
- }
625
- onDatepickerFocusOnPrevious(event) {
626
- event.preventDefault();
627
- this.focusOnAirportSelectBackwards();
628
- }
629
- selectPreviousControl() {
630
- if (this.datepickerCombo) {
631
- if (this.datepickerCombo.outboundOnly) {
632
- this.outboundOpen = true;
633
- }
634
- else {
635
- this.inboundOpen = true;
636
- }
637
- }
638
- else if (this.airportSelect) {
639
- if (this.exists(this.airportSelect.combo)) {
640
- this.airportSelect.onDestinationOpen(true);
641
- if (this.airportSelect.airportSelectDropdownDestination) {
642
- this.focusAsync(this.airportSelect.airportSelectDropdownDestination.input);
643
- }
644
- }
645
- else {
646
- this.airportSelect.onOriginOpen(true);
647
- if (this.airportSelect.airportSelectDropdownOrigin) {
648
- this.focusAsync(this.airportSelect.airportSelectDropdownOrigin.input);
649
- }
650
- }
651
- }
652
- }
653
- onFocusOnNextChange(event) {
654
- if (this.isMobileDisplay() && this.tripSwitch) {
655
- this.onTripSwitchOpen(true);
656
- this.focusAsync(this.tripSwitch.toggleElement);
657
- }
658
- else if (this.isTabletDisplay()) {
659
- if (this.passengerSelectDropdown) {
660
- event.preventDefault();
661
- setTimeout(() => {
662
- this.onPassengerSelectOpen(true);
663
- this.setFocusOnNativeElement(this.passengerSelectDropdown.toggleElement);
664
- });
665
- }
666
- else if (this.tripSwitch) {
667
- this.onTripSwitchOpen(true);
668
- this.focusAsync(this.tripSwitch.toggleElement);
669
- }
670
- }
671
- }
672
- isMobileDisplay() {
673
- return this.deviceHelper.isWidthMobile(this.containerWidth.getValue());
674
- }
675
- isTabletDisplay() {
676
- return this.deviceHelper.isWidthTablet(this.containerWidth.getValue());
677
- }
678
- onOriginOpen(open) {
679
- if (this.passengerSelectDropdown) {
680
- this.passengerSelectDropdown.open = false;
681
- }
682
- if (this.tripSwitch) {
683
- this.tripSwitch.open = false;
684
- }
685
- if (this.transitSwitch) {
686
- this.transitSwitch.open = false;
687
- }
688
- if (this.datepickerCombo) {
689
- this.datepickerCombo.inboundOpen = false;
690
- this.datepickerCombo.outboundOpen = false;
691
- }
692
- if (this.airportSelect && !this.airportSelect.originOpen) {
693
- this.updateMaximize();
694
- }
695
- this.originOpenChange.emit(open);
696
- this.changeDetector.detectChanges();
697
- }
698
- validateAirportValues() {
699
- if (!this.airportSelect) {
700
- return false;
701
- }
702
- const originSnapshot = this.airportSelect.origin;
703
- const destinationSnapshot = this.airportSelect.destination;
704
- if ((originSnapshot && destinationSnapshot && originSnapshot.code && originSnapshot.code.length
705
- && destinationSnapshot.code && destinationSnapshot.code.length)) {
706
- return true;
707
- }
708
- return false;
709
- }
710
- updateMaximize() {
711
- setTimeout(() => {
712
- this.maximize = this.validateAirportValues();
713
- });
714
- }
715
- onDestinationOpen(open) {
716
- if (this.passengerSelectDropdown) {
717
- this.passengerSelectDropdown.open = false;
718
- }
719
- if (this.tripSwitch) {
720
- this.tripSwitch.open = false;
721
- }
722
- if (this.transitSwitch) {
723
- this.transitSwitch.open = false;
724
- }
725
- if (this.datepickerCombo) {
726
- this.datepickerCombo.inboundOpen = false;
727
- this.datepickerCombo.outboundOpen = false;
728
- }
729
- if (this.airportSelect && !this.airportSelect.destinationOpen) {
730
- this.updateMaximize();
731
- }
732
- this.destinationOpenChange.emit(open);
733
- }
734
- onPassengerSelectOpen(open) {
735
- if (this.airportSelect) {
736
- this.airportSelect.originOpen = false;
737
- this.airportSelect.destinationOpen = false;
738
- }
739
- if (this.tripSwitch) {
740
- this.tripSwitch.open = false;
741
- }
742
- if (this.transitSwitch) {
743
- this.transitSwitch.open = false;
744
- }
745
- if (this.datepickerCombo) {
746
- if (this.datepickerCombo.inboundOpen) {
747
- this.datepickerCombo.inboundOpen = false;
748
- }
749
- if (this.datepickerCombo.outboundOpen) {
750
- this.datepickerCombo.outboundOpen = false;
751
- }
752
- }
753
- this.passengerSelectDropdown.open = open;
754
- this.passengerSelectOpenChange.emit(open);
755
- if (open) {
756
- setTimeout(() => {
757
- if (this.passengerSelect.numberFields.first) {
758
- this.passengerSelect.numberFields.first.input.nativeElement.focus();
759
- }
760
- }, 300);
761
- }
762
- }
763
- onTripSwitchOpen(open) {
764
- clearTimeout(this.tripSwitchFocusTimeout);
765
- if (this.passengerSelectDropdown) {
766
- setTimeout(() => {
767
- this.passengerSelectDropdown.open = false;
768
- });
769
- }
770
- if (this.transitSwitch) {
771
- this.transitSwitch.open = false;
772
- }
773
- if (this.airportSelect) {
774
- this.airportSelect.originOpen = false;
775
- this.airportSelect.destinationOpen = false;
776
- }
777
- if (this.datepickerCombo) {
778
- this.datepickerCombo.inboundOpen = false;
779
- this.datepickerCombo.outboundOpen = false;
780
- }
781
- this.tripSwitch.open = open;
782
- if (open) {
783
- this.tripSwitchFocusTimeout = setTimeout(() => {
784
- this.tripTypeRoundTrip.nativeElement.focus();
785
- }, 200);
786
- }
787
- }
788
- onTransitSwitchOpen(open) {
789
- clearTimeout(this.transitSwitchFocusTimeout);
790
- if (this.passengerSelectDropdown) {
791
- this.passengerSelectDropdown.open = false;
792
- }
793
- if (this.tripSwitch) {
794
- this.tripSwitch.open = false;
795
- }
796
- if (this.airportSelect) {
797
- this.airportSelect.originOpen = false;
798
- this.airportSelect.destinationOpen = false;
799
- }
800
- if (this.datepickerCombo) {
801
- this.datepickerCombo.inboundOpen = false;
802
- this.datepickerCombo.outboundOpen = false;
803
- }
804
- if (this.transitSwitch) {
805
- this.transitSwitch.open = open;
806
- }
807
- if (open) {
808
- this.transitSwitchFocusTimeout = setTimeout(() => {
809
- this.transitTypeTransit.nativeElement.focus();
810
- }, 200);
811
- }
812
- }
813
- onOriginChange(airport) {
814
- this.originChange.emit(airport);
815
- }
816
- setSelectedOriginAirport(airport) {
817
- if (!airport) {
818
- return;
819
- }
820
- this.onOriginChange(airport);
821
- if (this.originAirportCode === airport.code) {
822
- return;
823
- }
824
- this.originAirportCode = airport.code;
825
- this.changeDetector.detectChanges();
826
- }
827
- onDestinationChange(airport) {
828
- this.destinationChange.emit(airport);
829
- }
830
- setFocusOnPassengerSelect(event) {
831
- this.minimize = false;
832
- if (this.isMobileDisplay()) {
833
- if (this.datepickerCombo) {
834
- event.preventDefault();
835
- this.outboundOpen = true;
836
- this.focusAsync(this.datepickerCombo.datepickerOutbound.input);
837
- }
838
- else if (this.tripSwitch) {
839
- event.preventDefault();
840
- this.onTripSwitchOpen(true);
841
- this.focusAsync(this.tripSwitch.toggleElement);
842
- }
843
- }
844
- else if (this.isTabletDisplay() && this.datepickerCombo) {
845
- setTimeout(() => {
846
- this.outboundOpen = true;
847
- });
848
- }
849
- else {
850
- if (this.passengerSelectDropdown) {
851
- this.onPassengerSelectOpen(true);
852
- const currentElementRef = this.passengerSelectDropdown.toggleElement;
853
- setTimeout(() => this.setFocusOnNativeElement(currentElementRef));
854
- }
855
- else if (this.tripSwitch) {
856
- this.onTripSwitchOpen(true);
857
- this.tripSwitch.toggleElement.nativeElement.focus();
858
- }
859
- }
860
- }
861
- setFocusOnNativeElement(element) {
862
- element.nativeElement.focus();
863
- }
864
- onTripTypeChange(tripType) {
865
- setTimeout(() => {
866
- this.tripSwitch.open = false;
867
- });
868
- this.tripType = tripType;
869
- if (this.nasFormGroup && this.nasFormControlNameTripType) {
870
- const tripSwitchControl = this.nasFormGroup.get(this.nasFormControlNameTripType);
871
- tripSwitchControl.patchValue(tripType);
872
- }
873
- }
874
- onTransitChange(directOnly) {
875
- setTimeout(() => {
876
- this.transitSwitch.open = false;
877
- });
878
- this.directOnly = directOnly;
879
- if (this.nasFormGroup && this.nasFormControlNameDirectOnly) {
880
- const tripTypeControl = this.nasFormGroup.get(this.nasFormControlNameDirectOnly);
881
- tripTypeControl.patchValue(directOnly);
882
- }
883
- }
884
- getTravelDetailsTripSwitchIconClass(modifiers) {
885
- const iconMediumBase = new NasComponentBase('icon-medium');
886
- return [
887
- iconMediumBase.getClass('', modifiers),
888
- this.getTravelDetailsClass('icon')
889
- ];
890
- }
891
- getTripSwitchLabel() {
892
- return this.tripType === TripType.twoWayReturn ? this.tripSwitchRoundTripLabel : this.tripSwitchOneWayLabel;
893
- }
894
- getTransitLabel() {
895
- return this.directOnly ? this.directOnlyLabel : this.directTransitLabel;
896
- }
897
- onAccordionToggleChange(expanded) {
898
- this.displaySummary = !expanded;
899
- }
900
- getSummary() {
901
- return `${this.passengerSelectLabel}${this.defaultSummarySeparator}` +
902
- `${this.getTripSwitchLabel().toLowerCase()}${this.lastSummarySeparator}${this.getTransitLabel().toLowerCase()}`;
903
- }
904
- shouldMaximize() {
905
- if (!this.exists(this.minimize)) {
906
- return true;
907
- }
908
- else if (this.airportSelect
909
- && this.enableDestinationSelect
910
- && this.airportSelect.origin
911
- && this.airportSelect.origin.code
912
- && this.airportSelect.destination
913
- && this.airportSelect.destination.code) {
914
- return true;
915
- }
916
- else if (this.airportSelect
917
- && !this.enableDestinationSelect
918
- && this.airportSelect.origin
919
- && this.airportSelect.origin.code) {
920
- return true;
921
- }
922
- else if (this.airportSelect && (this.airportSelect.originOpen || this.airportSelect.destinationOpen)) {
923
- return this.maximize;
924
- }
925
- else if (this.exists(this.minimize)) {
926
- if (this.maximize) {
927
- if (this.nasFormGroup) {
928
- return this.isNasGroupValid;
929
- }
930
- return true;
931
- }
932
- else {
933
- return false;
934
- }
935
- }
936
- }
937
- focusOnAirportSelectBackwards() {
938
- if (this.exists(this.airportSelect.combo)) {
939
- this.airportSelect.onDestinationOpen(true);
940
- setTimeout(() => {
941
- this.airportSelect.airportSelectDropdownDestination.input.nativeElement.focus();
942
- }, 100);
943
- }
944
- else {
945
- this.airportSelect.onOriginOpen(true);
946
- this.focusAsync(this.airportSelect.airportSelectDropdownOrigin.input);
947
- }
948
- }
949
- setLatestSearches(abandonedBasket, airports) {
950
- if (!abandonedBasket || !airports) {
951
- return;
952
- }
953
- const unique = new Array();
954
- for (const item of abandonedBasket) {
955
- if (!unique.some(x => x.destinationCode === item.destinationCode)) {
956
- unique.push(item);
957
- }
958
- }
959
- const originCodes = unique.map(x => x.originCode);
960
- const destinationCodes = unique.map(x => x.destinationCode);
961
- const latestSearchesOrigin = airports.filter(airport => {
962
- return unique.some(x => x.originCode.toLowerCase() === airport.code.toLowerCase());
963
- });
964
- const latestSearchesDestination = airports.filter(airport => {
965
- return unique.some(x => x.destinationCode.toLowerCase() === airport.code.toLowerCase());
966
- });
967
- const code = 'code';
968
- this.latestSearchesOrigin = this.sortService.sortByObject(latestSearchesOrigin, originCodes, code).slice(0, 3);
969
- if (this.latestSearchesOrigin && this.latestSearchesOrigin.length > 0 && this.exists(this.overrideOrigin)) {
970
- this.originAirportCode = this.latestSearchesOrigin[0].code;
971
- }
972
- this.latestSearchesDestination = this.sortService.sortByObject(latestSearchesDestination, destinationCodes, code).slice(0, 3);
973
- }
974
- closeDropdowns() {
975
- if (this.passengerSelectDropdown) {
976
- this.passengerSelectDropdown.open = false;
977
- }
978
- if (this.tripSwitch) {
979
- this.tripSwitch.open = false;
980
- }
981
- if (this.transitSwitch) {
982
- this.transitSwitch.open = false;
983
- }
984
- }
985
- }
986
- FilterComponent.decorators = [
987
- { type: Component, args: [{
988
- selector: 'nas-filter',
989
- template: "<nas-accordion *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile); else filterTemplate\"\n simple\n containerOnToggle\n transparent\n [expanded]=\"expandedAccordionMobile\"\n [title]=\"editSearchTitle\"\n (toggleChange)=\"onAccordionToggleChange($event)\">\n <ng-container *ngTemplateOutlet=\"filterTemplate\"></ng-container>\n</nas-accordion>\n<div class=\"container\"\n *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile) && displaySummary\">{{getSummary()}}</div>\n\n<ng-template #filterTemplate>\n <div #container\n [nasClass]=\"getContainerClass()\">\n <div [nasClass]=\"getFilterClass('filters', [exists(minimize) && 'minimized', maximize && 'maximize'])\">\n <ng-container *ngIf=\"airports?.length > 0\">\n <nas-airport-select *ngIf=\"airports && airportRelations && (enableDestinationSelect)\"\n #airportSelect\n combo\n [ariaLabelClear]=\"ariaLabelClear\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [nasFormControlNameDestination]=\"nasFormControlNameDestination\"\n [useSwitch]=\"useSwitch\"\n [nasClass]=\"getAirportSelectClass()\"\n [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\"\n [allowedDestinationAirports]=\"allowedDestinationAirports\"\n [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\"\n [latestSearchesDestination]=\"latestSearchesDestination\"\n [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\"\n [destinationAirportCode]=\"destinationAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\"\n [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\"\n [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\"\n [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\"\n [labelDestination]=\"labelDestination\"\n [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [placeholderDestination]=\"placeholderDestination\"\n [keepSelection]=\"keepSelection\"\n [invalidDestinationText]=\"invalidDestinationText\"\n (originChange)=\"setSelectedOriginAirport($event)\"\n (destinationChange)=\"onDestinationChange($event)\"\n (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\"\n (destinationOpenChange)=\"onDestinationOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-airport-select *ngIf=\"airports && (!enableDestinationSelect)\"\n #airportSelect\n [ariaLabelClear]=\"ariaLabelClear\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [useSwitch]=\"useSwitch\"\n [nasClass]=\"getClass('airport-origin-select')\"\n [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\"\n [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\"\n [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\"\n [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\"\n [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\"\n [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\"\n [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [keepSelection]=\"keepSelection\"\n (originChange)=\"setSelectedOriginAirport($event)\"\n (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-suggestions *ngIf=\"(closestAirports || latestSearchesOrigin) && exists(enableSuggestions)\"\n [nasClass]=\"getFilterClass('suggestions')\"\n [suggestions]=\"getSuggestions()\"\n [orLabel]=\"orLabel\"\n (airportSelect)=\"setSelectedOriginAirport($event)\"></nas-suggestions>\n </ng-container>\n <ng-container *ngIf=\"shouldMaximize()\">\n <div\n [nasClass]=\"!enableDestinationSelect ? getClass('origin-combined') :\n getTravelDetailsClass('', ['combined', exists(enableDatepickers) && 'no-border', exists(minimize) && 'minimized'])\">\n <ng-container *ngIf=\"enablePassengersSelect\">\n <nas-dropdown #passengerSelectDropdown\n *ngIf=\"passengers?.length > 0\"\n [nasClass]=\"getTravelDetailsClass('dropdown', 'passengers')\"\n [cssClass]=\"getTravelDetailsClass('dropdown')\"\n [label]=\"passengerSelectLabel\"\n [labelStyle]=\"{'width': '102px'}\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n (openChange)=\"onPassengerSelectOpen($event)\"\n (keydown)=\"passengerKeyDown($event)\">\n <nas-passenger-select #passengerSelect\n [ariaLabelAdd]=\"ariaLabelAdd\"\n [ariaLabelSubtract]=\"ariaLabelSubtract\"\n [adultsLabel]=\"passengerSelectAdultsLabel\"\n [childrenLabel]=\"passengerSelectChildrenLabel\"\n [infantsLabel]=\"passengerSelectInfantsLabel\"\n [maxPaxCount]=\"maxPaxCount\"\n [minAdultCount]=\"minAdultCount\"\n [title]=\"passengerSelectTitle\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlGroupBooking]=\"nasFormControlGroupBooking\"\n [groupBookingLabel]=\"groupBookingLabel\"\n [groupBookingLimit]=\"groupBookingLimit\"\n (focusOnNext)=\"onPassengersSelectFocusOnNext()\"\n (focusOnPrevious)=\"onPassengersSelectFocusOnPrevious()\"\n [(passengers)]=\"passengers\"></nas-passenger-select>\n </nas-dropdown>\n </ng-container>\n <ng-container *ngIf=\"enableTripSwitch\">\n <nas-dropdown *ngIf=\"tripSwitchOneWayLabel && tripSwitchRoundTripLabel\"\n #tripSwitch\n [nasClass]=\"getTravelDetailsClass('dropdown', 'trip-type')\"\n [cssClass]=\"getTravelDetailsClass('dropdown')\"\n [label]=\"getTripSwitchLabel()\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n (openChange)=\"onTripSwitchOpen($event)\"\n (keydown)=\"onTripSwitchKeyDown($event)\">\n <div [nasClass]=\"getTravelDetailsClass('actions')\">\n <button type=\"button\"\n #tripTypeRoundTrip\n [nasClass]=\"getTravelDetailsClass('action', tripType === 2 && 'active')\"\n (click)=\"onTripTypeChange(2)\">\n <nas-icon [type]=\"'medium'\"\n [icon]=\"tripType === 2 ? 'flight-return--light' : 'flight-return'\"></nas-icon>\n <span [nasClass]=\"getTravelDetailsClass('title', 'small')\">{{tripSwitchRoundTripLabel}}</span>\n </button>\n <button type=\"button\"\n #tripTypeOneway\n [nasClass]=\"getTravelDetailsClass('action', tripType === 1 && 'active')\"\n (click)=\"onTripTypeChange(1)\">\n <nas-icon [type]=\"'medium'\"\n [icon]=\"tripType === 1 ? 'flight-oneway--light' : 'flight-oneway'\"></nas-icon>\n <span [nasClass]=\"getTravelDetailsClass('title', ['small'])\">{{tripSwitchOneWayLabel}}</span>\n </button>\n </div>\n </nas-dropdown>\n </ng-container>\n <ng-container *ngIf=\"enableTransitSwitch\">\n <nas-dropdown *ngIf=\"directOnlyLabel && directTransitLabel\"\n #transitSwitch\n [nasClass]=\"getTravelDetailsClass('dropdown', 'transit-type')\"\n [cssClass]=\"getTravelDetailsClass('dropdown')\"\n [label]=\"getTransitLabel()\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n (openChange)=\"onTransitSwitchOpen($event)\"\n (keydown)=\"transitKeyDown($event)\">\n <div [nasClass]=\"getTravelDetailsClass('actions')\">\n <button type=\"button\"\n #transitTypeTransit\n [nasClass]=\"getTravelDetailsClass('action', !directOnly && 'active')\"\n (click)=\"onTransitChange(false)\">\n <span [nasClass]=\"getTravelDetailsClass('transit-icon')\">\n <span [nasClass]=\"getTravelDetailsClass('transit-icon-stop')\"></span>\n </span>\n <span [nasClass]=\"getTravelDetailsClass('title', 'small')\">{{directTransitLabel}}</span>\n </button>\n <button [nasClass]=\"getTravelDetailsClass('action', directOnly && 'active')\"\n type=\"button\"\n #transitTypeDirectOnly\n (click)=\"onTransitChange(true)\">\n <span [nasClass]=\"getTravelDetailsClass('transit-icon')\"></span>\n <span [nasClass]=\"getTravelDetailsClass('title', 'small')\">{{directOnlyLabel}}</span>\n </button>\n </div>\n </nas-dropdown>\n </ng-container>\n </div>\n <div *ngIf=\"exists(enableDatepickers)\"\n [nasClass]=\"getDatePickersClass()\">\n <nas-datepicker-combo #datepickerCombo\n compact\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOutbound]=\"nasFormControlNameOutbound\"\n [nasFormControlNameInbound]=\"nasFormControlNameInbound\"\n [availability]=\"availability\"\n [availableFlightsLabel]=\"availableFlightsLabel\"\n [dateDisplayFormat]=\"dateDisplayFormat\"\n [disablePastSelection]=\"disablePastSelection\"\n [locale]=\"locale\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [inboundAvailableDates]=\"inboundAvailableDates\"\n [inboundLabel]=\"inboundLabel\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [outboundAvailableDates]=\"outboundAvailableDates\"\n [outboundLabel]=\"outboundLabel\"\n [timeDisplayFormat]=\"timeDisplayFormat\"\n [times]=\"times\"\n [outboundDisabled]=\"outboundDisabled\"\n [inboundDisabled]=\"inboundDisabled\"\n [outboundOnly]=\"tripType === 1\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [ariaLabelPreviousMonth]=\"ariaLabelPreviousMonth\"\n [ariaLabelNextMonth]=\"ariaLabelNextMonth\"\n (focusOnNextChange)=\"onFocusOnNextChange($event)\"\n (focusOnPreviousChange)=\"onDatepickerFocusOnPrevious($event)\"\n (inboundMonthChange)=\"onInboundMonthChange($event)\"\n (outboundMonthChange)=\"onOutboundMonthChange($event)\"\n [(outboundOpen)]=\"outboundOpen\"\n [(inboundOpen)]=\"inboundOpen\"\n [(inboundSelectedDate)]=\"inboundSelectedDate\"\n [(outboundSelectedDate)]=\"outboundSelectedDate\">\n </nas-datepicker-combo>\n </div>\n <div *ngIf=\"subsidyDiscounts && subsidyDiscounts.length > 0\"\n [nasClass]=\"getFilterClass('subsidy-discount')\">\n <nas-subsidy-discount #subsidyDiscount\n [discounts]=\"subsidyDiscounts\"\n [selectedDiscount]=\"selectedSubsidyDiscount\"\n [label]=\"subsidyDiscountLabel\"\n (infoButtonClick)=\"onSubsidyDiscountInfoClick()\"\n (discountSelectChange)=\"onSubsidyDiscountSelectChange($event)\"\n (infoButtonKeydown)=\"onSubsidyDiscountInfoButtonKeydown($event)\"></nas-subsidy-discount>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>",
990
- styles: ["@-webkit-keyframes fade-in{0%{opacity:0}}@keyframes fade-in{0%{opacity:0}}@-webkit-keyframes fade-in-down{0%{opacity:0;transform:translateY(-30px)}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-30px)}}@-webkit-keyframes fade-in-left{0%{opacity:0;transform:translate(-30px)}}@keyframes fade-in-left{0%{opacity:0;transform:translate(-30px)}}@-webkit-keyframes fade-in-right{0%{opacity:0;transform:translate(30px)}}@keyframes fade-in-right{0%{opacity:0;transform:translate(30px)}}@-webkit-keyframes fade-out{to{opacity:0}}@keyframes fade-out{to{opacity:0}}@-webkit-keyframes flip-in{0%{opacity:0;transform:rotateX(-90deg)}40%{opacity:1;transform:rotateX(10deg)}}@keyframes flip-in{0%{opacity:0;transform:rotateX(-90deg)}40%{opacity:1;transform:rotateX(10deg)}}@-webkit-keyframes flip-out{to{opacity:0;transform:rotateX(-90deg)}}@keyframes flip-out{to{opacity:0;transform:rotateX(-90deg)}}@-webkit-keyframes pop-in-from-top{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-100,1,1);opacity:0}6.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-30.227,1,1)}13.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,1.76,1,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,7.08,1,1)}26.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,3.838,1,1)}33.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.902,1,1);opacity:1}40%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.237,1,1)}46.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.312,1,1)}53.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.141,1,1)}60%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.021,1,1)}66.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.015,1,1)}73.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.013,1,1)}80%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.005,1,1)}86.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1)}93.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}to{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}}@keyframes pop-in-from-top{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-100,1,1);opacity:0}6.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-30.227,1,1)}13.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,1.76,1,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,7.08,1,1)}26.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,3.838,1,1)}33.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.902,1,1);opacity:1}40%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.237,1,1)}46.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.312,1,1)}53.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.141,1,1)}60%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.021,1,1)}66.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.015,1,1)}73.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.013,1,1)}80%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.005,1,1)}86.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1)}93.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}to{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}}.nas-filter{background-color:#f1f1f1;position:relative;z-index:6}.nas-filter__title{margin-top:24px;font-size:28px;line-height:34px}@media screen and (min-width: 640px){.nas-filter__title{font-size:32px;line-height:38px}}.nas-filter__title--md{margin-top:60px}.nas-filter__filters{margin-top:12px;display:flex;flex-wrap:wrap;order:2}.nas-filter__filters .nas-filter__date-combo{order:2;flex:1;z-index:2}.nas-filter__filters--minimized .nas-filter__airport-select:after{content:\"\";position:absolute;bottom:-3px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.nas-filter__filters--maximize .nas-filter__airport-select:after{display:none}.nas-filter__filters--md .nas-filter__date-combo{flex:0 0 100%}.nas-filter__filters--lg{display:flex;align-items:stretch}.nas-filter__filters--lg .nas-filter__date-combo{order:3;flex:0 0 100%;z-index:1}.nas-filter__filters--lg .nas-filter__suggestions{order:3}.nas-filter__filters--lg .nas-filter__filters--minimized .nas-filter__airport-select{margin-right:0;flex:0 1 100%}.nas-filter__filters--lg .nas-filter__filters--maximize .nas-filter__airport-select{margin-right:3px;flex:auto}.nas-filter__filters--lg.nas-filter__filters--maximize .nas-filter__date-combo{border-bottom:3px solid #c3c3c3}.nas-filter__suggestions{flex-basis:100%;position:relative;margin-top:3px}.nas-filter__suggestions:before{content:\"\";position:absolute;top:-3px;left:0px;width:100%;border-top:3px solid #c3c3c3}.nas-filter__airport-select{order:0;flex:0 0 100%;position:relative}.nas-filter__airport-select--lg{width:0;margin:0 3px 0 0;flex:1 1 auto}.nas-filter__toggler{font-family:\"Apercu\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:normal;font-size:18px;line-height:26px;color:#003251;margin-top:6px;z-index:1}.nas-filter__toggler .nas-filter__toggle-action{cursor:pointer;margin-top:2px;float:right}.nas-filter__toggler .nas-filter__direct-only{display:inline-block}.travel-details{position:relative;display:flex;margin:0;flex-wrap:wrap;z-index:1}.travel-details__list{margin-top:12px}.travel-details__list-item{display:flex;align-items:center;justify-content:space-between;padding:6px 0 0}.travel-details__list-item:not(:last-child){padding:6px 0 9px;border-bottom:2px solid #f1f1f1}.travel-details__label{flex-grow:2;margin:0 6px 0 0}.travel-details__title{font-size:18px;line-height:26px;display:block;min-width:124px}.travel-details__title--small{font-size:16px;line-height:26px;margin:0}.travel-details__actions{display:flex}.travel-details__action{padding:12px;width:100%;background-color:#fff}.travel-details__action:hover,.travel-details__action:focus{background-color:#e3e3e3}.travel-details__action--active,.travel-details__action--active:hover,.travel-details__action--active:focus{color:#fff;background-color:#003251}.travel-details__action:focus{outline:none;box-shadow:inset 0 0 2px #c3c3c3,inset 0 0 2px 3px #3b99fc;z-index:1}.travel-details__icon{margin-bottom:9px}.travel-details__dropdown{margin-right:0}.travel-details__dropdown:after{content:\"\";position:absolute;bottom:-3px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.travel-details__dropdown--trip-type{order:1;flex:1;margin-right:3px;margin-bottom:3px}.travel-details__dropdown--transit-type{order:2;flex:1;margin-bottom:3px}.travel-details__dropdown--passengers{order:3;flex:1 0 100%;margin-bottom:3px}.travel-details__dropdown--md.travel-details__dropdown--trip-type{order:2;flex:1;margin-right:3px}.travel-details__dropdown--md.travel-details__dropdown--transit-type{order:3;flex:1}.travel-details__dropdown--md.travel-details__dropdown--passengers{order:1;flex:1;margin-right:3px}.travel-details__dropdown--lg.travel-details__dropdown--trip-type{order:2;flex:1 1 auto;margin-right:3px}.travel-details__dropdown--lg.travel-details__dropdown--transit-type{order:3;flex:1 1 auto}.travel-details__dropdown--lg.travel-details__dropdown--passengers{order:1;flex:1 1 auto;margin-right:3px}.travel-details__dropdown--lg:focus{outline:none}.travel-details__dropdown--lg:after{display:none}.travel-details__transit-icon{position:relative;display:flex;justify-content:center;width:calc(100% - 48px);margin:12px auto;height:24px;background-color:inherit}.travel-details__transit-icon:before{content:\"\";position:absolute;height:2px;left:0;width:100%;top:calc(50% - 1px);background-color:currentColor}.travel-details__transit-icon:after{content:\"\";position:absolute;width:10px;height:10px;right:0;top:calc(50% - 5px);border-top:2px solid currentColor;border-right:2px solid currentColor;transform:rotate(45deg)}.travel-details__transit-icon-stop{position:relative;top:calc(50% - 5px);width:10px;height:10px;border:2px solid currentColor;border-radius:50%;background-color:inherit}.travel-details--combined{order:3;flex:0 0 100%}.travel-details--combined.travel-details--md:after{content:\"\";position:absolute;bottom:-6px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.travel-details--combined.travel-details--md .travel-details__dropdown{margin:0 3px 0 0}.travel-details--combined.travel-details--md .travel-details__dropdown:last-child{margin:0}.travel-details--combined.travel-details--md .dropdown__toggle{height:calc(100% - 3px);margin:0;padding-left:16px;padding-right:16px}.travel-details--combined.travel-details--lg{order:2;flex:0 0 auto;margin:0 0 0 -3px;padding-left:3px;z-index:2}.travel-details--combined.travel-details--lg:after{content:\"\";position:absolute;bottom:-3px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.travel-details--combined.travel-details--lg .dropdown__toggle{height:inherit}@media (min-width: 1000px){.travel-details--no-border:after{border-bottom:none}}::ng-deep .nas-filter__filters .travel-details--no-border:after{display:none}::ng-deep .nas-filter__filters .travel-details__dropdown .nas-dropdown__toggle{padding:20px!important;width:100%;height:100%}::ng-deep .nas-filter__filters .travel-details__dropdown .nas-dropdown__toggle:hover:after{display:none}::ng-deep .nas-filter__filters .travel-details__dropdown .nas-dropdown__toggle nas-icon{float:right}::ng-deep .nas-filter__filters .travel-details__dropdown .nas-dropdown__toggle:focus{outline:none}::ng-deep .nas-filter__filters .travel-details__dropdown .nas-dropdown{width:100%}::ng-deep .nas-filter__filters .travel-details__dropdown .nas-dropdown:focus{outline:none}@media (min-width: 640px){::ng-deep .nas-filter__filters .travel-details__dropdown:after{border-bottom:none}}::ng-deep .nas-filter__filters .nas-filter__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:none!important}::ng-deep .nas-filter__filters .nas-filter__date-combo--side-by-side .nas-datepicker-combo__separator{display:block;border-bottom:none!important}::ng-deep .nas-filter__filters .nas-airport-select__input-line{border-top:none!important}::ng-deep .nas-filter__filters .nas-airport-select-combo__separator{border-bottom:none!important}::ng-deep .nas-filter__filters .nas-dropdown__toggle{height:64px!important}::ng-deep .nas-filter__filters .nas-datepicker-combo__separator{display:none}::ng-deep .nas-filter__filters--lg .nas-dropdown__toggle{display:flex}::ng-deep .nas-filter__filters--lg .nas-filter__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:3px solid #c3c3c3}::ng-deep .nas-filter__filters--lg .nas-airport-select__input-line{border-top:3px solid #c3c3c3!important}::ng-deep .nas-filter__filters--lg .nas-datepicker-combo__separator{border-bottom:3px solid #c3c3c3!important}::ng-deep .nas-filter__filters--lg .nas-airport-select-combo__separator{border-bottom:3px solid #c3c3c3!important}::ng-deep .nas-filter__rotate{transform:rotate(180deg)}::ng-deep .nas-filter__rotate-enter,::ng-deep .nas-filter__rotate-leave-active{transform-origin:center top;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}::ng-deep .nas-filter__rotate-enter{-webkit-animation:flip-in .55s ease both;animation:flip-in .55s ease both}::ng-deep .nas-filter__rotate-leave-active{-webkit-animation:flip-out .2s ease-out both;animation:flip-out .2s ease-out both}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__input-line{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select-combo__separator{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results-wrapper{margin-top:0}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results{top:-3px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__icon{bottom:18px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select:after{display:none}::ng-deep .nas-filter__airport-select .nas-airport-select__input-line{display:none}::ng-deep .nas-filter__airport-origin-select{width:100%;max-width:100%}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{max-width:100%}@media (min-width: 640px){::ng-deep .nas-filter__airport-origin-select{max-width:360px;flex:auto;margin-right:3px}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{width:auto;max-width:360px}}::ng-deep .nas-filter__origin-combined{border-bottom:3px solid #c3c3c3;order:3;flex:0 0 100%;display:flex;flex-wrap:wrap}@media (min-width: 1000px){::ng-deep .nas-filter__origin-combined{display:flex;flex:none}::ng-deep .nas-filter__origin-combined .nas-dropdown__toggle nas-icon{float:none!important}}::ng-deep .nas-filter__subsidy-discount{order:3}::ng-deep .nas-filter__subsidy-discount .nas-subsidy-discount{margin-top:16px}\n"]
991
- },] }
992
- ];
993
- FilterComponent.ctorParameters = () => [
994
- { type: DeviceHelper },
995
- { type: SortService },
996
- { type: AbandonedBasketService },
997
- { type: DateHelper },
998
- { type: ElementRef },
999
- { type: ChangeDetectorRef }
1000
- ];
1001
- FilterComponent.propDecorators = {
1002
- passengerSelectDropdown: [{ type: ViewChild, args: ['passengerSelectDropdown',] }],
1003
- passengerSelect: [{ type: ViewChild, args: ['passengerSelect',] }],
1004
- tripSwitch: [{ type: ViewChild, args: ['tripSwitch',] }],
1005
- transitSwitch: [{ type: ViewChild, args: ['transitSwitch',] }],
1006
- airportSelect: [{ type: ViewChild, args: ['airportSelect',] }],
1007
- datepickerCombo: [{ type: ViewChild, args: ['datepickerCombo',] }],
1008
- container: [{ type: ViewChild, args: ['container',] }],
1009
- tripTypeOneway: [{ type: ViewChild, args: ['tripTypeOneway',] }],
1010
- tripTypeRoundTrip: [{ type: ViewChild, args: ['tripTypeRoundTrip',] }],
1011
- transitTypeDirectOnly: [{ type: ViewChild, args: ['transitTypeDirectOnly',] }],
1012
- transitTypeTransit: [{ type: ViewChild, args: ['transitTypeTransit',] }],
1013
- subsidyDiscount: [{ type: ViewChild, args: ['subsidyDiscount',] }],
1014
- airportRelations: [{ type: Input }],
1015
- ariaLabelClear: [{ type: Input }],
1016
- ariaLabelSubtract: [{ type: Input }],
1017
- ariaLabelBackdrop: [{ type: Input }],
1018
- ariaLabelAdd: [{ type: Input }],
1019
- allowedOriginAirports: [{ type: Input }],
1020
- allowedDestinationAirports: [{ type: Input }],
1021
- displayLatestSearches: [{ type: Input }],
1022
- useSwitch: [{ type: Input }],
1023
- displayClosestAirports: [{ type: Input }],
1024
- originAirportCode: [{ type: Input }],
1025
- destinationAirportCode: [{ type: Input }],
1026
- passengerSelectLabel: [{ type: Input }],
1027
- maxPaxCount: [{ type: Input }],
1028
- passengers: [{ type: Input }],
1029
- minAdultCount: [{ type: Input }],
1030
- tripSwitchRoundTripLabel: [{ type: Input }],
1031
- tripSwitchOneWayLabel: [{ type: Input }],
1032
- directOnlyLabel: [{ type: Input }],
1033
- directTransitLabel: [{ type: Input }],
1034
- minimizeOnMobile: [{ type: Input }],
1035
- expandedAccordionMobile: [{ type: Input }],
1036
- defaultSummarySeparator: [{ type: Input }],
1037
- lastSummarySeparator: [{ type: Input }],
1038
- passengerSelectTitle: [{ type: Input }],
1039
- passengerSelectAdultsLabel: [{ type: Input }],
1040
- passengerSelectChildrenLabel: [{ type: Input }],
1041
- passengerSelectInfantsLabel: [{ type: Input }],
1042
- groupBookingLabel: [{ type: Input }],
1043
- allAirportsLabel: [{ type: Input }],
1044
- latestSearchesLabel: [{ type: Input }],
1045
- closestAirportsLabel: [{ type: Input }],
1046
- selectOriginFirstLabel: [{ type: Input }],
1047
- labelOrigin: [{ type: Input }],
1048
- placeholderOrigin: [{ type: Input }],
1049
- labelDestination: [{ type: Input }],
1050
- geolocationLabel: [{ type: Input }],
1051
- geolocationBlockedLabel: [{ type: Input }],
1052
- placeholderDestination: [{ type: Input }],
1053
- keepSelection: [{ type: Input }],
1054
- editSearchTitle: [{ type: Input }],
1055
- nasFormGroup: [{ type: Input }],
1056
- nasFormControlNameOrigin: [{ type: Input }],
1057
- nasFormControlNameDestination: [{ type: Input }],
1058
- nasFormControlNameTripType: [{ type: Input }],
1059
- nasFormControlNameDirectOnly: [{ type: Input }],
1060
- nasFormControlNameOutbound: [{ type: Input }],
1061
- nasFormControlNameInbound: [{ type: Input }],
1062
- nasFormControlGroupBooking: [{ type: Input }],
1063
- nasFormControlNameSubsidyDiscount: [{ type: Input }],
1064
- overrideOrigin: [{ type: Input }],
1065
- enableSuggestions: [{ type: Input }],
1066
- closestAirports: [{ type: Input }],
1067
- minimize: [{ type: Input }],
1068
- airports: [{ type: Input }],
1069
- tripType: [{ type: Input }],
1070
- directOnly: [{ type: Input }],
1071
- groupBookingLimit: [{ type: Input }],
1072
- subsidyDiscounts: [{ type: Input }],
1073
- selectedSubsidyDiscount: [{ type: Input }],
1074
- subsidyDiscountLabel: [{ type: Input }],
1075
- ariaLabelPreviousMonth: [{ type: Input }],
1076
- ariaLabelNextMonth: [{ type: Input }],
1077
- originOpenChange: [{ type: Output }],
1078
- destinationOpenChange: [{ type: Output }],
1079
- passengerSelectOpenChange: [{ type: Output }],
1080
- originChange: [{ type: Output }],
1081
- destinationChange: [{ type: Output }],
1082
- passengersChange: [{ type: Output }],
1083
- tripTypeChange: [{ type: Output }],
1084
- directOnlyChange: [{ type: Output }],
1085
- noAvailableFlightsLabel: [{ type: Input }],
1086
- availableFlightsLabel: [{ type: Input }],
1087
- disablePastSelection: [{ type: Input }],
1088
- outboundLabel: [{ type: Input }],
1089
- inboundLabel: [{ type: Input }],
1090
- availability: [{ type: Input }],
1091
- outboundAvailableDates: [{ type: Input }],
1092
- inboundAvailableDates: [{ type: Input }],
1093
- times: [{ type: Input }],
1094
- dateDisplayFormat: [{ type: Input }],
1095
- timeDisplayFormat: [{ type: Input }],
1096
- locale: [{ type: Input }],
1097
- compact: [{ type: Input }],
1098
- outboundDisabled: [{ type: Input }],
1099
- inboundDisabled: [{ type: Input }],
1100
- enableDatepickers: [{ type: Input }],
1101
- minimizingLabel: [{ type: Input }],
1102
- maximizingLabel: [{ type: Input }],
1103
- directOnlyMobileLabel: [{ type: Input }],
1104
- orLabel: [{ type: Input }],
1105
- invalidDestinationText: [{ type: Input }],
1106
- outboundSelectedDate: [{ type: Input }],
1107
- inboundSelectedDate: [{ type: Input }],
1108
- enableDestinationSelect: [{ type: Input }],
1109
- enablePassengersSelect: [{ type: Input }],
1110
- enableTripSwitch: [{ type: Input }],
1111
- enableTransitSwitch: [{ type: Input }],
1112
- outboundSelectedDateChange: [{ type: Output }],
1113
- inboundSelectedDateChange: [{ type: Output }],
1114
- outboundOpenChange: [{ type: Output }],
1115
- inboundOpenChange: [{ type: Output }],
1116
- outboundMonthChange: [{ type: Output }],
1117
- inboundMonthChange: [{ type: Output }],
1118
- focusOnNextChange: [{ type: Output }],
1119
- positionChange: [{ type: Output }],
1120
- subsidyDiscountInfoClick: [{ type: Output }]
1121
- };
1122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUl0RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUN2RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQVVwRTs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxnQkFBZ0I7SUFxMkJuRCxZQUNTLFlBQTBCLEVBQ3pCLFdBQXdCLEVBQ3hCLHNCQUE4QyxFQUM5QyxXQUF1QixFQUN4QixVQUFzQixFQUNyQixjQUFpQztRQUN6QyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFOYixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3hCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFD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Szs0QkFPTCxLQUFLOzhCQU1MLEtBQUs7MkJBUUwsS0FBSzt1Q0FRTCxLQUFLOzRDQVFMLEtBQUs7eUNBUUwsS0FBSzsyQ0FRTCxLQUFLO3lDQVFMLEtBQUs7d0NBUUwsS0FBSzt5Q0FRTCxLQUFLO2dEQVFMLEtBQUs7NkJBTUwsS0FBSztnQ0FNTCxLQUFLOzhCQUVMLEtBQUs7dUJBbUJMLEtBQUs7dUJBUUwsS0FBSzt1QkFpQkwsS0FBSzt5QkFpQkwsS0FBSztnQ0FpQkwsS0FBSzsrQkFNTCxLQUFLO3NDQU1MLEtBQUs7bUNBTUwsS0FBSztxQ0FNTCxLQUFLO2lDQU1MLEtBQUs7K0JBTUwsTUFBTTtvQ0FNTixNQUFNO3dDQU1OLE1BQU07MkJBTU4sTUFBTTtnQ0FNTixNQUFNOytCQU1OLE1BQU07NkJBTU4sTUFBTTsrQkFNTixNQUFNO3NDQU1OLEtBQUs7b0NBTUwsS0FBSzttQ0FNTCxLQUFLOzRCQU1MLEtBQUs7MkJBTUwsS0FBSzsyQkFNTCxLQUFLO3FDQU1MLEtBQUs7b0NBTUwsS0FBSztvQkFNTCxLQUFLO2dDQU9MLEtBQUs7Z0NBTUwsS0FBSztxQkFPTCxLQUFLO3NCQU1MLEtBQUs7K0JBTUwsS0FBSzs4QkFNTCxLQUFLO2dDQU1MLEtBQUs7OEJBT0wsS0FBSzs4QkFPTCxLQUFLO29DQU9MLEtBQUs7c0JBTUwsS0FBSztxQ0FNTCxLQUFLO21DQU1MLEtBQUs7a0NBbUJMLEtBQUs7c0NBbUJKLEtBQUs7cUNBTU4sS0FBSzsrQkFNTCxLQUFLO2tDQU1MLEtBQUs7eUNBTUwsTUFBTTt3Q0FNTixNQUFNO2lDQU9OLE1BQU07Z0NBTU4sTUFBTTtrQ0FNTixNQUFNO2lDQU1OLE1BQU07Z0NBTU4sTUFBTTs2QkFNTixNQUFNO3VDQU1OLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgTm9yd2VnaWFuIEFpciBTaHV0dGxlLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyaXBUeXBlIH0gZnJvbSAnLi9lbnVtcy90cmlwLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBOYXNDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vY29yZS9iYXNlL25hcy1jb21wb25lbnQuYmFzZSc7XG5pbXBvcnQgeyBBYmFuZG9uZWRCYXNrZXRJdGVtTW9kZWwgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9hYmFuZG9uZWQtYmFza2V0LWl0ZW0ubW9kZWwnO1xuaW1wb3J0IHsgQ2xhc3NNb2RlbCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL2NsYXNzLm1vZGVsJztcbmltcG9ydCB7IFV0Y0RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy91dGMtZGF0ZS5tb2RlbCc7XG5pbXBvcnQgeyBBYmFuZG9uZWRCYXNrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9hYmFuZG9uZWQtYmFza2V0L2FiYW5kb25lZC1iYXNrZXQuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlSGVscGVyIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9kYXRlL2RhdGUtaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGV2aWNlSGVscGVyIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9kZXZpY2UvZGV2aWNlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9zb3J0L3NvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vYWlycG9ydC1zZWxlY3QvYWlycG9ydC1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IEFpcnBvcnRNb2RlbCB9IGZyb20gJy4uL2FpcnBvcnQtc2VsZWN0L21vZGVscy9haXJwb3J0Lm1vZGVsJztcbmltcG9ydCB7IERhdGVwaWNrZXJDb21ib0NvbXBvbmVudCB9IGZyb20gJy4uL2RhdGVwaWNrZXItY29tYm8vZGF0ZXBpY2tlci1jb21iby5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFzc2VuZ2Vyc01vZGVsIH0gZnJvbSAnLi4vcGFzc2VuZ2VyLXNlbGVjdC9tb2RlbHMvcGFzc2VuZ2Vycy5tb2RlbCc7XG5pbXBvcnQgeyBTdWJzaWR5RGlzY291bnRNb2RlbCB9IGZyb20gJy4uL3N1YnNpZHktZGlzY291bnQvbW9kZWxzL3N1YnNpZHktZGlzY291bnQubW9kZWwnO1xuaW1wb3J0IHsgUGFzc2VuZ2VyU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vcGFzc2VuZ2VyLXNlbGVjdC9wYXNzZW5nZXItc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzaWR5RGlzY291bnRDb21wb25lbnQgfSBmcm9tICcuLi9zdWJzaWR5LWRpc2NvdW50L3N1YnNpZHktZGlzY291bnQuY29tcG9uZW50JztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE5vcndlZ2lhbiBGaWx0ZXIgQ29tcG9uZW50IHwgRnVuY3Rpb25hbFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduYXMtZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZpbHRlckNvbXBvbmVudCBleHRlbmRzIE5hc0NvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuICBAVmlld0NoaWxkKCdwYXNzZW5nZXJTZWxlY3REcm9wZG93bicpIHBhc3NlbmdlclNlbGVjdERyb3Bkb3duOiBEcm9wZG93bkNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgncGFzc2VuZ2VyU2VsZWN0JykgcGFzc2VuZ2VyU2VsZWN0OiBQYXNzZW5nZXJTZWxlY3RDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyaXBTd2l0Y2gnKSB0cmlwU3dpdGNoOiBEcm9wZG93bkNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgndHJhbnNpdFN3aXRjaCcpIHRyYW5zaXRTd2l0Y2g6IERyb3Bkb3duQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdhaXJwb3J0U2VsZWN0JykgYWlycG9ydFNlbGVjdDogQWlycG9ydFNlbGVjdENvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnZGF0ZXBpY2tlckNvbWJvJykgZGF0ZXBpY2tlckNvbWJvOiBEYXRlcGlja2VyQ29tYm9Db21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJpcFR5cGVPbmV3YXknKSB0cmlwVHlwZU9uZXdheTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJpcFR5cGVSb3VuZFRyaXAnKSB0cmlwVHlwZVJvdW5kVHJpcDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJhbnNpdFR5cGVEaXJlY3RPbmx5JykgdHJhbnNpdFR5cGVEaXJlY3RPbmx5OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0cmFuc2l0VHlwZVRyYW5zaXQnKSB0cmFuc2l0VHlwZVRyYW5zaXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3N1YnNpZHlEaXNjb3VudCcpIHN1YnNpZHlEaXNjb3VudDogU3Vic2lkeURpc2NvdW50Q29tcG9uZW50O1xuXG4gIGxhdGVzdFNlYXJjaGVzT3JpZ2luOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBkaXNwbGF5U3VtbWFyeSA9IHRydWU7XG4gIG5hdGl2ZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBpbmJvdW5kTG93ZXJMaW1pdERhdGU6IFV0Y0RhdGU7XG4gIGNvbnRhaW5lcldpZHRoID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBtYXhpbWl6ZSA9IGZhbHNlO1xuICBpc05hc0dyb3VwVmFsaWQgPSBmYWxzZTtcblxuICBnZXQgb3V0Ym91bmRPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm91dGJvdW5kT3BlblZhbHVlO1xuICB9XG4gIHNldCBvdXRib3VuZE9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5vdXRib3VuZE9wZW5WYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bnMoKTtcblxuICAgICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vdXRib3VuZE9wZW5WYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3V0Ym91bmRPcGVuQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGluYm91bmRPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluYm91bmRPcGVuVmFsdWU7XG4gIH1cbiAgc2V0IGluYm91bmRPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaW5ib3VuZE9wZW5WYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bnMoKTtcblxuICAgICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5ib3VuZE9wZW5UaW1lb3V0KTtcblxuICAgIHRoaXMuaW5ib3VuZE9wZW5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmluYm91bmRPcGVuVmFsdWUgPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMuaW5ib3VuZE9wZW5DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGluYm91bmRPcGVuVGltZW91dDogYW55O1xuXG4gIC8qKlxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgcmVjb3JkIGNvbnRhaW5pbmcga2V5cyB3aXRoIGFsbCBhaXJwb3J0IGNvZGVzIHdpdGggY29ycmVzcG9uZGluZyBhcnJheSBvZiBhaXJwb3J0IGNvZGVzIGNvbm5lY3RlZCB0byB0aGUga2V5LlxuICAgKi9cbiAgQElucHV0KCkgYWlycG9ydFJlbGF0aW9uczogUmVjb3JkPHN0cmluZywgQXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBZGRzICdhcmlhLWxhYmVsJyBvbiB0aGUgY2xlYXIgYnV0dG9uIGluc2lkZSB0aGUgYWlycG9ydCBzZWxlY3QgaW5wdXRzLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsQ2xlYXI6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFSSUEgbGFiZWwgZm9yIHRoZSBzdWJ0cmFjdCBidXR0b25zLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsU3VidHJhY3Q6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFkZHMgJ2FyaWEtbGFiZWwnIHRvIHRoZSBiYWNrZHJvcHMuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxCYWNrZHJvcDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQVJJQSBsYWJlbCBmb3IgdGhlIGFkZCBidXR0b25zLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsQWRkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxpc3Qgb2YgYWlycG9ydHMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBvcmlnaW4gZHJvcGRvd24uXG4gICAqIElmIG5vdCBpbmNsdWRlZCwgYWxsIGFpcnBvcnRzIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgYWxsb3dlZE9yaWdpbkFpcnBvcnRzOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gYXJyYXkgb2YgYWlycG9ydHMgdGhhdCBhcmUgcmVzdHJpY3RlZCBmb3IgZGVzdGluYXRpb24gYWlycG9ydHMuIEl0IHdpbGwgZGVmYXVsdCB0byBhaXJwb3J0cyBpZiBub3Qgc2V0LlxuICAgKi9cbiAgQElucHV0KCkgYWxsb3dlZERlc3RpbmF0aW9uQWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhaXJwb3J0cyB0aGF0IHRoZSB1c2VyIGFsbHJlYWR5IGhhcyBzZWFyaCBmb3Igc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlMYXRlc3RTZWFyY2hlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIERpc3BsYXkgc3dpdGNoIFVJIHRvIGludGVyY2hhbmdlIG9yaWdpbiBhbmQgZGVzdGluYXRpb24gYWlycG9ydC5cbiAgICovXG4gIEBJbnB1dCgpIHVzZVN3aXRjaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhaXJwb3J0cyB0aGF0IGFyZSBjbG9zZSB0byB0aGUgdXNlciBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheUNsb3Nlc3RBaXJwb3J0czogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBhaXJwb3J0IGNvZGUgb2YgdGhlIG9yaWdpbiBhaXJwb3J0LiBJdCB3aWxsIHNldCB0aGUgc2VsZWN0ZWQgb3JpZ2luIGFpcnBvcnQgYmFzZWQgb24gdGhpcyB2YWx1ZS5cbiAgICovXG4gIEBJbnB1dCgpIG9yaWdpbkFpcnBvcnRDb2RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgYWlycG9ydCBjb2RlIG9mIHRoZSBkZXN0aW5hdGlvbiBhaXJwb3J0LiBJdCB3aWxsIHNldCB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24gYWlycG9ydCBiYXNlZCBvbiB0aGlzIHZhbHVlLlxuICAgKi9cbiAgQElucHV0KCkgZGVzdGluYXRpb25BaXJwb3J0Q29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIHRvdGFsIG1heGltdW0gYW1vdW50IG9mIHBhc3NlbmdlcnMgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBtYXhQYXhDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gYXJyYXkgb2YgZGlmZmVyZW50IHBhc3NlbmdlciB0eXBlcyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHBhc3NlbmdlcnMoKTogQXJyYXk8UGFzc2VuZ2Vyc01vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMucGFzc2VuZ2Vyc1ZhbHVlO1xuICB9XG4gIHNldCBwYXNzZW5nZXJzKHZhbHVlOiBBcnJheTxQYXNzZW5nZXJzTW9kZWw+KSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGFzc2VuZ2Vyc1ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5wYXNzZW5nZXJzQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgbWluaW11bSBhbW91bnQgb2YgYWR1bHRzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGluIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgbWluQWR1bHRDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3Igcm91bmQgdHJpcCBzZWxlY3Rpb24gaW4gdGhlIHRyaXAgc3dpdGNoIGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgdHJpcFN3aXRjaFJvdW5kVHJpcExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciBvbmUgd2F5IHNlbGVjdGlvbiBpbiB0aGUgdHJpcCBzd2l0Y2ggZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSB0cmlwU3dpdGNoT25lV2F5TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIGRpcmVjdCBvbmx5IHNlbGVjdGlvbiBpbiB0aGUgdHJhbnNpdCBzd2l0Y2ggZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3RPbmx5TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIGJvdGggZGlyZWN0IGFuZCB0cmFuc2l0IHNlbGVjdGlvbiBpbiB0aGUgdHJhbnNpdCBzd2l0Y2ggZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3RUcmFuc2l0TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEluZGljYXRlcyBpZiB0aGUgZmlsdGVyIHNob3VsZCBiZSBtaW5pbWl6ZWQgb24gbW9iaWxlIHNjcmVlbiBzaXplcy5cbiAgICovXG4gIEBJbnB1dCgpIG1pbmltaXplT25Nb2JpbGU/OiBib29sZWFuO1xuXG4gLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEluZGljYXRlcyBpZiB0aGUgZWRpdCBzZWFyY2ggb2YgYWNjb3JkaW9uIHNob3VsZCBiZSBleHBlbmRlZCBvbiBtb2JpbGUgc2NyZWVuIHNpemVzLlxuICovXG4gIEBJbnB1dCgpXG4gIGdldCBleHBhbmRlZEFjY29yZGlvbk1vYmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZEFjY29yZGlvbk1vYmlsZVZhbHVlO1xuICB9XG4gIHNldCBleHBhbmRlZEFjY29yZGlvbk1vYmlsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5leHBhbmRlZEFjY29yZGlvbk1vYmlsZVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5leHBhbmRlZEFjY29yZGlvbk1vYmlsZVZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgc2VwYXJhdG9yIGZvciB0aGUgZmlsdGVyIHN1bW1hcnkgdGhhdCBpcyBkaXNwYXllZCBpZiBtaW5pbWl6ZU9uTW9iaWxlIGlzIHRydWUuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqIDEgdHJhdmVsbGVyLCByb3VuZCB0cmlwIGFuZCBkaXJlY3QvdHJhbnNpdFxuICAgKi9cbiAgQElucHV0KCkgZGVmYXVsdFN1bW1hcnlTZXBhcmF0b3IgPSAnJztcblxuICAvKipcbiAgICogQSBzZXBhcmF0b3IgZm9yIHRoZSBmaWx0ZXIgc3VtbWFyeSBpcyBhcmUgZGlzcGF5ZWQgaWYgbWluaW1pemVPbk1vYmlsZSBpcyB0cnVlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKiAxIHRyYXZlbGxlciwgcm91bmQgdHJpcCBhbmQgZGlyZWN0L3RyYW5zaXRcbiAgICovXG4gIEBJbnB1dCgpIGxhc3RTdW1tYXJ5U2VwYXJhdG9yID0gJyc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHRpdGxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciB0aGUgYWR1bHRzIHBhc3NlbmdlciB0eXBlIGluIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgcGFzc2VuZ2VyU2VsZWN0QWR1bHRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIHRoZSBjaGlsZHJlbiBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdENoaWxkcmVuTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIHRoZSBpbmZhbnRzIHBhc3NlbmdlciB0eXBlIGluIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgcGFzc2VuZ2VyU2VsZWN0SW5mYW50c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgd2hlbiB0b3RhbCBudW1iZXIgb2Ygc2VsZWN0ZWQgcGFzc2VuZ2VycyBleGNlZWRzIHRoZSBncm91cCBib29raW5nIGxpbWl0XG4gICAqL1xuICBASW5wdXQoKSBncm91cEJvb2tpbmdMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiBhbGwgYWlycG9ydHMgaW4gdGhlIGFpcnBvcnQgc2VsZWN0IGRyb3AgZG93biBsaXN0cy5cbiAgICovXG4gIEBJbnB1dCgpIGFsbEFpcnBvcnRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBvbiB0b3Agb2YgdGhlIGxhdGVzdCBzZWFyY2hlcyBpbiB0aGUgYWlycG9ydCBzZWxlY3QgZHJvcCBkb3duIGxpc3RzLlxuICAgKi9cbiAgQElucHV0KCkgbGF0ZXN0U2VhcmNoZXNMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgY2xvc2VzdCBhaXJwb3J0cyBpbiB0aGUgYWlycG9ydCBzZWxlY3QgZHJvcCBkb3duIGxpc3RzLlxuICAgKi9cbiAgQElucHV0KCkgY2xvc2VzdEFpcnBvcnRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBpbiB0aGUgZGVzdGluYXRpb24gaW5wdXQgZmllbGQgaW4gdGhlIGFpcnBvcnQgc2VsZWN0LCBpZiB0aGVcbiAgICogdXNlciB0cmllcyB0byBzZWxlY3QgYSBkZXN0aW5hdGlvbiBhaXJwb3J0IHdpdGhvdXQgc2VsZWN0aW5nIGFuIG9yaWdpbiBhaXJwb3J0LlxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0T3JpZ2luRmlyc3RMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBvbiB0b3Agb2YgdGhlIG9yaWdpbiBhaXJwb3J0IGlucHV0IGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWxPcmlnaW46IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgcGxhY2Vob2xkZXIgdGhhdCB3aWxsIGFwcGVhciBvbiB0aGUgb3JpZ2luIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlck9yaWdpbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBvbiB0b3Agb2YgdGhlIGRlc3RpbmF0aW9uIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbERlc3RpbmF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgaW4gbXkgbG9jYXRpb24gaW4gdGhlIGRyb3AgZG93biBsaXN0IGluIGFpcnBvcnQgc2VsZWN0LlxuICAgKi9cbiAgQElucHV0KCkgZ2VvbG9jYXRpb25MYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIGluIG15IGxvY2F0aW9uLCBpbiB0aGUgZHJvcCBkb3duIGxpc3QgaW4gYWlycG9ydCBzZWxlY3QgaWYgdXNlciBoYXMgZGVuaWVkIGdlb2xvY2F0aW9uLlxuICAgKi9cbiAgQElucHV0KCkgZ2VvbG9jYXRpb25CbG9ja2VkTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgcGxhY2Vob2xkZXIgdGhhdCB3aWxsIGFwcGVhciBvbiB0aGUgZGVzdGluYXRpb24gYWlycG9ydCBpbnB1dCBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyRGVzdGluYXRpb24gPSAnJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbW9kaWZpZXIgdGhhdCB3aWxsIGFsbG93IGFsd2F5cyBrZWVwaW5nIHRoZSBzZWxlY3RlZCBhaXJwb3J0LlxuICAgKiBUaGUgbGFzdCBzZWxlY3RlZCBhaXJwb3J0IHdpbGwgYmUgc2hvd24gb25jZSB1c2VyIGNsZWFycyB0aGUgc2VsZWN0aW9uIGFuZCBibHVyLlxuICAgKi9cbiAgQElucHV0KCkga2VlcFNlbGVjdGlvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgdGl0bGUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGVkaXQgc2VhcmNoIGFjY29yZGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIGVkaXRTZWFyY2hUaXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQWRkcyB0aGUgcGFyZW50J3MgZm9ybSBncm91cC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgaXMgcmVxdWllcmVkIHRvIGJlIGZpbGxlZCBpZiBuYXNGb3JtQ29udHJvbE5hbWUgYWRkZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtR3JvdXA6IEZvcm1Hcm91cDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZU9yaWdpbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lRGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZVRyaXBUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVEaXJlY3RPbmx5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVPdXRib3VuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lSW5ib3VuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xHcm91cEJvb2tpbmc6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZVN1YnNpZHlEaXNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTWFrZSBsYXRlc3Qgc2VhcmNoZXMgYW5kIGdlb2xvY2F0aW9uIG92ZXJyaWRlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIG9yaWdpbiBhaXJwb3J0IHNlbGVjdG9yLlxuICAgKi9cbiAgQElucHV0KCkgb3ZlcnJpZGVPcmlnaW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyB3aWxsIG1ha2UgdGhlIGZpbHRlciBkaXNwbGF5IHN1Z2dlc3RlZCBhaXJwb3J0cyBiYXNlZCBvbiBnZW9sb2NhdGlvbiBhbmQgbGF0ZXN0IHNlYXJjaGVzLlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlU3VnZ2VzdGlvbnM/OiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBjbG9zZXN0QWlycG9ydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VzdEFpcnBvcnRzVmFsdWU7XG4gIH1cbiAgc2V0IGNsb3Nlc3RBaXJwb3J0cyhhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPikge1xuICAgIGlmICghYWlycG9ydHMgfHwgYWlycG9ydHMubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VzdEFpcnBvcnRzVmFsdWUgPSBhaXJwb3J0cztcblxuICAgIGlmICh0aGlzLmV4aXN0cyh0aGlzLm92ZXJyaWRlT3JpZ2luKSkge1xuICAgICAgdGhpcy5vcmlnaW5BaXJwb3J0Q29kZSA9IGFpcnBvcnRzWzBdLmNvZGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBvbmx5IGRpc3BsYXkgYWlycG9ydCBzZWxlY3Rpb24uIFdoZW4gYSBjaXR5IHBhaXIgaXMgc2VsZWN0ZWQsIHRoZSByZXN0IG9mIHRoZSBmaWx0ZXIgd2lsbCBiZSB2aXNpYmxlLlxuICAgKi9cbiAgQElucHV0KCkgbWluaW1pemU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFsbCBhaXJwb3J0cyB0aGF0IHdpbGwgYmUgcG9wdWxhdGVkIGludG8gdGhlIGRyb3Bkb3duIGxpc3RzLlxuICAgKiBJZiBkaXNwbGF5TGF0ZXN0U2VhcmNoZXMgaXMgdHJ1ZSwgaXQgd2lsbCB0cnkgdG8gZ2V0IHRoZSBsYXRlc3Qgc2VhcmNoZXMgZnJvbSB0aGUgYWJhbmRvbmVkIGJhc2tldC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBhaXJwb3J0cygpIHtcbiAgICByZXR1cm4gdGhpcy5haXJwb3J0c1ZhbHVlO1xuICB9XG4gIHNldCBhaXJwb3J0cyhhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPikge1xuICAgIHRoaXMuYWlycG9ydHNWYWx1ZSA9IGFpcnBvcnRzO1xuXG4gICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUxhdGVzdFNlYXJjaGVzKSkge1xuICAgICAgY29uc3QgYWJhbmRvbmVkQmFza2V0ID0gdGhpcy5hYmFuZG9uZWRCYXNrZXRTZXJ2aWNlLmdldEFsbCgpO1xuICAgICAgdGhpcy5zZXRMYXRlc3RTZWFyY2hlcyhhYmFuZG9uZWRCYXNrZXQsIHRoaXMuYWlycG9ydHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB0aGUgc2VsZWN0ZWQgdHJpcCB0eXBlLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHRyaXBUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnRyaXBUeXBlVmFsdWU7XG4gIH1cbiAgc2V0IHRyaXBUeXBlKHRyaXBUeXBlOiBUcmlwVHlwZSkge1xuICAgIGlmICh0cmlwVHlwZSA9PT0gdGhpcy50cmlwVHlwZVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmlwVHlwZVZhbHVlID0gdHJpcFR5cGU7XG4gICAgdGhpcy50cmlwVHlwZUNoYW5nZS5lbWl0KHRoaXMudHJpcFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGFuZCBnZXRzIHdoZXRoZXIgdGhlIHNlbGVjdGVkIHRyYW5zaXQgdHlwZSBpcyBkaXJlY3Qgb25seSBvciBub3QuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlyZWN0T25seSgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXJlY3RPbmx5VmFsdWU7XG4gIH1cbiAgc2V0IGRpcmVjdE9ubHkoZGlyZWN0T25seTogYm9vbGVhbikge1xuICAgIGlmIChkaXJlY3RPbmx5ID09PSB0aGlzLmRpcmVjdE9ubHlWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlyZWN0T25seVZhbHVlID0gZGlyZWN0T25seTtcbiAgICB0aGlzLmRpcmVjdE9ubHlDaGFuZ2UuZW1pdCh0aGlzLmRpcmVjdE9ubHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgbGltaXQgZm9yIHdoZW4gdGhlIHRvdGFsIGFtb3VudCBvZiBwYXNzZW5nZXJzIGV4Y2VlZHMgdG8gYmUgYSBncm91cCBib29raW5nLlxuICAgKi9cbiAgQElucHV0KCkgZ3JvdXBCb29raW5nTGltaXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFN1YnNpZHkgZGlzY291bnRzXG4gICAqL1xuICBASW5wdXQoKSBzdWJzaWR5RGlzY291bnRzOiBBcnJheTxTdWJzaWR5RGlzY291bnRNb2RlbD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZWxlY3RlZCBzdWJzaWR5IGRpc2NvdW50XG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZFN1YnNpZHlEaXNjb3VudDogU3Vic2lkeURpc2NvdW50TW9kZWw7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTdWJzaWR5IGRpc2NvdW50IGxhYmVsXG4gICAqL1xuICBASW5wdXQoKSBzdWJzaWR5RGlzY291bnRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQVJJQSBsYWJlbCBmb3IgdGhlIHByZXZpb3VzIG1vbnRoIGJ1dHRvbiBpbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxQcmV2aW91c01vbnRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBUklBIGxhYmVsIGZvciB0aGUgbmV4dCBtb250aCBidXR0b24gaW4gdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsTmV4dE1vbnRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgdGhlIG9yaWdpbiBkcm9wZG93biBzZWxlY3RvciBvcGVucyBvciBjbG9zZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgb3JpZ2luT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgKiBAZGVzY3JpcHRpb25cbiAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgdGhlIG9yaWdpbiBkcm9wZG93biBzZWxlY3RvciBvcGVucyBvciBjbG9zZXMuXG4gICovXG4gIEBPdXRwdXQoKSBkZXN0aW5hdGlvbk9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24gb3BlbnMgb3IgY2xvc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIHBhc3NlbmdlclNlbGVjdE9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgdGhlIHNlbGVjdGVkIG9yaWdpbiBhaXJwb3J0IGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgb3JpZ2luQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBaXJwb3J0TW9kZWw+KCk7XG5cbiAgLyoqXG4gICogQGRlc2NyaXB0aW9uXG4gICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBzZWxlY3RlZCBkZXN0aW5hdGlvbiBhaXJwb3J0IGNoYW5nZXMuXG4gICovXG4gIEBPdXRwdXQoKSBkZXN0aW5hdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QWlycG9ydE1vZGVsPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIGEgcGFzc2VuZ2VyIHNlbGVjdGlvbiBjaGFuZ2UgaXMgcGVyZm9ybWVkLlxuICAgKi9cbiAgQE91dHB1dCgpIHBhc3NlbmdlcnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFBhc3NlbmdlcnNNb2RlbD4+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGFuZCBnZXRzIHRoZSBzZWxlY3RlZCB0cmlwIHR5cGUuXG4gICAqL1xuICBAT3V0cHV0KCkgdHJpcFR5cGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRyaXBUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB3aGV0aGVyIHRoZSBzZWxlY3RlZCB0cmFuc2l0IHR5cGUgaXMgZGlyZWN0IG9ubHkgb3Igbm90LlxuICAgKi9cbiAgQE91dHB1dCgpIGRpcmVjdE9ubHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3Igbm8gYXZhaWxhYmxlIGZsaWdodHMuXG4gICAqL1xuICBASW5wdXQoKSBub0F2YWlsYWJsZUZsaWdodHNMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIGF2YWlsYWJsZSBmbGlnaHRzLlxuICAgKi9cbiAgQElucHV0KCkgYXZhaWxhYmxlRmxpZ2h0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEaXNhYmxlIHBvc3NpYmlsaXR5IHRvIHNlbGVjdCBkYXRlcyBpbiB0aGUgcGFzdC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVQYXN0U2VsZWN0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIG91dGJvdW5kIGRhdGVwaWNrZXIuXG4gICAqL1xuICBASW5wdXQoKSBvdXRib3VuZExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgaW5ib3VuZCBkYXRlcGlja2VyLlxuICAgKi9cbiAgQElucHV0KCkgaW5ib3VuZExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBkYXRlcGlja2VycyBpbiBhdmFpbGFiaWxpdHkgbW9kZSB3aGVyZSBhdmFpbGFibGUgZGF0ZXMgY2FuIGJlIGFkZGVkLlxuICAgKi9cbiAgQElucHV0KCkgYXZhaWxhYmlsaXR5OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXZhaWxhYmxlIGRhdGVzIGZvciBvdXRib3VuZCBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIG91dGJvdW5kQXZhaWxhYmxlRGF0ZXM6IEFycmF5PFV0Y0RhdGU+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXZhaWxhYmxlIGRhdGVzIGZvciBpbmJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQElucHV0KCkgaW5ib3VuZEF2YWlsYWJsZURhdGVzOiBBcnJheTxVdGNEYXRlPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIElmIHNldCwgRW5hYmxlcyB0aGUgdGltZSBkcm9wZG93biBzZWxlY3RvciBhbG9uZ3NpZGUgZGF0ZXBpY2tlci5cbiAgICovXG4gIEBJbnB1dCgpIHRpbWVzOiBBcnJheTxVdGNEYXRlPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBkaXNwbGF5IGZvcm1hdCBvZiB0aGUgZGF0ZSB3aGVuIHVzZXIgaGFzIHNlbGVjdGVkIHRoZSBkYXRlIGFuZCBpdCBpcyBiZWluZyBzaG93biBpbiB0aGUgaW5wdXQgYm94IGZvciB0aGUgZGF0ZSBwaWNrZXIuXG4gICAqIFBsZWFzZSBsb29rIGF0IHRoZSBhbmd1bGFyIERhdGUgcGlwZSBmb3IgdmFsaWQgZm9ybWF0cyBhbmQgdmFyaWF0aW9ucy5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGVEaXNwbGF5Rm9ybWF0ID0gJ0VFRUUgZCwgTU1NTSB5eXl5JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSB0aW1lIGRpc3BsYXkgZm9ybWF0LlxuICAgKi9cbiAgQElucHV0KCkgdGltZURpc3BsYXlGb3JtYXQgPSAnSEg6bW0nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLiBXaGVuIG5vdCBzdXBwbGllZCwgdXNlcyB0aGUgdmFsdWUgb2YgTE9DQUxFX0lELCB3aGljaCBpcyBlbi1VUyBieSBkZWZhdWx0LlxuICAgKiBUaGlzIHJlcXVpcmVzIHRoYXQgcmVnaXN0ZXJMb2NhbGVEYXRhIGlzIGNhbGxlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGxvY2FsZS5cbiAgICovXG4gIEBJbnB1dCgpIGxvY2FsZSA9ICdlbi1HQic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIG1vZGlmaWVyIHRvIHJlbW92ZSB0aGUgcGFkZGluZyBhbmQgbWFyZ2lucyBhcm91bmQgdGhlIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBjb21wYWN0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRGlzYWJsZSBwb3NzaWJpbGl0eSB0byBzZWxlY3Qgb3V0Ym91bmQgZGF0ZXMuXG4gICAqL1xuICBASW5wdXQoKSBvdXRib3VuZERpc2FibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRGlzYWJsZSBwb3NzaWJpbGl0eSB0byBzZWxlY3QgaW5ib3VuZCBkYXRlcy5cbiAgICovXG4gIEBJbnB1dCgpIGluYm91bmREaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNob3cvQWRkIGRhdGUgcGlja2VyIGNvbWJvIGludG8gdGhlIGZpbHRlciBpZiBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZURhdGVwaWNrZXJzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciB0aGUgdG9nZ2xlIGljb24gZm9yIG1pbmltaXppbmcgZmlsdGVyLlxuICAgKi9cbiAgQElucHV0KCkgbWluaW1pemluZ0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIHRoZSB0b2dnbGUgaWNvbiBmb3IgbWF4aW1pemluZyBmaWx0ZXIuXG4gICAqL1xuICBASW5wdXQoKSBtYXhpbWl6aW5nTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgdGhlIHRvZ2dsaW5nIHRyYW5zaXQgdHlwZSB3aGVuIGZpbHRlciBpcyBtaW5pbWl6ZWQuXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3RPbmx5TW9iaWxlTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciAnb3InIGluIHRoZSBzdWdnZXN0aW9uZWQgYWlycG9ydHMuXG4gICAqL1xuICBASW5wdXQoKSBvckxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHRleHQgdGhhdCBhcHBlYXJzIGluIHRoZSBkZXN0aW5hdGlvbnMgZHJvcGRvd24gbGlzdCB3aGVuIG9yaWdpbiBhaXJwb3J0IGlzIG5vdCBzZXQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkRGVzdGluYXRpb25UZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZWxlY3RlZCBkYXRlZm9yIG91dGJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG91dGJvdW5kU2VsZWN0ZWREYXRlKCkge1xuICAgIHJldHVybiB0aGlzLm91dGJvdW5kU2VsZWN0ZWREYXRlVmFsdWU7XG4gIH1cbiAgc2V0IG91dGJvdW5kU2VsZWN0ZWREYXRlKGRhdGU6IFV0Y0RhdGUpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMub3V0Ym91bmRTZWxlY3RlZERhdGVWYWx1ZSA9IGRhdGU7XG4gICAgICB0aGlzLm91dGJvdW5kU2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNlbGVjdGVkIGRhdGVmb3IgaW5ib3VuZCBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpbmJvdW5kU2VsZWN0ZWREYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmluYm91bmRTZWxlY3RlZERhdGVWYWx1ZTtcbiAgfVxuICBzZXQgaW5ib3VuZFNlbGVjdGVkRGF0ZShkYXRlOiBVdGNEYXRlKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmluYm91bmRTZWxlY3RlZERhdGVWYWx1ZSA9IGRhdGU7XG4gICAgICB0aGlzLmluYm91bmRTZWxlY3RlZERhdGVDaGFuZ2UuZW1pdChkYXRlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2lsbCBkaXNwbGF5IHRoZSBkZXN0aW5hdGlvbiBpbnB1dCwgc2V0IHRoaXMgdG8gZmFsc2UgdG8gcmVtb3ZlIGl0LiBJdCdzIHRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gICBASW5wdXQoKSBlbmFibGVEZXN0aW5hdGlvblNlbGVjdCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaWxsIGRpc3BsYXkgcGFzc2VuZ2VyIHNlbGVjdCwgc2V0IHRoaXMgdG8gZmFsc2UgdG8gcmVtb3ZlIGl0LiBJdCdzIHRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZVBhc3NlbmdlcnNTZWxlY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2lsbCBkaXNwbGF5IHRoZSB0cmlwIHN3aXRjaCwgc2V0IHRoaXMgdG8gZmFsc2UgdG8gcmVtb3ZlIGl0LiBJdCdzIHRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZVRyaXBTd2l0Y2ggPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2lsbCBkaXNwbGF5IHRoZSB0cmFuc2l0IHN3aXRjaCwgc2V0IHRoaXMgdG8gZmFsc2UgdG8gcmVtb3ZlIGl0LiBJdCdzIHRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZVRyYW5zaXRTd2l0Y2ggPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2hlbiBzZWxlY3RlZCBkYXRlaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgb3V0Ym91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBAT3V0cHV0KCkgb3V0Ym91bmRTZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFV0Y0RhdGU+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaGVuIHNlbGVjdGVkIGRhdGVoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBpbmJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQE91dHB1dCgpIGluYm91bmRTZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFV0Y0RhdGU+KCk7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE91dGJvdW5kIGRhdGVwaWNrZXIgaXMgb3BlbiBvciBjbG9zZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgb3V0Ym91bmRPcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5ib3VuZCBkYXRlcGlja2VyIGlzIG9wZW4gb3IgY2xvc2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIGluYm91bmRPcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogT3V0Ym91bmQgY2FsZW5kYXIgY2hhbmdlcyBtb250aC5cbiAgICovXG4gIEBPdXRwdXQoKSBvdXRib3VuZE1vbnRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVdGNEYXRlPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5ib3VuZCBjYWxlbmRhciBjaGFuZ2VzIG1vbnRoLlxuICAgKi9cbiAgQE91dHB1dCgpIGluYm91bmRNb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXRjRGF0ZT4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdoZW4gYSB1c2VyIGhhcyBhY3RpdmVseSBjaGFuZ2VkIHRoZSBkYXRlLlxuICAgKi9cbiAgQE91dHB1dCgpIGZvY3VzT25OZXh0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIGdlb2xvY2F0aW9uIG9mIHRoZSB1c2VyLiBXaWxsIGJlIGVtaXR0ZWQgaWYgJ2VuYWJsZVN1Z2dlc3Rpb25zJyBpcyB0cnVlLlxuICAgKi9cbiAgQE91dHB1dCgpIHBvc2l0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHZW9sb2NhdGlvblBvc2l0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbiB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgdGhlIGluZm8gYnV0dG9uIG9uIHRoZSBzdWJzaWR5IGRpc2NvdW50IGlzIGNsaWNrZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgc3Vic2lkeURpc2NvdW50SW5mb0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGdldCBpbmJvdW5kU2VsZWN0ZWRNb250aCgpOiBVdGNEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbmJvdW5kU2VsZWN0ZWRNb250aFZhbHVlO1xuICB9XG4gIHNldCBpbmJvdW5kU2VsZWN0ZWRNb250aChtb250aDogVXRjRGF0ZSkge1xuICAgIGlmICh0aGlzLmRhdGVTZXJ2aWNlLmlzU2FtZU1vbnRoKG1vbnRoLCB0aGlzLmluYm91bmRTZWxlY3RlZE1vbnRoVmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmluYm91bmRNb250aENoYW5nZS5lbWl0KG1vbnRoKTtcbiAgICAgIHRoaXMuaW5ib3VuZFNlbGVjdGVkTW9udGhWYWx1ZSA9IG1vbnRoO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvdXRib3VuZFNlbGVjdGVkRGF0ZVZhbHVlOiBVdGNEYXRlO1xuICBwcml2YXRlIGluYm91bmRTZWxlY3RlZERhdGVWYWx1ZTogVXRjRGF0ZTtcbiAgcHJpdmF0ZSBpbmJvdW5kU2VsZWN0ZWRNb250aFZhbHVlOiBVdGNEYXRlO1xuICBwcml2YXRlIGFpcnBvcnRzVmFsdWU6IEFycmF5PEFpcnBvcnRNb2RlbD47XG4gIHByaXZhdGUgdHJpcFR5cGVWYWx1ZTogVHJpcFR5cGU7XG4gIHByaXZhdGUgZGlyZWN0T25seVZhbHVlOiBib29sZWFuO1xuICBwcml2YXRlIGV4cGFuZGVkQWNjb3JkaW9uTW9iaWxlVmFsdWU6IGJvb2xlYW47XG4gIHByaXZhdGUgY2xvc2VzdEFpcnBvcnRzVmFsdWU6IEFycmF5PEFpcnBvcnRNb2RlbD47XG4gIHByaXZhdGUgb3V0Ym91bmRPcGVuVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbmJvdW5kT3BlblZhbHVlID0gZmFsc2U7XG4gIHByaXZhdGUgcGFzc2VuZ2Vyc1ZhbHVlID0gbmV3IEFycmF5PFBhc3NlbmdlcnNNb2RlbD4oKTtcbiAgcHJpdmF0ZSBmb2N1c0FzeW5jVGltb3V0OiBhbnk7XG4gIHByaXZhdGUgdHJhbnNpdFN3aXRjaEZvY3VzVGltZW91dDogYW55O1xuICBwcml2YXRlIHRyaXBTd2l0Y2hGb2N1c1RpbWVvdXQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGV2aWNlSGVscGVyOiBEZXZpY2VIZWxwZXIsXG4gICAgcHJpdmF0ZSBzb3J0U2VydmljZTogU29ydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhYmFuZG9uZWRCYXNrZXRTZXJ2aWNlOiBBYmFuZG9uZWRCYXNrZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZVNlcnZpY2U6IERhdGVIZWxwZXIsXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICBzdXBlcignbmFzLWZpbHRlcicpO1xuICAgIHRoaXMubmF0aXZlRWxlbWVudCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uYXNGb3JtR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm5hc0Zvcm1Hcm91cC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzTmFzR3JvdXBWYWxpZCA9IHg7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHkpIHtcbiAgICAgIGNvbnN0IGRpcmVjdE9ubHlDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seSk7XG5cbiAgICAgIGlmIChkaXJlY3RPbmx5Q29udHJvbCkge1xuICAgICAgICB0aGlzLmRpcmVjdE9ubHkgPSBkaXJlY3RPbmx5Q29udHJvbC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVUcmlwVHlwZSkge1xuICAgICAgY29uc3QgdHJpcFR5cGVDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lVHJpcFR5cGUpO1xuXG4gICAgICBpZiAodHJpcFR5cGVDb250cm9sKSB7XG4gICAgICAgIHRoaXMudHJpcFR5cGUgPSB0cmlwVHlwZUNvbnRyb2wudmFsdWU7XG4gICAgICAgIHRoaXMuaW5ib3VuZERpc2FibGVkID0gdHJpcFR5cGVDb250cm9sLnZhbHVlID09PSBUcmlwVHlwZS5vbmVXYXk7XG5cbiAgICAgICAgaWYgKHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lSW5ib3VuZCkge1xuICAgICAgICAgIGNvbnN0IGluYm91bmRDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lSW5ib3VuZCk7XG5cbiAgICAgICAgICBpZiAoaW5ib3VuZENvbnRyb2wgJiYgdGhpcy5pbmJvdW5kRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGluYm91bmRDb250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cmlwVHlwZUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWU6IFRyaXBUeXBlKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbmJvdW5kRGlzYWJsZWQgPSB2YWx1ZSA9PT0gVHJpcFR5cGUub25lV2F5O1xuICAgICAgICAgIHRoaXMudHJpcFR5cGUgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seSkge1xuICAgICAgY29uc3QgZGlyZWN0T25seUNvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVEaXJlY3RPbmx5KTtcbiAgICAgIGlmIChkaXJlY3RPbmx5Q29udHJvbCkge1xuICAgICAgICBkaXJlY3RPbmx5Q29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHRoaXMuZGlyZWN0T25seSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG5cbiAgICB0aGlzLmNvbnRhaW5lcldpZHRoLm5leHQoKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRoKTtcblxuICAgIHdpbmRvdy5vbnJlc2l6ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuY29udGFpbmVyV2lkdGgubmV4dCgodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkub2Zmc2V0V2lkdGgpO1xuICAgIH07XG4gIH1cblxuICBvblN1YnNpZHlEaXNjb3VudEluZm9DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNpZHlEaXNjb3VudEluZm9DbGljay5lbWl0KCk7XG4gIH1cblxuICBvblN1YnNpZHlEaXNjb3VudFNlbGVjdENoYW5nZShtb2RlbDogU3Vic2lkeURpc2NvdW50TW9kZWwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubmFzRm9ybUdyb3VwIHx8ICF0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVN1YnNpZHlEaXNjb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNpZHlEaXNjb3VudENvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVTdWJzaWR5RGlzY291bnQpO1xuICAgIHN1YnNpZHlEaXNjb3VudENvbnRyb2wucGF0Y2hWYWx1ZShtb2RlbCk7XG4gIH1cblxuICBnZXRDbG9zZXN0QWlycG9ydHMocG9zaXRpb246IEdlb2xvY2F0aW9uUG9zaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnBvc2l0aW9uQ2hhbmdlLmVtaXQocG9zaXRpb24pO1xuICB9XG5cbiAgZ2V0RmlsdGVyQ2xhc3MoZWxlbWVudD86IHN0cmluZywgbW9kaWZpZXJzSW5wdXQ/OiBhbnkpOiBDbGFzc01vZGVsIHtcbiAgICBsZXQgbW9kaWZpZXJzID0gbW9kaWZpZXJzSW5wdXQgfHwgbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmICh0eXBlb2YgbW9kaWZpZXJzSW5wdXQgPT09ICdzdHJpbmcnIHx8IG1vZGlmaWVyc0lucHV0IGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBtb2RpZmllcnMgPSBbbW9kaWZpZXJzSW5wdXRdO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRocyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhUYWJsZXQodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKSkge1xuICAgICAgd2lkdGhzLnB1c2goJ21kJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhEZXNrdG9wKHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkpIHtcbiAgICAgIHdpZHRocy5wdXNoKCdsZycpO1xuICAgIH1cblxuICAgIG1vZGlmaWVycyA9IFsuLi5tb2RpZmllcnMsIC4uLndpZHRoc107XG5cbiAgICByZXR1cm4gdGhpcy5nZXRDbGFzcyhlbGVtZW50LCBtb2RpZmllcnMpO1xuICB9XG5cbiAgZ2V0QWlycG9ydFNlbGVjdENsYXNzKCk6IENsYXNzTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldENsYXNzKFxuICAgICAgJ2FpcnBvcnQtc2VsZWN0JyxcbiAgICAgIFtcbiAgICAgICAgdGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aERlc2t0b3AodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKSAmJiAnbGcnLFxuICAgICAgICB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoVGFibGV0KHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ21kJyxcbiAgICAgICAgdGhpcy5leGlzdHModGhpcy5lbmFibGVEYXRlcGlja2VycykgJiYgJ25vLWJvcmRlcidcbiAgICAgIF0pO1xuICB9XG5cbiAgZ2V0U3VnZ2VzdGlvbnMoKTogQXJyYXk8QWlycG9ydE1vZGVsPiB7XG4gICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSBBcnJheS5mcm9tKG5ldyBTZXQoW1xuICAgICAgLi4udGhpcy5sYXRlc3RTZWFyY2hlc09yaWdpbiA/IHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4uZmlsdGVyKHggPT4geC5jb2RlICE9PSB0aGlzLm9yaWdpbkFpcnBvcnRDb2RlKSA6IFtdLFxuICAgICAgLi4udGhpcy5jbG9zZXN0QWlycG9ydHMgPyB0aGlzLmNsb3Nlc3RBaXJwb3J0cy5maWx0ZXIoeCA9PiB4LmNvZGUgIT09IHRoaXMub3JpZ2luQWlycG9ydENvZGUpIDogW11cbiAgICBdKSk7XG5cbiAgICByZXR1cm4gc3VnZ2VzdGlvbnMuc2xpY2UoMCwgMyk7XG4gIH1cblxuICBnZXREYXRlUGlja2Vyc0NsYXNzKCk6IENsYXNzTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlckNsYXNzKCdkYXRlLWNvbWJvJywgW1xuICAgICAgdGhpcy5leGlzdHModGhpcy5taW5pbWl6ZSkgJiYgJ21pbmltaXplZCcsXG4gICAgICB0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkgPiA1MDAgJiYgJ3NpZGUtYnktc2lkZSdcbiAgICBdKTtcbiAgfVxuXG4gIGdldFRyYXZlbERldGFpbHNDbGFzcyhlbGVtZW50Pzogc3RyaW5nLCBtb2RpZmllcnNJbnB1dD86IGFueSk6IENsYXNzTW9kZWwge1xuICAgIGxldCBtb2RpZmllcnMgPSBtb2RpZmllcnNJbnB1dCB8fCBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKHR5cGVvZiBtb2RpZmllcnNJbnB1dCA9PT0gJ3N0cmluZycgfHwgbW9kaWZpZXJzSW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIG1vZGlmaWVycyA9IFttb2RpZmllcnNJbnB1dF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGhzID0gW1xuICAgICAgdGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aFRhYmxldCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpICYmICdtZCcsXG4gICAgICB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoRGVza3RvcCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpICYmICdsZydcbiAgICBdO1xuXG4gICAgbW9kaWZpZXJzID0gWy4uLm1vZGlmaWVycywgLi4ud2lkdGhzXTtcblxuICAgIGNvbnN0IHRyYXZlbERldGFpbHNCYXNlID0gbmV3IE5hc0NvbXBvbmVudEJhc2UoJ3RyYXZlbC1kZXRhaWxzJyk7XG4gICAgcmV0dXJuIHRyYXZlbERldGFpbHNCYXNlLmdldENsYXNzKGVsZW1lbnQsIG1vZGlmaWVycyk7XG4gIH1cblxuICBvbkluYm91bmRNb250aENoYW5nZShtb250aDogVXRjRGF0ZSk6IHZvaWQgeyB0aGlzLmluYm91bmRNb250aENoYW5nZS5lbWl0KG1vbnRoKTsgfVxuICBvbk91dGJvdW5kTW9udGhDaGFuZ2UobW9udGg6IFV0Y0RhdGUpOiB2b2lkIHsgdGhpcy5vdXRib3VuZE1vbnRoQ2hhbmdlLmVtaXQobW9udGgpOyB9XG5cbiAgb25QYXNzZW5nZXJzU2VsZWN0Rm9jdXNPblByZXZpb3VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICB0aGlzLm9uVHJhbnNpdFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmFuc2l0U3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhYmxldERpc3BsYXkoKSkge1xuICAgICAgdGhpcy5zZWxlY3RQcmV2aW91c0NvbnRyb2woKTtcbiAgICB9XG4gIH1cblxuICBwYXNzZW5nZXJLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpIHx8IHRoaXMuaXNUYWJsZXREaXNwbGF5KCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZm9jdXNPbkFpcnBvcnRTZWxlY3RCYWNrd2FyZHMoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3Vic2lkeURpc2NvdW50cyAmJiB0aGlzLnN1YnNpZHlEaXNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zdWJzaWR5RGlzY291bnQuaW5mb0J1dHRvbi5idXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzT25OZXh0Q2hhbmdlLmVtaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSB8fCB0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24ub3Blbikge1xuICAgICAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4odHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4oZmFsc2UpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJpcFN3aXRjaEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRyaXBUeXBlUm91bmRUcmlwLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaXBUeXBlT25ld2F5Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRyaXBUeXBlT25ld2F5Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaXBUeXBlUm91bmRUcmlwLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSB8fCAhdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RQcmV2aW91c0NvbnRyb2woKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgIHRoaXMub25UcmFuc2l0U3dpdGNoT3Blbih0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJpcFN3aXRjaC5vcGVuKSB7XG4gICAgICAgICAgICAgIHRoaXMub25UcmFuc2l0U3dpdGNoT3Blbih0cnVlKTtcbiAgICAgICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMudHJhbnNpdFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHRoaXMub25UcmlwU3dpdGNoT3BlbihmYWxzZSk7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXNPbk5hdGl2ZUVsZW1lbnQodGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0cmFuc2l0S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudHJhbnNpdFR5cGVUcmFuc2l0Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRUeXBlRGlyZWN0T25seS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50cmFuc2l0VHlwZURpcmVjdE9ubHkubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudHJhbnNpdFR5cGVUcmFuc2l0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyg8YW55PnRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vblRyYW5zaXRTd2l0Y2hPcGVuKCF0aGlzLnRyYW5zaXRTd2l0Y2gub3Blbik7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnN1YnNpZHlEaXNjb3VudHMgJiYgdGhpcy5zdWJzaWR5RGlzY291bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5zdWJzaWR5RGlzY291bnQuaW5mb0J1dHRvbi5idXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5mb2N1c09uTmV4dENoYW5nZS5lbWl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLm9uVHJhbnNpdFN3aXRjaE9wZW4oZmFsc2UpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KHRoaXMudHJhbnNpdFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25TdWJzaWR5RGlzY291bnRJbmZvQnV0dG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyYW5zaXRTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25QYXNzZW5nZXJzU2VsZWN0Rm9jdXNPbk5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNBc3luYyg8YW55PnRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBmb2N1c0FzeW5jKHJlZkVsZW1lbnQ6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5mb2N1c0FzeW5jVGltb3V0KTtcblxuICAgIHRoaXMuZm9jdXNBc3luY1RpbW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRGb2N1c09uTmF0aXZlRWxlbWVudChyZWZFbGVtZW50KSk7XG4gIH1cblxuICBvbkRhdGVwaWNrZXJGb2N1c09uUHJldmlvdXMoZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuZm9jdXNPbkFpcnBvcnRTZWxlY3RCYWNrd2FyZHMoKTtcbiAgfVxuXG4gIHNlbGVjdFByZXZpb3VzQ29udHJvbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8pIHtcbiAgICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21iby5vdXRib3VuZE9ubHkpIHtcbiAgICAgICAgdGhpcy5vdXRib3VuZE9wZW4gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmJvdW5kT3BlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgIGlmICh0aGlzLmV4aXN0cyh0aGlzLmFpcnBvcnRTZWxlY3QuY29tYm8pKSB7XG4gICAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vbkRlc3RpbmF0aW9uT3Blbih0cnVlKTtcbiAgICAgICAgaWYgKCg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25EZXN0aW5hdGlvbikpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzQXN5bmMoKDxhbnk+dGhpcy5haXJwb3J0U2VsZWN0LmFpcnBvcnRTZWxlY3REcm9wZG93bkRlc3RpbmF0aW9uKS5pbnB1dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vbk9yaWdpbk9wZW4odHJ1ZSk7XG4gICAgICAgIGlmICgoPGFueT50aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duT3JpZ2luKSkge1xuICAgICAgICAgIHRoaXMuZm9jdXNBc3luYygoPGFueT50aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duT3JpZ2luKS5pbnB1dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIG9uRm9jdXNPbk5leHRDaGFuZ2UoZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkgJiYgdGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhYmxldERpc3BsYXkoKSkge1xuICAgICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4odHJ1ZSk7XG4gICAgICAgICAgdGhpcy5zZXRGb2N1c09uTmF0aXZlRWxlbWVudCh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc01vYmlsZURpc3BsYXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhNb2JpbGUodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKTtcbiAgfVxuXG4gIGlzVGFibGV0RGlzcGxheSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aFRhYmxldCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgb25PcmlnaW5PcGVuKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0ICYmICF0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3Blbikge1xuICAgICAgdGhpcy51cGRhdGVNYXhpbWl6ZSgpO1xuICAgIH1cblxuICAgIHRoaXMub3JpZ2luT3BlbkNoYW5nZS5lbWl0KG9wZW4pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICB2YWxpZGF0ZUFpcnBvcnRWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luU25hcHNob3QgPSB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uU25hcHNob3QgPSB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb247XG4gICAgaWYgKChvcmlnaW5TbmFwc2hvdCAmJiBkZXN0aW5hdGlvblNuYXBzaG90ICYmIG9yaWdpblNuYXBzaG90LmNvZGUgJiYgb3JpZ2luU25hcHNob3QuY29kZS5sZW5ndGhcbiAgICAgICYmIGRlc3RpbmF0aW9uU25hcHNob3QuY29kZSAmJiBkZXN0aW5hdGlvblNuYXBzaG90LmNvZGUubGVuZ3RoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHVwZGF0ZU1heGltaXplKCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5tYXhpbWl6ZSA9IHRoaXMudmFsaWRhdGVBaXJwb3J0VmFsdWVzKCk7XG4gICAgfSk7XG4gIH1cblxuICBvbkRlc3RpbmF0aW9uT3BlbihvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24ub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhbnNpdFN3aXRjaCkge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8pIHtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLmluYm91bmRPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5vdXRib3VuZE9wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCAmJiAhdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3Blbikge1xuICAgICAgdGhpcy51cGRhdGVNYXhpbWl6ZSgpO1xuICAgIH1cbiAgICB0aGlzLmRlc3RpbmF0aW9uT3BlbkNoYW5nZS5lbWl0KG9wZW4pO1xuICB9XG5cbiAgb25QYXNzZW5nZXJTZWxlY3RPcGVuKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhbnNpdFN3aXRjaCkge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvLmluYm91bmRPcGVuKSB7XG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLmluYm91bmRPcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPcGVuKSB7XG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24ub3BlbiA9IG9wZW47XG4gICAgdGhpcy5wYXNzZW5nZXJTZWxlY3RPcGVuQ2hhbmdlLmVtaXQob3Blbik7XG5cbiAgICBpZiAob3Blbikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdC5udW1iZXJGaWVsZHMuZmlyc3QpIHtcbiAgICAgICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdC5udW1iZXJGaWVsZHMuZmlyc3QuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCAzMDApO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJpcFN3aXRjaE9wZW4ob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRyaXBTd2l0Y2hGb2N1c1RpbWVvdXQpO1xuXG4gICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLm9wZW4gPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYW5zaXRTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5kZXN0aW5hdGlvbk9wZW4gPSBmYWxzZTtcbiAgICB9XG5cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gb3BlbjtcblxuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLnRyaXBTd2l0Y2hGb2N1c1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50cmlwVHlwZVJvdW5kVHJpcC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9LCAyMDApO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJhbnNpdFN3aXRjaE9wZW4ob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRyYW5zaXRTd2l0Y2hGb2N1c1RpbWVvdXQpO1xuXG4gICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24ub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5kZXN0aW5hdGlvbk9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8pIHtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLmluYm91bmRPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5vdXRib3VuZE9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IG9wZW47XG4gICAgfVxuXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaEZvY3VzVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRyYW5zaXRUeXBlVHJhbnNpdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9LCAyMDApO1xuICAgIH1cbiAgfVxuXG4gIG9uT3JpZ2luQ2hhbmdlKGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMub3JpZ2luQ2hhbmdlLmVtaXQoYWlycG9ydCk7XG4gIH1cblxuICBzZXRTZWxlY3RlZE9yaWdpbkFpcnBvcnQoYWlycG9ydDogQWlycG9ydE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKCFhaXJwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbk9yaWdpbkNoYW5nZShhaXJwb3J0KTtcblxuICAgIGlmICh0aGlzLm9yaWdpbkFpcnBvcnRDb2RlID09PSBhaXJwb3J0LmNvZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbkFpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25EZXN0aW5hdGlvbkNoYW5nZShhaXJwb3J0OiBBaXJwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3RpbmF0aW9uQ2hhbmdlLmVtaXQoYWlycG9ydCk7XG4gIH1cblxuICBzZXRGb2N1c09uUGFzc2VuZ2VyU2VsZWN0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5taW5pbWl6ZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm91dGJvdW5kT3BlbiA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9jdXNBc3luYygoPGFueT50aGlzLmRhdGVwaWNrZXJDb21iby5kYXRlcGlja2VyT3V0Ym91bmQpLmlucHV0KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhYmxldERpc3BsYXkoKSAmJiB0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMub3V0Ym91bmRPcGVuID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuXG4gICAgICAgIHRoaXMub25QYXNzZW5nZXJTZWxlY3RPcGVuKHRydWUpO1xuICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudFJlZiA9IHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KGN1cnJlbnRFbGVtZW50UmVmKSk7XG5cbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG5cbiAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICB0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBzZXRGb2N1c09uTmF0aXZlRWxlbWVudChlbGVtZW50OiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBvblRyaXBUeXBlQ2hhbmdlKHRyaXBUeXBlOiBUcmlwVHlwZSk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMudHJpcFR5cGUgPSB0cmlwVHlwZTtcblxuICAgIGlmICh0aGlzLm5hc0Zvcm1Hcm91cCAmJiB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVRyaXBUeXBlKSB7XG4gICAgICBjb25zdCB0cmlwU3dpdGNoQ29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldCh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVRyaXBUeXBlKTtcbiAgICAgIHRyaXBTd2l0Y2hDb250cm9sLnBhdGNoVmFsdWUodHJpcFR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJhbnNpdENoYW5nZShkaXJlY3RPbmx5OiBib29sZWFuKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kaXJlY3RPbmx5ID0gZGlyZWN0T25seTtcblxuICAgIGlmICh0aGlzLm5hc0Zvcm1Hcm91cCAmJiB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHkpIHtcbiAgICAgIGNvbnN0IHRyaXBUeXBlQ29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldCh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHkpO1xuICAgICAgdHJpcFR5cGVDb250cm9sLnBhdGNoVmFsdWUoZGlyZWN0T25seSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VHJhdmVsRGV0YWlsc1RyaXBTd2l0Y2hJY29uQ2xhc3MobW9kaWZpZXJzPzogYW55KTogQXJyYXk8Q2xhc3NNb2RlbD4ge1xuICAgIGNvbnN0IGljb25NZWRpdW1CYXNlID0gbmV3IE5hc0NvbXBvbmVudEJhc2UoJ2ljb24tbWVkaXVtJyk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgaWNvbk1lZGl1bUJhc2UuZ2V0Q2xhc3MoJycsIG1vZGlmaWVycyksXG4gICAgICB0aGlzLmdldFRyYXZlbERldGFpbHNDbGFzcygnaWNvbicpXG4gICAgXTtcbiAgfVxuXG4gIGdldFRyaXBTd2l0Y2hMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyaXBUeXBlID09PSBUcmlwVHlwZS50d29XYXlSZXR1cm4gPyB0aGlzLnRyaXBTd2l0Y2hSb3VuZFRyaXBMYWJlbCA6IHRoaXMudHJpcFN3aXRjaE9uZVdheUxhYmVsO1xuICB9XG5cbiAgZ2V0VHJhbnNpdExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0T25seSA/IHRoaXMuZGlyZWN0T25seUxhYmVsIDogdGhpcy5kaXJlY3RUcmFuc2l0TGFiZWw7XG4gIH1cblxuICBvbkFjY29yZGlvblRvZ2dsZUNoYW5nZShleHBhbmRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1bW1hcnkgPSAhZXhwYW5kZWQ7XG4gIH1cblxuICBnZXRTdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucGFzc2VuZ2VyU2VsZWN0TGFiZWx9JHt0aGlzLmRlZmF1bHRTdW1tYXJ5U2VwYXJhdG9yfWAgK1xuICAgICAgYCR7dGhpcy5nZXRUcmlwU3dpdGNoTGFiZWwoKS50b0xvd2VyQ2FzZSgpfSR7dGhpcy5sYXN0U3VtbWFyeVNlcGFyYXRvcn0ke3RoaXMuZ2V0VHJhbnNpdExhYmVsKCkudG9Mb3dlckNhc2UoKX1gO1xuICB9XG5cbiAgc2hvdWxkTWF4aW1pemUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmV4aXN0cyh0aGlzLm1pbmltaXplKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFpcnBvcnRTZWxlY3RcbiAgICAgICYmIHRoaXMuZW5hYmxlRGVzdGluYXRpb25TZWxlY3RcbiAgICAgICYmIHRoaXMuYWlycG9ydFNlbGVjdC5vcmlnaW5cbiAgICAgICYmIHRoaXMuYWlycG9ydFNlbGVjdC5vcmlnaW4uY29kZVxuICAgICAgJiYgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uXG4gICAgICAmJiB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb24uY29kZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFpcnBvcnRTZWxlY3RcbiAgICAgICYmICF0aGlzLmVuYWJsZURlc3RpbmF0aW9uU2VsZWN0XG4gICAgICAmJiB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luXG4gICAgICAmJiB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luLmNvZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5haXJwb3J0U2VsZWN0ICYmICh0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiB8fCB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWF4aW1pemU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmV4aXN0cyh0aGlzLm1pbmltaXplKSkge1xuICAgICAgaWYgKHRoaXMubWF4aW1pemUpIHtcbiAgICAgICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNOYXNHcm91cFZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNPbkFpcnBvcnRTZWxlY3RCYWNrd2FyZHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMuYWlycG9ydFNlbGVjdC5jb21ibykpIHtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vbkRlc3RpbmF0aW9uT3Blbih0cnVlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duRGVzdGluYXRpb24uaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfSwgMTAwKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub25PcmlnaW5PcGVuKHRydWUpO1xuICAgICAgdGhpcy5mb2N1c0FzeW5jKCg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25PcmlnaW4pLmlucHV0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldExhdGVzdFNlYXJjaGVzKGFiYW5kb25lZEJhc2tldDogQXJyYXk8QWJhbmRvbmVkQmFza2V0SXRlbU1vZGVsPiwgYWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD4pOiB2b2lkIHtcbiAgICBpZiAoIWFiYW5kb25lZEJhc2tldCB8fCAhYWlycG9ydHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1bmlxdWUgPSBuZXcgQXJyYXk8QWJhbmRvbmVkQmFza2V0SXRlbU1vZGVsPigpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGFiYW5kb25lZEJhc2tldCkge1xuICAgICAgaWYgKCF1bmlxdWUuc29tZSh4ID0+IHguZGVzdGluYXRpb25Db2RlID09PSBpdGVtLmRlc3RpbmF0aW9uQ29kZSkpIHtcbiAgICAgICAgdW5pcXVlLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luQ29kZXMgPSB1bmlxdWUubWFwKHggPT4geC5vcmlnaW5Db2RlKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbkNvZGVzID0gdW5pcXVlLm1hcCh4ID0+IHguZGVzdGluYXRpb25Db2RlKTtcblxuICAgIGNvbnN0IGxhdGVzdFNlYXJjaGVzT3JpZ2luID0gYWlycG9ydHMuZmlsdGVyKGFpcnBvcnQgPT4ge1xuICAgICAgcmV0dXJuIHVuaXF1ZS5zb21lKHggPT4geC5vcmlnaW5Db2RlLnRvTG93ZXJDYXNlKCkgPT09IGFpcnBvcnQuY29kZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxhdGVzdFNlYXJjaGVzRGVzdGluYXRpb24gPSBhaXJwb3J0cy5maWx0ZXIoYWlycG9ydCA9PiB7XG4gICAgICByZXR1cm4gdW5pcXVlLnNvbWUoeCA9PiB4LmRlc3RpbmF0aW9uQ29kZS50b0xvd2VyQ2FzZSgpID09PSBhaXJwb3J0LmNvZGUudG9Mb3dlckNhc2UoKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2RlID0gJ2NvZGUnO1xuICAgIHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4gPSB0aGlzLnNvcnRTZXJ2aWNlLnNvcnRCeU9iamVjdChsYXRlc3RTZWFyY2hlc09yaWdpbiwgb3JpZ2luQ29kZXMsIGNvZGUpLnNsaWNlKDAsIDMpO1xuXG4gICAgaWYgKHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4gJiYgdGhpcy5sYXRlc3RTZWFyY2hlc09yaWdpbi5sZW5ndGggPiAwICYmIHRoaXMuZXhpc3RzKHRoaXMub3ZlcnJpZGVPcmlnaW4pKSB7XG4gICAgICB0aGlzLm9yaWdpbkFpcnBvcnRDb2RlID0gdGhpcy5sYXRlc3RTZWFyY2hlc09yaWdpblswXS5jb2RlO1xuICAgIH1cblxuICAgIHRoaXMubGF0ZXN0U2VhcmNoZXNEZXN0aW5hdGlvbiA9IHRoaXMuc29ydFNlcnZpY2Uuc29ydEJ5T2JqZWN0KGxhdGVzdFNlYXJjaGVzRGVzdGluYXRpb24sIGRlc3RpbmF0aW9uQ29kZXMsIGNvZGUpLnNsaWNlKDAsIDMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZURyb3Bkb3ducygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIl19