@norwegian/core-components 5.1.0

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 (1004) hide show
  1. package/README.md +78 -0
  2. package/assets/documentation/accordion/accordion.md +1 -0
  3. package/assets/documentation/airport-select/airport-select.md +0 -0
  4. package/assets/documentation/autocomplete/autocomplete.md +1 -0
  5. package/assets/documentation/box/box.md +1 -0
  6. package/assets/documentation/button/button.md +10 -0
  7. package/assets/documentation/checkbox/checkbox.md +7 -0
  8. package/assets/documentation/chip/chip.md +1 -0
  9. package/assets/documentation/container/container.md +1 -0
  10. package/assets/documentation/continue/continue.md +1 -0
  11. package/assets/documentation/cover/cover.md +1 -0
  12. package/assets/documentation/datepicker/calendar/calendar.md +3 -0
  13. package/assets/documentation/datepicker/datepicker.md +3 -0
  14. package/assets/documentation/datepicker-combo/datepicker-combo.md +1 -0
  15. package/assets/documentation/dropdown/dropdown.md +3 -0
  16. package/assets/documentation/filter/filter.md +0 -0
  17. package/assets/documentation/grid/grid.md +1 -0
  18. package/assets/documentation/icon/icon.md +4 -0
  19. package/assets/documentation/icon-list/icon-list.md +1 -0
  20. package/assets/documentation/info/info.md +1 -0
  21. package/assets/documentation/input/input.md +1 -0
  22. package/assets/documentation/journey/journey.md +1 -0
  23. package/assets/documentation/journey-availability/journey-availability.md +3 -0
  24. package/assets/documentation/journey-availability-list/journey-availability-list.md +9 -0
  25. package/assets/documentation/journey-selection/journey-selection.md +1 -0
  26. package/assets/documentation/journey-stopover/journey-stopover.md +1 -0
  27. package/assets/documentation/list/list.md +1 -0
  28. package/assets/documentation/modal/modal.md +0 -0
  29. package/assets/documentation/number-field/number-field.md +1 -0
  30. package/assets/documentation/page-footer/page-footer.md +1 -0
  31. package/assets/documentation/page-header/page-header.md +1 -0
  32. package/assets/documentation/passenger-select/passenger-select.md +1 -0
  33. package/assets/documentation/phone-number/phone-number.md +2 -0
  34. package/assets/documentation/premium-toggle/premium-toggle.md +9 -0
  35. package/assets/documentation/radio/radio.md +7 -0
  36. package/assets/documentation/select/select.md +1 -0
  37. package/assets/documentation/simple-list/simple-list.md +1 -0
  38. package/assets/documentation/slide-toggle/slide-toggle.md +1 -0
  39. package/assets/documentation/slider/slider.md +1 -0
  40. package/assets/documentation/sort/sort.md +1 -0
  41. package/assets/documentation/spinner/spinner.md +1 -0
  42. package/assets/documentation/subsidy-discount/subsidy-discount.md +3 -0
  43. package/assets/documentation/suggestions/suggestions.md +1 -0
  44. package/assets/documentation/tab-group/tab-group.md +1 -0
  45. package/assets/documentation/table/table.md +8 -0
  46. package/assets/documentation/textarea/textarea.md +1 -0
  47. package/assets/documentation/toggle/toggle.md +5 -0
  48. package/assets/documentation/trip-summary/trip-summary.md +2 -0
  49. package/assets/documentation/weather-icon/weather-icon.md +1 -0
  50. package/assets/fonts/TiemposHeadlineWeb-Bold.eot +0 -0
  51. package/assets/fonts/TiemposHeadlineWeb-Bold.woff +0 -0
  52. package/assets/fonts/TiemposHeadlineWeb-Bold.woff2 +0 -0
  53. package/assets/fonts/TiemposHeadlineWeb-BoldItalic.eot +0 -0
  54. package/assets/fonts/TiemposHeadlineWeb-BoldItalic.woff +0 -0
  55. package/assets/fonts/TiemposHeadlineWeb-BoldItalic.woff2 +0 -0
  56. package/assets/fonts/TiemposText-Medium.eot +0 -0
  57. package/assets/fonts/TiemposText-Medium.woff +0 -0
  58. package/assets/fonts/TiemposText-Medium.woff2 +0 -0
  59. package/assets/fonts/TiemposTextWeb-Italic.eot +0 -0
  60. package/assets/fonts/TiemposTextWeb-Italic.woff +0 -0
  61. package/assets/fonts/TiemposTextWeb-Italic.woff2 +0 -0
  62. package/assets/fonts/TiemposTextWeb-Regular.eot +0 -0
  63. package/assets/fonts/TiemposTextWeb-Regular.woff +0 -0
  64. package/assets/fonts/TiemposTextWeb-Regular.woff2 +0 -0
  65. package/assets/fonts/apercu_bold_italic_pro-web.eot +0 -0
  66. package/assets/fonts/apercu_bold_italic_pro-web.svg +12420 -0
  67. package/assets/fonts/apercu_bold_italic_pro-web.ttf +0 -0
  68. package/assets/fonts/apercu_bold_italic_pro-web.woff +0 -0
  69. package/assets/fonts/apercu_bold_italic_pro-web.woff2 +0 -0
  70. package/assets/fonts/apercu_bold_italic_pro.otf +0 -0
  71. package/assets/fonts/apercu_bold_pro-web.eot +0 -0
  72. package/assets/fonts/apercu_bold_pro-web.svg +10193 -0
  73. package/assets/fonts/apercu_bold_pro-web.ttf +0 -0
  74. package/assets/fonts/apercu_bold_pro-web.woff +0 -0
  75. package/assets/fonts/apercu_bold_pro-web.woff2 +0 -0
  76. package/assets/fonts/apercu_bold_pro.otf +0 -0
  77. package/assets/fonts/apercu_light_italic_pro-web.eot +0 -0
  78. package/assets/fonts/apercu_light_italic_pro-web.svg +12831 -0
  79. package/assets/fonts/apercu_light_italic_pro-web.ttf +0 -0
  80. package/assets/fonts/apercu_light_italic_pro-web.woff +0 -0
  81. package/assets/fonts/apercu_light_italic_pro-web.woff2 +0 -0
  82. package/assets/fonts/apercu_light_pro-web.eot +0 -0
  83. package/assets/fonts/apercu_light_pro-web.svg +9704 -0
  84. package/assets/fonts/apercu_light_pro-web.ttf +0 -0
  85. package/assets/fonts/apercu_light_pro-web.woff +0 -0
  86. package/assets/fonts/apercu_light_pro-web.woff2 +0 -0
  87. package/assets/fonts/apercu_medium_italic_pro-web.eot +0 -0
  88. package/assets/fonts/apercu_medium_italic_pro-web.svg +12354 -0
  89. package/assets/fonts/apercu_medium_italic_pro-web.ttf +0 -0
  90. package/assets/fonts/apercu_medium_italic_pro-web.woff +0 -0
  91. package/assets/fonts/apercu_medium_italic_pro-web.woff2 +0 -0
  92. package/assets/fonts/apercu_medium_italic_pro.otf +0 -0
  93. package/assets/fonts/apercu_medium_pro-web.eot +0 -0
  94. package/assets/fonts/apercu_medium_pro-web.svg +12254 -0
  95. package/assets/fonts/apercu_medium_pro-web.ttf +0 -0
  96. package/assets/fonts/apercu_medium_pro-web.woff +0 -0
  97. package/assets/fonts/apercu_medium_pro-web.woff2 +0 -0
  98. package/assets/fonts/apercu_medium_pro.otf +0 -0
  99. package/assets/fonts/apercu_mono_pro-web.eot +0 -0
  100. package/assets/fonts/apercu_mono_pro-web.svg +538 -0
  101. package/assets/fonts/apercu_mono_pro-web.ttf +0 -0
  102. package/assets/fonts/apercu_mono_pro-web.woff +0 -0
  103. package/assets/fonts/apercu_mono_pro-web.woff2 +0 -0
  104. package/assets/fonts/apercu_regular_italic_pro-web.eot +0 -0
  105. package/assets/fonts/apercu_regular_italic_pro-web.svg +13059 -0
  106. package/assets/fonts/apercu_regular_italic_pro-web.ttf +0 -0
  107. package/assets/fonts/apercu_regular_italic_pro-web.woff +0 -0
  108. package/assets/fonts/apercu_regular_italic_pro-web.woff2 +0 -0
  109. package/assets/fonts/apercu_regular_italic_pro.otf +0 -0
  110. package/assets/fonts/apercu_regular_pro-web.eot +0 -0
  111. package/assets/fonts/apercu_regular_pro-web.svg +11356 -0
  112. package/assets/fonts/apercu_regular_pro-web.ttf +0 -0
  113. package/assets/fonts/apercu_regular_pro-web.woff +0 -0
  114. package/assets/fonts/apercu_regular_pro-web.woff2 +0 -0
  115. package/assets/fonts/apercu_regular_pro.otf +0 -0
  116. package/assets/icons/flags/ar.svg +20 -0
  117. package/assets/icons/flags/br.svg +30 -0
  118. package/assets/icons/flags/ca.svg +18 -0
  119. package/assets/icons/flags/de.svg +20 -0
  120. package/assets/icons/flags/dk.svg +20 -0
  121. package/assets/icons/flags/en.svg +20 -0
  122. package/assets/icons/flags/es.svg +20 -0
  123. package/assets/icons/flags/fi.svg +20 -0
  124. package/assets/icons/flags/fr.svg +20 -0
  125. package/assets/icons/flags/ie.svg +22 -0
  126. package/assets/icons/flags/it.svg +20 -0
  127. package/assets/icons/flags/nl.svg +20 -0
  128. package/assets/icons/flags/no.svg +20 -0
  129. package/assets/icons/flags/pl.svg +20 -0
  130. package/assets/icons/flags/se.svg +20 -0
  131. package/assets/icons/flags/uk.svg +20 -0
  132. package/assets/icons/flags/us.svg +20 -0
  133. package/assets/icons/icon-add--light.svg +11 -0
  134. package/assets/icons/icon-add.svg +7 -0
  135. package/assets/icons/icon-arrow-left--light.svg +7 -0
  136. package/assets/icons/icon-arrow-left.svg +7 -0
  137. package/assets/icons/icon-arrow-right--light.svg +7 -0
  138. package/assets/icons/icon-arrow-right.svg +6 -0
  139. package/assets/icons/icon-check.svg +7 -0
  140. package/assets/icons/icon-chevron-down.svg +1 -0
  141. package/assets/icons/icon-chevron-left--light.svg +1 -0
  142. package/assets/icons/icon-chevron-left-outlined.svg +4 -0
  143. package/assets/icons/icon-chevron-left.svg +1 -0
  144. package/assets/icons/icon-chevron-right--light.svg +1 -0
  145. package/assets/icons/icon-chevron-right-outlined.svg +4 -0
  146. package/assets/icons/icon-chevron-right.svg +1 -0
  147. package/assets/icons/icon-dropdown-arrow--disabled.svg +8 -0
  148. package/assets/icons/icon-dropdown-arrow--light.svg +8 -0
  149. package/assets/icons/icon-dropdown-arrow.svg +8 -0
  150. package/assets/icons/icon-error.svg +11 -0
  151. package/assets/icons/icon-flight-direct.svg +8 -0
  152. package/assets/icons/icon-flight-one-stop.svg +8 -0
  153. package/assets/icons/icon-flight-two-stops.svg +9 -0
  154. package/assets/icons/icon-geolocation--disabled.svg +8 -0
  155. package/assets/icons/icon-geolocation--light.svg +8 -0
  156. package/assets/icons/icon-geolocation.svg +8 -0
  157. package/assets/icons/icon-goto.svg +8 -0
  158. package/assets/icons/icon-home.svg +1 -0
  159. package/assets/icons/icon-marker.svg +8 -0
  160. package/assets/icons/icon-menu--dark.svg +9 -0
  161. package/assets/icons/icon-menu.svg +9 -0
  162. package/assets/icons/icon-nav_right--large.svg +7 -0
  163. package/assets/icons/icon-nav_right--small.svg +7 -0
  164. package/assets/icons/icon-nav_right.svg +7 -0
  165. package/assets/icons/icon-negative.svg +11 -0
  166. package/assets/icons/icon-ol_li.svg +7 -0
  167. package/assets/icons/icon-one-stop-arrow.svg +8 -0
  168. package/assets/icons/icon-passenger--children.svg +1 -0
  169. package/assets/icons/icon-passenger--female.svg +1 -0
  170. package/assets/icons/icon-passenger--infant.svg +1 -0
  171. package/assets/icons/icon-passenger--male.svg +1 -0
  172. package/assets/icons/icon-positive.svg +10 -0
  173. package/assets/icons/icon-red-circle.svg +7 -0
  174. package/assets/icons/icon-remove.svg +8 -0
  175. package/assets/icons/icon-share_facebook.svg +10 -0
  176. package/assets/icons/icon-share_instagram.svg +12 -0
  177. package/assets/icons/icon-share_twitter.svg +13 -0
  178. package/assets/icons/icon-share_youtube.svg +11 -0
  179. package/assets/icons/icon-star.svg +9 -0
  180. package/assets/icons/icon-subtract--light.svg +12 -0
  181. package/assets/icons/icon-subtract.svg +9 -0
  182. package/assets/icons/icon-switch--secondary.svg +1 -0
  183. package/assets/icons/icon-switch.svg +1 -0
  184. package/assets/icons/icon-two-stops-arrow.svg +10 -0
  185. package/assets/icons/large/baggage-hand-baggage.svg +41 -0
  186. package/assets/icons/large/baggage.svg +75 -0
  187. package/assets/icons/large/car-rentals.svg +61 -0
  188. package/assets/icons/large/cashpoints.svg +92 -0
  189. package/assets/icons/large/celebration.svg +77 -0
  190. package/assets/icons/large/central-airports.svg +44 -0
  191. package/assets/icons/large/customer-service.svg +47 -0
  192. package/assets/icons/large/destinations.svg +78 -0
  193. package/assets/icons/large/direct-flights.svg +73 -0
  194. package/assets/icons/large/entertainment.svg +89 -0
  195. package/assets/icons/large/family.svg +88 -0
  196. package/assets/icons/large/fast-track.svg +57 -0
  197. package/assets/icons/large/food.svg +48 -0
  198. package/assets/icons/large/from-a-to-b.svg +66 -0
  199. package/assets/icons/large/hotels.svg +84 -0
  200. package/assets/icons/large/lounge.svg +67 -0
  201. package/assets/icons/large/new-aircrafts.svg +60 -0
  202. package/assets/icons/large/personnel.svg +54 -0
  203. package/assets/icons/large/premium.svg +49 -0
  204. package/assets/icons/large/wifi.svg +112 -0
  205. package/assets/icons/list--journey.svg +207 -0
  206. package/assets/icons/medium/accommodation--light.svg +16 -0
  207. package/assets/icons/medium/accommodation.svg +15 -0
  208. package/assets/icons/medium/alert--error.svg +11 -0
  209. package/assets/icons/medium/alert--light.svg +10 -0
  210. package/assets/icons/medium/alert--success.svg +9 -0
  211. package/assets/icons/medium/alert.svg +11 -0
  212. package/assets/icons/medium/arrow-down--light.svg +11 -0
  213. package/assets/icons/medium/arrow-down.svg +11 -0
  214. package/assets/icons/medium/arrow-left--light.svg +11 -0
  215. package/assets/icons/medium/arrow-left.svg +11 -0
  216. package/assets/icons/medium/arrow-right--light.svg +11 -0
  217. package/assets/icons/medium/arrow-right.svg +11 -0
  218. package/assets/icons/medium/arrow-up--light.svg +11 -0
  219. package/assets/icons/medium/arrow-up.svg +11 -0
  220. package/assets/icons/medium/baggage--light.svg +10 -0
  221. package/assets/icons/medium/baggage-checked-in--light.svg +19 -0
  222. package/assets/icons/medium/baggage-checked-in.svg +20 -0
  223. package/assets/icons/medium/baggage-hand-baggage--light.svg +32 -0
  224. package/assets/icons/medium/baggage-hand-baggage.svg +36 -0
  225. package/assets/icons/medium/baggage-special-baggage--light.svg +21 -0
  226. package/assets/icons/medium/baggage-special-baggage.svg +23 -0
  227. package/assets/icons/medium/baggage-sports-equipment--light.svg +18 -0
  228. package/assets/icons/medium/baggage-sports-equipment.svg +21 -0
  229. package/assets/icons/medium/baggage.svg +11 -0
  230. package/assets/icons/medium/baggages--light.svg +1 -0
  231. package/assets/icons/medium/baggages.svg +1 -0
  232. package/assets/icons/medium/car-rental--light.svg +26 -0
  233. package/assets/icons/medium/car-rental.svg +26 -0
  234. package/assets/icons/medium/card--light.svg +18 -0
  235. package/assets/icons/medium/card.svg +18 -0
  236. package/assets/icons/medium/cashpoints--light.svg +29 -0
  237. package/assets/icons/medium/cashpoints.svg +31 -0
  238. package/assets/icons/medium/central-airports--light.svg +25 -0
  239. package/assets/icons/medium/central-airports.svg +25 -0
  240. package/assets/icons/medium/customer-service--light.svg +19 -0
  241. package/assets/icons/medium/customer-service.svg +22 -0
  242. package/assets/icons/medium/direct-flights--light.svg +24 -0
  243. package/assets/icons/medium/direct-flights.svg +25 -0
  244. package/assets/icons/medium/direct-to-gate--light.svg +18 -0
  245. package/assets/icons/medium/direct-to-gate.svg +18 -0
  246. package/assets/icons/medium/docs--light.svg +10 -0
  247. package/assets/icons/medium/docs.svg +10 -0
  248. package/assets/icons/medium/entertainment--light.svg +71 -0
  249. package/assets/icons/medium/entertainment.svg +81 -0
  250. package/assets/icons/medium/facebook.svg +12 -0
  251. package/assets/icons/medium/family.svg +29 -0
  252. package/assets/icons/medium/fast-track--light.svg +19 -0
  253. package/assets/icons/medium/fast-track.svg +23 -0
  254. package/assets/icons/medium/flexible-tickets--light.svg +16 -0
  255. package/assets/icons/medium/flexible-tickets.svg +18 -0
  256. package/assets/icons/medium/flight-arrival--light.svg +16 -0
  257. package/assets/icons/medium/flight-arrival.svg +15 -0
  258. package/assets/icons/medium/flight-departure--light.svg +12 -0
  259. package/assets/icons/medium/flight-departure.svg +12 -0
  260. package/assets/icons/medium/flight-oneway--light.svg +12 -0
  261. package/assets/icons/medium/flight-oneway.svg +13 -0
  262. package/assets/icons/medium/flight-outbound--light.svg +11 -0
  263. package/assets/icons/medium/flight-outbound.svg +11 -0
  264. package/assets/icons/medium/flight-return--light.svg +11 -0
  265. package/assets/icons/medium/flight-return-trip.svg +13 -0
  266. package/assets/icons/medium/flight-return.svg +11 -0
  267. package/assets/icons/medium/flight-tickets--light.svg +22 -0
  268. package/assets/icons/medium/flight-tickets.svg +21 -0
  269. package/assets/icons/medium/food--light.svg +16 -0
  270. package/assets/icons/medium/food.svg +19 -0
  271. package/assets/icons/medium/frequent-departures--light.svg +16 -0
  272. package/assets/icons/medium/frequent-departures.svg +16 -0
  273. package/assets/icons/medium/from-a-to-b--light.svg +17 -0
  274. package/assets/icons/medium/from-a-to-b.svg +17 -0
  275. package/assets/icons/medium/in-flight-entertainment--light.svg +20 -0
  276. package/assets/icons/medium/in-flight-entertainment.svg +21 -0
  277. package/assets/icons/medium/instagram.svg +14 -0
  278. package/assets/icons/medium/linkedin.svg +17 -0
  279. package/assets/icons/medium/lounge--light.svg +19 -0
  280. package/assets/icons/medium/lounge.svg +21 -0
  281. package/assets/icons/medium/mobile--light.svg +10 -0
  282. package/assets/icons/medium/mobile.svg +9 -0
  283. package/assets/icons/medium/my-profile-female.svg +55 -0
  284. package/assets/icons/medium/my-profile-male.svg +48 -0
  285. package/assets/icons/medium/new-airplanes--light.svg +14 -0
  286. package/assets/icons/medium/new-airplanes.svg +14 -0
  287. package/assets/icons/medium/personnel--light.svg +19 -0
  288. package/assets/icons/medium/personnel.svg +27 -0
  289. package/assets/icons/medium/phone--light.svg +15 -0
  290. package/assets/icons/medium/phone.svg +15 -0
  291. package/assets/icons/medium/premium--light.svg +23 -0
  292. package/assets/icons/medium/premium.svg +23 -0
  293. package/assets/icons/medium/print--light.svg +14 -0
  294. package/assets/icons/medium/printer.svg +14 -0
  295. package/assets/icons/medium/relax--light.svg +27 -0
  296. package/assets/icons/medium/relax.svg +28 -0
  297. package/assets/icons/medium/rewards--light.svg +19 -0
  298. package/assets/icons/medium/rewards-fast-track.svg +17 -0
  299. package/assets/icons/medium/rewards-luggage.svg +22 -0
  300. package/assets/icons/medium/rewards-seat.svg +21 -0
  301. package/assets/icons/medium/rewards.svg +19 -0
  302. package/assets/icons/medium/route-network--light.svg +28 -0
  303. package/assets/icons/medium/route-network.svg +28 -0
  304. package/assets/icons/medium/seat-reservation--light.svg +16 -0
  305. package/assets/icons/medium/seat-reservation.svg +16 -0
  306. package/assets/icons/medium/special-needs--light.svg +15 -0
  307. package/assets/icons/medium/special-needs.svg +15 -0
  308. package/assets/icons/medium/transit-stop--light.svg +30 -0
  309. package/assets/icons/medium/transit-stop.svg +33 -0
  310. package/assets/icons/medium/trash--light.svg +7 -0
  311. package/assets/icons/medium/trash.svg +7 -0
  312. package/assets/icons/medium/travel-deals--light.svg +24 -0
  313. package/assets/icons/medium/travel-deals.svg +24 -0
  314. package/assets/icons/medium/twitter.svg +17 -0
  315. package/assets/icons/medium/type-asia--light.svg +19 -0
  316. package/assets/icons/medium/type-asia.svg +19 -0
  317. package/assets/icons/medium/type-city-vibes--light.svg +14 -0
  318. package/assets/icons/medium/type-city-vibes.svg +14 -0
  319. package/assets/icons/medium/type-greece--light.svg +24 -0
  320. package/assets/icons/medium/type-greece.svg +28 -0
  321. package/assets/icons/medium/type-norway--light.svg +18 -0
  322. package/assets/icons/medium/type-norway.svg +18 -0
  323. package/assets/icons/medium/type-scandinavia--light.svg +32 -0
  324. package/assets/icons/medium/type-scandinavia.svg +32 -0
  325. package/assets/icons/medium/type-shopping--light.svg +20 -0
  326. package/assets/icons/medium/type-shopping.svg +20 -0
  327. package/assets/icons/medium/type-skiing--light.svg +32 -0
  328. package/assets/icons/medium/type-skiing.svg +32 -0
  329. package/assets/icons/medium/type-spain--light.svg +12 -0
  330. package/assets/icons/medium/type-spain.svg +12 -0
  331. package/assets/icons/medium/type-sun-and-sea--light.svg +34 -0
  332. package/assets/icons/medium/type-sun-and-sea.svg +34 -0
  333. package/assets/icons/medium/type-usa--light.svg +46 -0
  334. package/assets/icons/medium/type-usa.svg +46 -0
  335. package/assets/icons/medium/wifi--light.svg +15 -0
  336. package/assets/icons/medium/wifi.svg +15 -0
  337. package/assets/icons/medium/youtube.svg +12 -0
  338. package/assets/icons/mobile-landscape.svg +12 -0
  339. package/assets/icons/mobile-portrait.svg +12 -0
  340. package/assets/icons/small/accommodation--light.svg +15 -0
  341. package/assets/icons/small/accommodation.svg +21 -0
  342. package/assets/icons/small/alert--error.svg +7 -0
  343. package/assets/icons/small/alert--light.svg +10 -0
  344. package/assets/icons/small/alert.svg +10 -0
  345. package/assets/icons/small/arrow-down--light.svg +11 -0
  346. package/assets/icons/small/arrow-down.svg +11 -0
  347. package/assets/icons/small/arrow-left--light.svg +10 -0
  348. package/assets/icons/small/arrow-left.svg +10 -0
  349. package/assets/icons/small/arrow-right--light.svg +11 -0
  350. package/assets/icons/small/arrow-right.svg +11 -0
  351. package/assets/icons/small/arrow-up--light.svg +10 -0
  352. package/assets/icons/small/arrow-up.svg +10 -0
  353. package/assets/icons/small/baggage--light.svg +8 -0
  354. package/assets/icons/small/baggage-checked-in--light.svg +16 -0
  355. package/assets/icons/small/baggage-checked-in.svg +16 -0
  356. package/assets/icons/small/baggage-hand-baggage--light.svg +11 -0
  357. package/assets/icons/small/baggage-hand-baggage.svg +11 -0
  358. package/assets/icons/small/baggage-special-baggage--light.svg +20 -0
  359. package/assets/icons/small/baggage-special-baggage.svg +20 -0
  360. package/assets/icons/small/baggage-sports-equipment--light.svg +25 -0
  361. package/assets/icons/small/baggage-sports-equipment.svg +25 -0
  362. package/assets/icons/small/baggage.svg +10 -0
  363. package/assets/icons/small/baggages--light.svg +1 -0
  364. package/assets/icons/small/baggages.svg +1 -0
  365. package/assets/icons/small/calendar--disabled.svg +14 -0
  366. package/assets/icons/small/calendar--light.svg +14 -0
  367. package/assets/icons/small/calendar.svg +14 -0
  368. package/assets/icons/small/car-rental--light.svg +14 -0
  369. package/assets/icons/small/car-rental.svg +14 -0
  370. package/assets/icons/small/card--light.svg +8 -0
  371. package/assets/icons/small/card.svg +8 -0
  372. package/assets/icons/small/cashpoints--light.svg +21 -0
  373. package/assets/icons/small/cashpoints.svg +21 -0
  374. package/assets/icons/small/central-airports--light.svg +10 -0
  375. package/assets/icons/small/central-airports.svg +10 -0
  376. package/assets/icons/small/check-in--light.svg +11 -0
  377. package/assets/icons/small/check-in.svg +11 -0
  378. package/assets/icons/small/customer-service--light.svg +18 -0
  379. package/assets/icons/small/customer-service.svg +18 -0
  380. package/assets/icons/small/destination--light.svg +9 -0
  381. package/assets/icons/small/destination.svg +9 -0
  382. package/assets/icons/small/direct-flights--light.svg +16 -0
  383. package/assets/icons/small/direct-flights.svg +16 -0
  384. package/assets/icons/small/docs--light.svg +10 -0
  385. package/assets/icons/small/docs.svg +10 -0
  386. package/assets/icons/small/duty-free.svg +24 -0
  387. package/assets/icons/small/email.svg +1 -0
  388. package/assets/icons/small/facebook.svg +12 -0
  389. package/assets/icons/small/family.svg +24 -0
  390. package/assets/icons/small/fast-track--light.svg +15 -0
  391. package/assets/icons/small/fast-track.svg +15 -0
  392. package/assets/icons/small/flexible-tickets--light.svg +12 -0
  393. package/assets/icons/small/flexible-tickets.svg +12 -0
  394. package/assets/icons/small/flight-arrival--light.svg +13 -0
  395. package/assets/icons/small/flight-arrival.svg +16 -0
  396. package/assets/icons/small/flight-departure--light.svg +18 -0
  397. package/assets/icons/small/flight-departure-ground.svg +22 -0
  398. package/assets/icons/small/flight-departure-left.svg +18 -0
  399. package/assets/icons/small/flight-departure.svg +18 -0
  400. package/assets/icons/small/flight-outbound--light.svg +14 -0
  401. package/assets/icons/small/flight-outbound.svg +14 -0
  402. package/assets/icons/small/flight-return--light.svg +14 -0
  403. package/assets/icons/small/flight-return.svg +14 -0
  404. package/assets/icons/small/flight-tickets--light.svg +17 -0
  405. package/assets/icons/small/flight-tickets.svg +17 -0
  406. package/assets/icons/small/food--light.svg +15 -0
  407. package/assets/icons/small/food.svg +15 -0
  408. package/assets/icons/small/from-a-to-b--light.svg +21 -0
  409. package/assets/icons/small/from-a-to-b.svg +23 -0
  410. package/assets/icons/small/google-plus.svg +1 -0
  411. package/assets/icons/small/hotel--light.svg +10 -0
  412. package/assets/icons/small/hotel.svg +11 -0
  413. package/assets/icons/small/in-flight-entertainment--light.svg +10 -0
  414. package/assets/icons/small/in-flight-entertainment.svg +10 -0
  415. package/assets/icons/small/info--light.svg +4 -0
  416. package/assets/icons/small/info--outlined.svg +4 -0
  417. package/assets/icons/small/info.svg +4 -0
  418. package/assets/icons/small/instagram.svg +14 -0
  419. package/assets/icons/small/linkedin.svg +18 -0
  420. package/assets/icons/small/lounge--light.svg +18 -0
  421. package/assets/icons/small/lounge.svg +18 -0
  422. package/assets/icons/small/mail--light.svg +9 -0
  423. package/assets/icons/small/mail.svg +9 -0
  424. package/assets/icons/small/mobile--light.svg +8 -0
  425. package/assets/icons/small/mobile.svg +8 -0
  426. package/assets/icons/small/my-profile--light.svg +14 -0
  427. package/assets/icons/small/my-profile-female--light.svg +49 -0
  428. package/assets/icons/small/my-profile-female.svg +48 -0
  429. package/assets/icons/small/my-profile-male--light.svg +49 -0
  430. package/assets/icons/small/my-profile-male.svg +50 -0
  431. package/assets/icons/small/my-profile.svg +14 -0
  432. package/assets/icons/small/new-airplanes--light.svg +14 -0
  433. package/assets/icons/small/new-airplanes.svg +14 -0
  434. package/assets/icons/small/personnel--light.svg +14 -0
  435. package/assets/icons/small/personnel.svg +14 -0
  436. package/assets/icons/small/pintrest.svg +1 -0
  437. package/assets/icons/small/premium--light.svg +17 -0
  438. package/assets/icons/small/premium.svg +17 -0
  439. package/assets/icons/small/print.svg +14 -0
  440. package/assets/icons/small/reddit.svg +1 -0
  441. package/assets/icons/small/rewards--light.svg +19 -0
  442. package/assets/icons/small/rewards-fast-track.svg +17 -0
  443. package/assets/icons/small/rewards-luggage.svg +22 -0
  444. package/assets/icons/small/rewards-seat.svg +22 -0
  445. package/assets/icons/small/rewards.svg +19 -0
  446. package/assets/icons/small/route-network--light.svg +25 -0
  447. package/assets/icons/small/route-network.svg +25 -0
  448. package/assets/icons/small/search--light.svg +16 -0
  449. package/assets/icons/small/search.svg +16 -0
  450. package/assets/icons/small/seat-reservation--light.svg +14 -0
  451. package/assets/icons/small/seat-reservation.svg +14 -0
  452. package/assets/icons/small/skis--light.svg +24 -0
  453. package/assets/icons/small/skis.svg +24 -0
  454. package/assets/icons/small/special-needs--light.svg +16 -0
  455. package/assets/icons/small/special-needs.svg +16 -0
  456. package/assets/icons/small/sun--light.svg +17 -0
  457. package/assets/icons/small/sun.svg +19 -0
  458. package/assets/icons/small/transit-stop--light.svg +19 -0
  459. package/assets/icons/small/transit-stop.svg +21 -0
  460. package/assets/icons/small/trash--light.svg +7 -0
  461. package/assets/icons/small/trash.svg +7 -0
  462. package/assets/icons/small/travel-deals--light.svg +9 -0
  463. package/assets/icons/small/travel-deals.svg +9 -0
  464. package/assets/icons/small/twitter.svg +17 -0
  465. package/assets/icons/small/type-asia--light.svg +20 -0
  466. package/assets/icons/small/type-asia.svg +20 -0
  467. package/assets/icons/small/type-city-vibes--light.svg +10 -0
  468. package/assets/icons/small/type-city-vibes.svg +10 -0
  469. package/assets/icons/small/type-greece--light.svg +22 -0
  470. package/assets/icons/small/type-greece.svg +22 -0
  471. package/assets/icons/small/type-norway--light.svg +15 -0
  472. package/assets/icons/small/type-norway.svg +15 -0
  473. package/assets/icons/small/type-scandinavia--light.svg +17 -0
  474. package/assets/icons/small/type-scandinavia.svg +35 -0
  475. package/assets/icons/small/type-shopping--light.svg +13 -0
  476. package/assets/icons/small/type-shopping.svg +13 -0
  477. package/assets/icons/small/type-skiing--light.svg +18 -0
  478. package/assets/icons/small/type-skiing.svg +18 -0
  479. package/assets/icons/small/type-spain--light.svg +12 -0
  480. package/assets/icons/small/type-spain.svg +12 -0
  481. package/assets/icons/small/type-sun-and-sea--light.svg +59 -0
  482. package/assets/icons/small/type-sun-and-sea.svg +59 -0
  483. package/assets/icons/small/type-usa--light.svg +24 -0
  484. package/assets/icons/small/type-usa.svg +24 -0
  485. package/assets/icons/small/wifi--light.svg +17 -0
  486. package/assets/icons/small/wifi.svg +17 -0
  487. package/assets/icons/small/youtube.svg +11 -0
  488. package/assets/icons/tablet-landscape.svg +12 -0
  489. package/assets/icons/tablet-portrait.svg +12 -0
  490. package/assets/icons/upgrade.svg +8 -0
  491. package/assets/icons/weather/humidity.svg +1 -0
  492. package/assets/icons/weather/sun.svg +1 -0
  493. package/assets/icons/weather/sunrise.svg +1 -0
  494. package/assets/icons/weather/sunset.svg +1 -0
  495. package/assets/icons/weather/temperature.svg +1 -0
  496. package/assets/icons/weather/weather--cloud.svg +1 -0
  497. package/assets/icons/weather/weather--rain-sun.svg +1 -0
  498. package/assets/icons/weather/weather--rain.svg +1 -0
  499. package/assets/icons/weather/weather--storm.svg +1 -0
  500. package/assets/icons/weather/weather--sun-cloud.svg +1 -0
  501. package/assets/icons/weather/weather--sun.svg +1 -0
  502. package/assets/images/cloud-1.svg +1 -0
  503. package/assets/images/logo--mobile.svg +50 -0
  504. package/assets/images/logo.svg +135 -0
  505. package/assets/images/slider-bar.svg +7 -0
  506. package/assets/images/slider-thumb-disabled.svg +19 -0
  507. package/assets/images/slider-thumb.svg +14 -0
  508. package/bundles/norwegian-core-components.umd.js +11898 -0
  509. package/bundles/norwegian-core-components.umd.js.map +1 -0
  510. package/esm2015/lib/components/accordion/accordion.component.js +118 -0
  511. package/esm2015/lib/components/accordion/accordion.module.js +15 -0
  512. package/esm2015/lib/components/accordion/index.js +3 -0
  513. package/esm2015/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.js +583 -0
  514. package/esm2015/lib/components/airport-select/airport-select.component.js +400 -0
  515. package/esm2015/lib/components/airport-select/airport-select.module.js +27 -0
  516. package/esm2015/lib/components/airport-select/index.js +4 -0
  517. package/esm2015/lib/components/airport-select/models/airport.model.js +2 -0
  518. package/esm2015/lib/components/airport-select/models/results-labels.model.js +3 -0
  519. package/esm2015/lib/components/airport-select/services/airport-select-dropdown.service.js +34 -0
  520. package/esm2015/lib/components/airport-select/services/airport-select.service.js +29 -0
  521. package/esm2015/lib/components/autocomplete/autocomplete.component.js +265 -0
  522. package/esm2015/lib/components/autocomplete/autocomplete.module.js +26 -0
  523. package/esm2015/lib/components/autocomplete/index.js +4 -0
  524. package/esm2015/lib/components/autocomplete/models/autocomplete.model.js +2 -0
  525. package/esm2015/lib/components/backdrop/backdrop.component.js +54 -0
  526. package/esm2015/lib/components/backdrop/backdrop.module.js +17 -0
  527. package/esm2015/lib/components/backdrop/index.js +3 -0
  528. package/esm2015/lib/components/box/box.component.js +61 -0
  529. package/esm2015/lib/components/box/box.module.js +14 -0
  530. package/esm2015/lib/components/box/index.js +3 -0
  531. package/esm2015/lib/components/button/button.component.js +140 -0
  532. package/esm2015/lib/components/button/button.module.js +15 -0
  533. package/esm2015/lib/components/button/index.js +3 -0
  534. package/esm2015/lib/components/checkbox/checkbox.component.js +125 -0
  535. package/esm2015/lib/components/checkbox/checkbox.module.js +15 -0
  536. package/esm2015/lib/components/checkbox/index.js +3 -0
  537. package/esm2015/lib/components/chip/chip.component.js +50 -0
  538. package/esm2015/lib/components/chip/chip.module.js +17 -0
  539. package/esm2015/lib/components/chip/index.js +3 -0
  540. package/esm2015/lib/components/container/container.component.js +47 -0
  541. package/esm2015/lib/components/container/container.module.js +14 -0
  542. package/esm2015/lib/components/container/index.js +3 -0
  543. package/esm2015/lib/components/continue/continue.component.js +173 -0
  544. package/esm2015/lib/components/continue/continue.module.js +23 -0
  545. package/esm2015/lib/components/continue/index.js +3 -0
  546. package/esm2015/lib/components/cover/cover.component.js +61 -0
  547. package/esm2015/lib/components/cover/cover.module.js +16 -0
  548. package/esm2015/lib/components/cover/index.js +3 -0
  549. package/esm2015/lib/components/datepicker/calendar/calendar-date.model.js +2 -0
  550. package/esm2015/lib/components/datepicker/calendar/calendar.component.js +560 -0
  551. package/esm2015/lib/components/datepicker/calendar/enums/week-start.enum.js +6 -0
  552. package/esm2015/lib/components/datepicker/calendar/models/day.model.js +2 -0
  553. package/esm2015/lib/components/datepicker/calendar/models/select-option.model.js +2 -0
  554. package/esm2015/lib/components/datepicker/calendar/models/week.model.js +2 -0
  555. package/esm2015/lib/components/datepicker/datepicker.component.js +511 -0
  556. package/esm2015/lib/components/datepicker/datepicker.module.js +34 -0
  557. package/esm2015/lib/components/datepicker/index.js +5 -0
  558. package/esm2015/lib/components/datepicker/services/calendar.service.js +217 -0
  559. package/esm2015/lib/components/datepicker-combo/datepicker-combo.component.js +306 -0
  560. package/esm2015/lib/components/datepicker-combo/datepicker-combo.module.js +22 -0
  561. package/esm2015/lib/components/datepicker-combo/index.js +3 -0
  562. package/esm2015/lib/components/dropdown/dropdown.component.js +146 -0
  563. package/esm2015/lib/components/dropdown/dropdown.module.js +21 -0
  564. package/esm2015/lib/components/dropdown/index.js +3 -0
  565. package/esm2015/lib/components/filter/enums/trip-type.enum.js +8 -0
  566. package/esm2015/lib/components/filter/filter.component.js +1100 -0
  567. package/esm2015/lib/components/filter/filter.module.js +44 -0
  568. package/esm2015/lib/components/filter/index.js +4 -0
  569. package/esm2015/lib/components/grid/col/col.component.js +47 -0
  570. package/esm2015/lib/components/grid/grid.component.js +55 -0
  571. package/esm2015/lib/components/grid/grid.module.js +15 -0
  572. package/esm2015/lib/components/grid/index.js +4 -0
  573. package/esm2015/lib/components/icon/icon.component.js +42 -0
  574. package/esm2015/lib/components/icon/icon.module.js +17 -0
  575. package/esm2015/lib/components/icon/index.js +3 -0
  576. package/esm2015/lib/components/icon-list/icon-list.component.js +46 -0
  577. package/esm2015/lib/components/icon-list/icon-list.model.js +2 -0
  578. package/esm2015/lib/components/icon-list/icon-list.module.js +15 -0
  579. package/esm2015/lib/components/icon-list/index.js +4 -0
  580. package/esm2015/lib/components/index.js +49 -0
  581. package/esm2015/lib/components/info/index.js +4 -0
  582. package/esm2015/lib/components/info/info.component.js +81 -0
  583. package/esm2015/lib/components/info/info.module.js +21 -0
  584. package/esm2015/lib/components/info/models/info.model.js +2 -0
  585. package/esm2015/lib/components/input/index.js +3 -0
  586. package/esm2015/lib/components/input/input.component.js +139 -0
  587. package/esm2015/lib/components/input/input.module.js +16 -0
  588. package/esm2015/lib/components/journey/index.js +3 -0
  589. package/esm2015/lib/components/journey/journey.component.js +122 -0
  590. package/esm2015/lib/components/journey/journey.module.js +19 -0
  591. package/esm2015/lib/components/journey/models/journey-flight.model.js +2 -0
  592. package/esm2015/lib/components/journey/models/journey.model.js +2 -0
  593. package/esm2015/lib/components/journey-availability/index.js +3 -0
  594. package/esm2015/lib/components/journey-availability/journey-availability.component.js +125 -0
  595. package/esm2015/lib/components/journey-availability/journey-availability.module.js +26 -0
  596. package/esm2015/lib/components/journey-availability-list/enums/availability-sort-option.enum.js +7 -0
  597. package/esm2015/lib/components/journey-availability-list/index.js +3 -0
  598. package/esm2015/lib/components/journey-availability-list/journey-availability-list.component.js +175 -0
  599. package/esm2015/lib/components/journey-availability-list/journey-availability-list.module.js +23 -0
  600. package/esm2015/lib/components/journey-selection/index.js +6 -0
  601. package/esm2015/lib/components/journey-selection/journey-selection.component.js +110 -0
  602. package/esm2015/lib/components/journey-selection/journey-selection.module.js +24 -0
  603. package/esm2015/lib/components/journey-selection/models/journey-selection-collapsed.model.js +2 -0
  604. package/esm2015/lib/components/journey-selection/models/journey-selection-common.model.js +2 -0
  605. package/esm2015/lib/components/journey-selection/models/journey-selection-expanded.model.js +2 -0
  606. package/esm2015/lib/components/journey-selection/models/journey-selection.model.js +2 -0
  607. package/esm2015/lib/components/journey-stopover/index.js +3 -0
  608. package/esm2015/lib/components/journey-stopover/journey-stopover.component.js +121 -0
  609. package/esm2015/lib/components/journey-stopover/journey-stopover.module.js +19 -0
  610. package/esm2015/lib/components/journey-stopover/models/stopover-time.model.js +2 -0
  611. package/esm2015/lib/components/list/index.js +4 -0
  612. package/esm2015/lib/components/list/list-item/list-item.component.js +56 -0
  613. package/esm2015/lib/components/list/list.component.js +75 -0
  614. package/esm2015/lib/components/list/list.module.js +15 -0
  615. package/esm2015/lib/components/modal/index.js +3 -0
  616. package/esm2015/lib/components/modal/modal.component.js +131 -0
  617. package/esm2015/lib/components/modal/modal.module.js +25 -0
  618. package/esm2015/lib/components/number-field/index.js +3 -0
  619. package/esm2015/lib/components/number-field/number-field.component.js +118 -0
  620. package/esm2015/lib/components/number-field/number-field.module.js +24 -0
  621. package/esm2015/lib/components/page-footer/index.js +3 -0
  622. package/esm2015/lib/components/page-footer/page-footer.component.js +49 -0
  623. package/esm2015/lib/components/page-footer/page-footer.module.js +16 -0
  624. package/esm2015/lib/components/page-header/hamburger/hamburger.component.js +24 -0
  625. package/esm2015/lib/components/page-header/index.js +5 -0
  626. package/esm2015/lib/components/page-header/page-header.component.js +119 -0
  627. package/esm2015/lib/components/page-header/page-header.module.js +18 -0
  628. package/esm2015/lib/components/page-header/search/search.component.js +47 -0
  629. package/esm2015/lib/components/passenger-select/enums/passenger-type.enum.js +7 -0
  630. package/esm2015/lib/components/passenger-select/index.js +5 -0
  631. package/esm2015/lib/components/passenger-select/models/passengers.model.js +2 -0
  632. package/esm2015/lib/components/passenger-select/passenger-select.component.js +204 -0
  633. package/esm2015/lib/components/passenger-select/passenger-select.module.js +19 -0
  634. package/esm2015/lib/components/phone-number/index.js +3 -0
  635. package/esm2015/lib/components/phone-number/phone-number.component.js +115 -0
  636. package/esm2015/lib/components/phone-number/phone-number.module.js +27 -0
  637. package/esm2015/lib/components/premium-toggle/index.js +3 -0
  638. package/esm2015/lib/components/premium-toggle/premium-toggle.component.js +66 -0
  639. package/esm2015/lib/components/premium-toggle/premium-toggle.module.js +19 -0
  640. package/esm2015/lib/components/radio/index.js +3 -0
  641. package/esm2015/lib/components/radio/radio.component.js +79 -0
  642. package/esm2015/lib/components/radio/radio.module.js +15 -0
  643. package/esm2015/lib/components/select/index.js +6 -0
  644. package/esm2015/lib/components/select/models/select-option.model.js +2 -0
  645. package/esm2015/lib/components/select/optgroup/optgroup.component.js +31 -0
  646. package/esm2015/lib/components/select/option/option.component.js +29 -0
  647. package/esm2015/lib/components/select/select.component.js +316 -0
  648. package/esm2015/lib/components/select/select.module.js +21 -0
  649. package/esm2015/lib/components/simple-list/index.js +3 -0
  650. package/esm2015/lib/components/simple-list/simple-list.component.js +42 -0
  651. package/esm2015/lib/components/simple-list/simple-list.module.js +14 -0
  652. package/esm2015/lib/components/slide-toggle/index.js +3 -0
  653. package/esm2015/lib/components/slide-toggle/slide-toggle.component.js +105 -0
  654. package/esm2015/lib/components/slide-toggle/slide-toggle.module.js +20 -0
  655. package/esm2015/lib/components/slider/index.js +3 -0
  656. package/esm2015/lib/components/slider/slider.component.js +447 -0
  657. package/esm2015/lib/components/slider/slider.module.js +19 -0
  658. package/esm2015/lib/components/sort/index.js +3 -0
  659. package/esm2015/lib/components/sort/sort.component.js +87 -0
  660. package/esm2015/lib/components/sort/sort.module.js +23 -0
  661. package/esm2015/lib/components/spinner/index.js +3 -0
  662. package/esm2015/lib/components/spinner/spinner.component.js +57 -0
  663. package/esm2015/lib/components/spinner/spinner.module.js +14 -0
  664. package/esm2015/lib/components/subsidy-discount/index.js +4 -0
  665. package/esm2015/lib/components/subsidy-discount/models/subsidy-discount.model.js +2 -0
  666. package/esm2015/lib/components/subsidy-discount/subsidy-discount.component.js +101 -0
  667. package/esm2015/lib/components/subsidy-discount/subsidy-discount.module.js +23 -0
  668. package/esm2015/lib/components/suggestions/index.js +3 -0
  669. package/esm2015/lib/components/suggestions/suggestions.component.js +40 -0
  670. package/esm2015/lib/components/suggestions/suggestions.module.js +19 -0
  671. package/esm2015/lib/components/tab-group/index.js +4 -0
  672. package/esm2015/lib/components/tab-group/tab/tab.component.js +123 -0
  673. package/esm2015/lib/components/tab-group/tab-group.component.js +85 -0
  674. package/esm2015/lib/components/tab-group/tab-group.module.js +20 -0
  675. package/esm2015/lib/components/table/column/column.component.js +17 -0
  676. package/esm2015/lib/components/table/column-group/column-group.component.js +34 -0
  677. package/esm2015/lib/components/table/index.js +11 -0
  678. package/esm2015/lib/components/table/services/table.service.js +20 -0
  679. package/esm2015/lib/components/table/table-body/table-body.component.js +27 -0
  680. package/esm2015/lib/components/table/table-foot/table-foot.component.js +27 -0
  681. package/esm2015/lib/components/table/table-head/table-head.component.js +27 -0
  682. package/esm2015/lib/components/table/table-row/table-data/table-data.component.js +15 -0
  683. package/esm2015/lib/components/table/table-row/table-header/table-header.component.js +15 -0
  684. package/esm2015/lib/components/table/table-row/table-row.component.js +27 -0
  685. package/esm2015/lib/components/table/table.component.js +29 -0
  686. package/esm2015/lib/components/table/table.module.js +45 -0
  687. package/esm2015/lib/components/textarea/index.js +3 -0
  688. package/esm2015/lib/components/textarea/textarea.component.js +73 -0
  689. package/esm2015/lib/components/textarea/textarea.module.js +20 -0
  690. package/esm2015/lib/components/toggle/index.js +3 -0
  691. package/esm2015/lib/components/toggle/models/options.model.js +3 -0
  692. package/esm2015/lib/components/toggle/toggle.component.js +77 -0
  693. package/esm2015/lib/components/toggle/toggle.module.js +22 -0
  694. package/esm2015/lib/components/trip-summary/index.js +3 -0
  695. package/esm2015/lib/components/trip-summary/trip-summary.component.js +152 -0
  696. package/esm2015/lib/components/trip-summary/trip-summary.module.js +23 -0
  697. package/esm2015/lib/components/weather-icon/index.js +3 -0
  698. package/esm2015/lib/components/weather-icon/weather-icon.component.js +56 -0
  699. package/esm2015/lib/components/weather-icon/weather-icon.module.js +14 -0
  700. package/esm2015/lib/core/base/nas-component.base.js +48 -0
  701. package/esm2015/lib/core/decorators/debounce.decorator.js +12 -0
  702. package/esm2015/lib/core/directives/index.js +3 -0
  703. package/esm2015/lib/core/directives/nas-class/nas-class.directive.js +75 -0
  704. package/esm2015/lib/core/directives/nas-class/nas-class.module.js +17 -0
  705. package/esm2015/lib/core/extensions/html-element.extension.js +31 -0
  706. package/esm2015/lib/core/index.js +5 -0
  707. package/esm2015/lib/core/models/abandoned-basket-item.model.js +2 -0
  708. package/esm2015/lib/core/models/animate.model.js +2 -0
  709. package/esm2015/lib/core/models/class.model.js +2 -0
  710. package/esm2015/lib/core/models/index.js +7 -0
  711. package/esm2015/lib/core/models/link.model.js +2 -0
  712. package/esm2015/lib/core/models/position.model.js +2 -0
  713. package/esm2015/lib/core/models/utc-date.model.js +40 -0
  714. package/esm2015/lib/core/services/abandoned-basket/abandoned-basket.service.js +55 -0
  715. package/esm2015/lib/core/services/animate-helper/animate-helper.service.js +47 -0
  716. package/esm2015/lib/core/services/bem-helper/bem-helper.service.js +41 -0
  717. package/esm2015/lib/core/services/date/date-compare.enum.js +7 -0
  718. package/esm2015/lib/core/services/date/date-helper.service.js +196 -0
  719. package/esm2015/lib/core/services/device/device-helper.service.js +43 -0
  720. package/esm2015/lib/core/services/geolocation/geolocation-state.enum.js +8 -0
  721. package/esm2015/lib/core/services/geolocation/geolocation.service.js +60 -0
  722. package/esm2015/lib/core/services/index.js +10 -0
  723. package/esm2015/lib/core/services/language/language-helper.service.js +162 -0
  724. package/esm2015/lib/core/services/sort/sort.service.js +19 -0
  725. package/esm2015/lib/core/services/viewport/viewport.service.js +29 -0
  726. package/esm2015/lib/index.js +5 -0
  727. package/esm2015/lib/services/get-position.service.js +21 -0
  728. package/esm2015/lib/services/index.js +2 -0
  729. package/esm2015/lib/shared/index.js +2 -0
  730. package/esm2015/lib/shared/models/flight-details.js +3 -0
  731. package/esm2015/lib/shared/models/index.js +5 -0
  732. package/esm2015/lib/shared/models/journey-availability-sort.model.js +2 -0
  733. package/esm2015/lib/shared/models/journey-availability.model.js +2 -0
  734. package/esm2015/lib/shared/models/journey-details.model.js +2 -0
  735. package/esm2015/lib/shared/models/journey-duration.model.js +2 -0
  736. package/esm2015/lib/shared/models/journey-stopover.model.js +2 -0
  737. package/esm2015/lib/shared/models/journey-transit-info.model.js +2 -0
  738. package/esm2015/lib/shared/models/operating-carrier.model.js +2 -0
  739. package/esm2015/lib/shared/models/sort-option.model.js +2 -0
  740. package/esm2015/lib/shared/models/sort.model.js +2 -0
  741. package/esm2015/lib/shared/models/trip-item-details.model.js +2 -0
  742. package/esm2015/lib/shared/models/trip-summary-details.model.js +2 -0
  743. package/esm2015/lib/shared/models/trip-summary.model.js +2 -0
  744. package/esm2015/norwegian-core-components.js +12 -0
  745. package/esm2015/public_api.js +2 -0
  746. package/fesm2015/norwegian-core-components.js +10595 -0
  747. package/fesm2015/norwegian-core-components.js.map +1 -0
  748. package/lib/components/accordion/accordion.component.d.ts +205 -0
  749. package/lib/components/accordion/accordion.module.d.ts +2 -0
  750. package/lib/components/accordion/index.d.ts +2 -0
  751. package/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.d.ts +94 -0
  752. package/lib/components/airport-select/airport-select.component.d.ts +256 -0
  753. package/lib/components/airport-select/airport-select.module.d.ts +2 -0
  754. package/lib/components/airport-select/index.d.ts +3 -0
  755. package/lib/components/airport-select/models/airport.model.d.ts +10 -0
  756. package/lib/components/airport-select/models/results-labels.model.d.ts +7 -0
  757. package/lib/components/airport-select/services/airport-select-dropdown.service.d.ts +7 -0
  758. package/lib/components/airport-select/services/airport-select.service.d.ts +5 -0
  759. package/lib/components/autocomplete/autocomplete.component.d.ts +115 -0
  760. package/lib/components/autocomplete/autocomplete.module.d.ts +2 -0
  761. package/lib/components/autocomplete/index.d.ts +3 -0
  762. package/lib/components/autocomplete/models/autocomplete.model.d.ts +5 -0
  763. package/lib/components/backdrop/backdrop.component.d.ts +32 -0
  764. package/lib/components/backdrop/backdrop.module.d.ts +2 -0
  765. package/lib/components/backdrop/index.d.ts +2 -0
  766. package/lib/components/box/box.component.d.ts +69 -0
  767. package/lib/components/box/box.module.d.ts +2 -0
  768. package/lib/components/box/index.d.ts +2 -0
  769. package/lib/components/button/button.component.d.ts +238 -0
  770. package/lib/components/button/button.module.d.ts +2 -0
  771. package/lib/components/button/index.d.ts +2 -0
  772. package/lib/components/checkbox/checkbox.component.d.ts +119 -0
  773. package/lib/components/checkbox/checkbox.module.d.ts +2 -0
  774. package/lib/components/checkbox/index.d.ts +2 -0
  775. package/lib/components/chip/chip.component.d.ts +61 -0
  776. package/lib/components/chip/chip.module.d.ts +2 -0
  777. package/lib/components/chip/index.d.ts +2 -0
  778. package/lib/components/container/container.component.d.ts +47 -0
  779. package/lib/components/container/container.module.d.ts +2 -0
  780. package/lib/components/container/index.d.ts +2 -0
  781. package/lib/components/continue/continue.component.d.ts +154 -0
  782. package/lib/components/continue/continue.module.d.ts +2 -0
  783. package/lib/components/continue/index.d.ts +2 -0
  784. package/lib/components/cover/cover.component.d.ts +112 -0
  785. package/lib/components/cover/cover.module.d.ts +2 -0
  786. package/lib/components/cover/index.d.ts +2 -0
  787. package/lib/components/datepicker/calendar/calendar-date.model.d.ts +5 -0
  788. package/lib/components/datepicker/calendar/calendar.component.d.ts +156 -0
  789. package/lib/components/datepicker/calendar/enums/week-start.enum.d.ts +4 -0
  790. package/lib/components/datepicker/calendar/models/day.model.d.ts +9 -0
  791. package/lib/components/datepicker/calendar/models/select-option.model.d.ts +4 -0
  792. package/lib/components/datepicker/calendar/models/week.model.d.ts +5 -0
  793. package/lib/components/datepicker/datepicker.component.d.ts +235 -0
  794. package/lib/components/datepicker/datepicker.module.d.ts +2 -0
  795. package/lib/components/datepicker/index.d.ts +4 -0
  796. package/lib/components/datepicker/services/calendar.service.d.ts +24 -0
  797. package/lib/components/datepicker-combo/datepicker-combo.component.d.ts +246 -0
  798. package/lib/components/datepicker-combo/datepicker-combo.module.d.ts +2 -0
  799. package/lib/components/datepicker-combo/index.d.ts +2 -0
  800. package/lib/components/dropdown/dropdown.component.d.ts +64 -0
  801. package/lib/components/dropdown/dropdown.module.d.ts +2 -0
  802. package/lib/components/dropdown/index.d.ts +2 -0
  803. package/lib/components/filter/enums/trip-type.enum.d.ts +6 -0
  804. package/lib/components/filter/filter.component.d.ts +693 -0
  805. package/lib/components/filter/filter.module.d.ts +2 -0
  806. package/lib/components/filter/index.d.ts +3 -0
  807. package/lib/components/grid/col/col.component.d.ts +37 -0
  808. package/lib/components/grid/grid.component.d.ts +61 -0
  809. package/lib/components/grid/grid.module.d.ts +2 -0
  810. package/lib/components/grid/index.d.ts +3 -0
  811. package/lib/components/icon/icon.component.d.ts +57 -0
  812. package/lib/components/icon/icon.module.d.ts +2 -0
  813. package/lib/components/icon/index.d.ts +2 -0
  814. package/lib/components/icon-list/icon-list.component.d.ts +41 -0
  815. package/lib/components/icon-list/icon-list.model.d.ts +7 -0
  816. package/lib/components/icon-list/icon-list.module.d.ts +2 -0
  817. package/lib/components/icon-list/index.d.ts +3 -0
  818. package/lib/components/index.d.ts +48 -0
  819. package/lib/components/info/index.d.ts +3 -0
  820. package/lib/components/info/info.component.d.ts +71 -0
  821. package/lib/components/info/info.module.d.ts +2 -0
  822. package/lib/components/info/models/info.model.d.ts +7 -0
  823. package/lib/components/input/index.d.ts +2 -0
  824. package/lib/components/input/input.component.d.ts +163 -0
  825. package/lib/components/input/input.module.d.ts +2 -0
  826. package/lib/components/journey/index.d.ts +2 -0
  827. package/lib/components/journey/journey.component.d.ts +119 -0
  828. package/lib/components/journey/journey.module.d.ts +2 -0
  829. package/lib/components/journey/models/journey-flight.model.d.ts +10 -0
  830. package/lib/components/journey/models/journey.model.d.ts +5 -0
  831. package/lib/components/journey-availability/index.d.ts +2 -0
  832. package/lib/components/journey-availability/journey-availability.component.d.ts +90 -0
  833. package/lib/components/journey-availability/journey-availability.module.d.ts +2 -0
  834. package/lib/components/journey-availability-list/enums/availability-sort-option.enum.d.ts +5 -0
  835. package/lib/components/journey-availability-list/index.d.ts +2 -0
  836. package/lib/components/journey-availability-list/journey-availability-list.component.d.ts +116 -0
  837. package/lib/components/journey-availability-list/journey-availability-list.module.d.ts +2 -0
  838. package/lib/components/journey-selection/index.d.ts +5 -0
  839. package/lib/components/journey-selection/journey-selection.component.d.ts +70 -0
  840. package/lib/components/journey-selection/journey-selection.module.d.ts +2 -0
  841. package/lib/components/journey-selection/models/journey-selection-collapsed.model.d.ts +11 -0
  842. package/lib/components/journey-selection/models/journey-selection-common.model.d.ts +7 -0
  843. package/lib/components/journey-selection/models/journey-selection-expanded.model.d.ts +5 -0
  844. package/lib/components/journey-selection/models/journey-selection.model.d.ts +14 -0
  845. package/lib/components/journey-stopover/index.d.ts +2 -0
  846. package/lib/components/journey-stopover/journey-stopover.component.d.ts +132 -0
  847. package/lib/components/journey-stopover/journey-stopover.module.d.ts +2 -0
  848. package/lib/components/journey-stopover/models/stopover-time.model.d.ts +4 -0
  849. package/lib/components/list/index.d.ts +3 -0
  850. package/lib/components/list/list-item/list-item.component.d.ts +32 -0
  851. package/lib/components/list/list.component.d.ts +65 -0
  852. package/lib/components/list/list.module.d.ts +2 -0
  853. package/lib/components/modal/index.d.ts +2 -0
  854. package/lib/components/modal/modal.component.d.ts +119 -0
  855. package/lib/components/modal/modal.module.d.ts +2 -0
  856. package/lib/components/number-field/index.d.ts +2 -0
  857. package/lib/components/number-field/number-field.component.d.ts +96 -0
  858. package/lib/components/number-field/number-field.module.d.ts +2 -0
  859. package/lib/components/page-footer/index.d.ts +2 -0
  860. package/lib/components/page-footer/page-footer.component.d.ts +57 -0
  861. package/lib/components/page-footer/page-footer.module.d.ts +2 -0
  862. package/lib/components/page-header/hamburger/hamburger.component.d.ts +9 -0
  863. package/lib/components/page-header/index.d.ts +4 -0
  864. package/lib/components/page-header/page-header.component.d.ts +84 -0
  865. package/lib/components/page-header/page-header.module.d.ts +2 -0
  866. package/lib/components/page-header/search/search.component.d.ts +23 -0
  867. package/lib/components/passenger-select/enums/passenger-type.enum.d.ts +5 -0
  868. package/lib/components/passenger-select/index.d.ts +4 -0
  869. package/lib/components/passenger-select/models/passengers.model.d.ts +9 -0
  870. package/lib/components/passenger-select/passenger-select.component.d.ts +111 -0
  871. package/lib/components/passenger-select/passenger-select.module.d.ts +2 -0
  872. package/lib/components/phone-number/index.d.ts +2 -0
  873. package/lib/components/phone-number/phone-number.component.d.ts +278 -0
  874. package/lib/components/phone-number/phone-number.module.d.ts +2 -0
  875. package/lib/components/premium-toggle/index.d.ts +2 -0
  876. package/lib/components/premium-toggle/premium-toggle.component.d.ts +51 -0
  877. package/lib/components/premium-toggle/premium-toggle.module.d.ts +2 -0
  878. package/lib/components/radio/index.d.ts +2 -0
  879. package/lib/components/radio/radio.component.d.ts +115 -0
  880. package/lib/components/radio/radio.module.d.ts +2 -0
  881. package/lib/components/select/index.d.ts +5 -0
  882. package/lib/components/select/models/select-option.model.d.ts +4 -0
  883. package/lib/components/select/optgroup/optgroup.component.d.ts +22 -0
  884. package/lib/components/select/option/option.component.d.ts +21 -0
  885. package/lib/components/select/select.component.d.ts +156 -0
  886. package/lib/components/select/select.module.d.ts +2 -0
  887. package/lib/components/simple-list/index.d.ts +2 -0
  888. package/lib/components/simple-list/simple-list.component.d.ts +49 -0
  889. package/lib/components/simple-list/simple-list.module.d.ts +2 -0
  890. package/lib/components/slide-toggle/index.d.ts +2 -0
  891. package/lib/components/slide-toggle/slide-toggle.component.d.ts +60 -0
  892. package/lib/components/slide-toggle/slide-toggle.module.d.ts +2 -0
  893. package/lib/components/slider/index.d.ts +2 -0
  894. package/lib/components/slider/slider.component.d.ts +177 -0
  895. package/lib/components/slider/slider.module.d.ts +2 -0
  896. package/lib/components/sort/index.d.ts +2 -0
  897. package/lib/components/sort/sort.component.d.ts +47 -0
  898. package/lib/components/sort/sort.module.d.ts +2 -0
  899. package/lib/components/spinner/index.d.ts +2 -0
  900. package/lib/components/spinner/spinner.component.d.ts +58 -0
  901. package/lib/components/spinner/spinner.module.d.ts +2 -0
  902. package/lib/components/subsidy-discount/index.d.ts +3 -0
  903. package/lib/components/subsidy-discount/models/subsidy-discount.model.d.ts +4 -0
  904. package/lib/components/subsidy-discount/subsidy-discount.component.d.ts +57 -0
  905. package/lib/components/subsidy-discount/subsidy-discount.module.d.ts +2 -0
  906. package/lib/components/suggestions/index.d.ts +2 -0
  907. package/lib/components/suggestions/suggestions.component.d.ts +30 -0
  908. package/lib/components/suggestions/suggestions.module.d.ts +2 -0
  909. package/lib/components/tab-group/index.d.ts +3 -0
  910. package/lib/components/tab-group/tab/tab.component.d.ts +84 -0
  911. package/lib/components/tab-group/tab-group.component.d.ts +30 -0
  912. package/lib/components/tab-group/tab-group.module.d.ts +2 -0
  913. package/lib/components/table/column/column.component.d.ts +3 -0
  914. package/lib/components/table/column-group/column-group.component.d.ts +12 -0
  915. package/lib/components/table/index.d.ts +10 -0
  916. package/lib/components/table/services/table.service.d.ts +5 -0
  917. package/lib/components/table/table-body/table-body.component.d.ts +12 -0
  918. package/lib/components/table/table-foot/table-foot.component.d.ts +12 -0
  919. package/lib/components/table/table-head/table-head.component.d.ts +12 -0
  920. package/lib/components/table/table-row/table-data/table-data.component.d.ts +2 -0
  921. package/lib/components/table/table-row/table-header/table-header.component.d.ts +2 -0
  922. package/lib/components/table/table-row/table-row.component.d.ts +12 -0
  923. package/lib/components/table/table.component.d.ts +21 -0
  924. package/lib/components/table/table.module.d.ts +2 -0
  925. package/lib/components/textarea/index.d.ts +2 -0
  926. package/lib/components/textarea/textarea.component.d.ts +121 -0
  927. package/lib/components/textarea/textarea.module.d.ts +2 -0
  928. package/lib/components/toggle/index.d.ts +2 -0
  929. package/lib/components/toggle/models/options.model.d.ts +6 -0
  930. package/lib/components/toggle/toggle.component.d.ts +183 -0
  931. package/lib/components/toggle/toggle.module.d.ts +2 -0
  932. package/lib/components/trip-summary/index.d.ts +2 -0
  933. package/lib/components/trip-summary/trip-summary.component.d.ts +173 -0
  934. package/lib/components/trip-summary/trip-summary.module.d.ts +2 -0
  935. package/lib/components/weather-icon/index.d.ts +2 -0
  936. package/lib/components/weather-icon/weather-icon.component.d.ts +51 -0
  937. package/lib/components/weather-icon/weather-icon.module.d.ts +2 -0
  938. package/lib/core/base/nas-component.base.d.ts +11 -0
  939. package/lib/core/decorators/debounce.decorator.d.ts +1 -0
  940. package/lib/core/directives/index.d.ts +2 -0
  941. package/lib/core/directives/nas-class/nas-class.directive.d.ts +11 -0
  942. package/lib/core/directives/nas-class/nas-class.module.d.ts +2 -0
  943. package/lib/core/extensions/html-element.extension.d.ts +6 -0
  944. package/lib/core/index.d.ts +4 -0
  945. package/lib/core/models/abandoned-basket-item.model.d.ts +14 -0
  946. package/lib/core/models/animate.model.d.ts +6 -0
  947. package/lib/core/models/class.model.d.ts +6 -0
  948. package/lib/core/models/index.d.ts +6 -0
  949. package/lib/core/models/link.model.d.ts +4 -0
  950. package/lib/core/models/position.model.d.ts +4 -0
  951. package/lib/core/models/utc-date.model.d.ts +13 -0
  952. package/lib/core/services/abandoned-basket/abandoned-basket.service.d.ts +7 -0
  953. package/lib/core/services/animate-helper/animate-helper.service.d.ts +6 -0
  954. package/lib/core/services/bem-helper/bem-helper.service.d.ts +4 -0
  955. package/lib/core/services/date/date-compare.enum.d.ts +5 -0
  956. package/lib/core/services/date/date-helper.service.d.ts +19 -0
  957. package/lib/core/services/device/device-helper.service.d.ts +13 -0
  958. package/lib/core/services/geolocation/geolocation-state.enum.d.ts +6 -0
  959. package/lib/core/services/geolocation/geolocation.service.d.ts +6 -0
  960. package/lib/core/services/index.d.ts +9 -0
  961. package/lib/core/services/language/language-helper.service.d.ts +9 -0
  962. package/lib/core/services/sort/sort.service.d.ts +3 -0
  963. package/lib/core/services/viewport/viewport.service.d.ts +8 -0
  964. package/lib/index.d.ts +4 -0
  965. package/lib/services/get-position.service.d.ts +6 -0
  966. package/lib/services/index.d.ts +1 -0
  967. package/lib/shared/index.d.ts +1 -0
  968. package/lib/shared/models/flight-details.d.ts +22 -0
  969. package/lib/shared/models/index.d.ts +4 -0
  970. package/lib/shared/models/journey-availability-sort.model.d.ts +8 -0
  971. package/lib/shared/models/journey-availability.model.d.ts +25 -0
  972. package/lib/shared/models/journey-details.model.d.ts +8 -0
  973. package/lib/shared/models/journey-duration.model.d.ts +7 -0
  974. package/lib/shared/models/journey-stopover.model.d.ts +11 -0
  975. package/lib/shared/models/journey-transit-info.model.d.ts +5 -0
  976. package/lib/shared/models/operating-carrier.model.d.ts +4 -0
  977. package/lib/shared/models/sort-option.model.d.ts +11 -0
  978. package/lib/shared/models/sort.model.d.ts +10 -0
  979. package/lib/shared/models/trip-item-details.model.d.ts +12 -0
  980. package/lib/shared/models/trip-summary-details.model.d.ts +5 -0
  981. package/lib/shared/models/trip-summary.model.d.ts +4 -0
  982. package/norwegian-core-components.d.ts +11 -0
  983. package/norwegian-core-components.metadata.json +1 -0
  984. package/package.json +19 -0
  985. package/public_api.d.ts +1 -0
  986. package/styles/1__settings/_colors.scss +65 -0
  987. package/styles/1__settings/_mixins.scss +226 -0
  988. package/styles/1__settings/_type.scss +53 -0
  989. package/styles/1__settings/_vars.scss +62 -0
  990. package/styles/2__generic/_fonts.scss +99 -0
  991. package/styles/2__generic/_reset.scss +275 -0
  992. package/styles/3__base/_animations.scss +138 -0
  993. package/styles/3__base/_body.scss +23 -0
  994. package/styles/3__base/_fixes.scss +5 -0
  995. package/styles/3__base/_form.scss +18 -0
  996. package/styles/3__base/_grid.scss +115 -0
  997. package/styles/3__base/_heading.scss +110 -0
  998. package/styles/3__base/_hr.scss +30 -0
  999. package/styles/3__base/_input.scss +38 -0
  1000. package/styles/3__base/_link.scss +48 -0
  1001. package/styles/3__base/_table.scss +44 -0
  1002. package/styles/3__base/_type.scss +69 -0
  1003. package/styles/_helpers.scss +4 -0
  1004. package/styles/_index.scss +15 -0
@@ -0,0 +1,1100 @@
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 passenger select, set this to false to remove it. It's true by default.
115
+ */
116
+ this.enablePassengersSelect = true;
117
+ /**
118
+ * @description
119
+ * Will display the trip switch, set this to false to remove it. It's true by default.
120
+ */
121
+ this.enableTripSwitch = true;
122
+ /**
123
+ * @description
124
+ * Will display the transit switch, set this to false to remove it. It's true by default.
125
+ */
126
+ this.enableTransitSwitch = true;
127
+ /**
128
+ * @description
129
+ * When selected datehas been changed on the outbound calendar.
130
+ */
131
+ this.outboundSelectedDateChange = new EventEmitter();
132
+ /**
133
+ * @description
134
+ * When selected datehas been changed on the inbound calendar.
135
+ */
136
+ this.inboundSelectedDateChange = new EventEmitter();
137
+ /**
138
+ * @description
139
+ * Outbound datepicker is open or closed.
140
+ */
141
+ this.outboundOpenChange = new EventEmitter();
142
+ /**
143
+ * @description
144
+ * Inbound datepicker is open or closed.
145
+ */
146
+ this.inboundOpenChange = new EventEmitter();
147
+ /**
148
+ * @description
149
+ * Outbound calendar changes month.
150
+ */
151
+ this.outboundMonthChange = new EventEmitter();
152
+ /**
153
+ * @description
154
+ * Inbound calendar changes month.
155
+ */
156
+ this.inboundMonthChange = new EventEmitter();
157
+ /**
158
+ * @description
159
+ * When a user has actively changed the date.
160
+ */
161
+ this.focusOnNextChange = new EventEmitter();
162
+ /**
163
+ * @description
164
+ * The geolocation of the user. Will be emitted if 'enableSuggestions' is true.
165
+ */
166
+ this.positionChange = new EventEmitter();
167
+ /**
168
+ * @description
169
+ * An even that is fired every time the info button on the subsidy discount is clicked.
170
+ */
171
+ this.subsidyDiscountInfoClick = new EventEmitter();
172
+ this.outboundOpenValue = false;
173
+ this.inboundOpenValue = false;
174
+ this.passengersValue = new Array();
175
+ this.nativeElement = elementRef.nativeElement;
176
+ }
177
+ get outboundOpen() {
178
+ return this.outboundOpenValue;
179
+ }
180
+ set outboundOpen(value) {
181
+ if (this.outboundOpenValue === value) {
182
+ return;
183
+ }
184
+ if (value) {
185
+ this.closeDropdowns();
186
+ if (this.airportSelect) {
187
+ this.airportSelect.originOpen = false;
188
+ this.airportSelect.destinationOpen = false;
189
+ }
190
+ }
191
+ this.outboundOpenValue = value;
192
+ this.outboundOpenChange.emit(value);
193
+ }
194
+ get inboundOpen() {
195
+ return this.inboundOpenValue;
196
+ }
197
+ set inboundOpen(value) {
198
+ if (this.inboundOpenValue === value) {
199
+ return;
200
+ }
201
+ if (value) {
202
+ this.closeDropdowns();
203
+ if (this.airportSelect) {
204
+ this.airportSelect.originOpen = false;
205
+ this.airportSelect.destinationOpen = false;
206
+ }
207
+ }
208
+ clearTimeout(this.inboundOpenTimeout);
209
+ this.inboundOpenTimeout = setTimeout(() => {
210
+ this.inboundOpenValue = value;
211
+ });
212
+ this.inboundOpenChange.emit(value);
213
+ }
214
+ /**
215
+ * @description
216
+ * An array of different passenger types that will be displayed.
217
+ */
218
+ get passengers() {
219
+ return this.passengersValue;
220
+ }
221
+ set passengers(value) {
222
+ if (!value) {
223
+ return;
224
+ }
225
+ this.passengersValue = value;
226
+ this.passengersChange.emit(value);
227
+ }
228
+ /**
229
+ * @description
230
+ * Indicates if the edit search of accordion should be expended on mobile screen sizes.
231
+ */
232
+ get expandedAccordionMobile() {
233
+ return this.expandedAccordionMobileValue;
234
+ }
235
+ set expandedAccordionMobile(value) {
236
+ if (value === this.expandedAccordionMobileValue) {
237
+ return;
238
+ }
239
+ this.expandedAccordionMobileValue = value;
240
+ }
241
+ get closestAirports() {
242
+ return this.closestAirportsValue;
243
+ }
244
+ set closestAirports(airports) {
245
+ if (!airports || airports.length < 1) {
246
+ return;
247
+ }
248
+ this.closestAirportsValue = airports;
249
+ if (this.exists(this.overrideOrigin)) {
250
+ this.originAirportCode = airports[0].code;
251
+ }
252
+ }
253
+ /**
254
+ * @required
255
+ * @description
256
+ * All airports that will be populated into the dropdown lists.
257
+ * If displayLatestSearches is true, it will try to get the latest searches from the abandoned basket.
258
+ */
259
+ get airports() {
260
+ return this.airportsValue;
261
+ }
262
+ set airports(airports) {
263
+ this.airportsValue = airports;
264
+ if (this.exists(this.displayLatestSearches)) {
265
+ const abandonedBasket = this.abandonedBasketService.getAll();
266
+ this.setLatestSearches(abandonedBasket, this.airports);
267
+ }
268
+ }
269
+ /**
270
+ * @description
271
+ * Sets and gets the selected trip type.
272
+ */
273
+ get tripType() {
274
+ return this.tripTypeValue;
275
+ }
276
+ set tripType(tripType) {
277
+ if (tripType === this.tripTypeValue) {
278
+ return;
279
+ }
280
+ this.tripTypeValue = tripType;
281
+ this.tripTypeChange.emit(this.tripType);
282
+ }
283
+ /**
284
+ * @description
285
+ * Sets and gets whether the selected transit type is direct only or not.
286
+ */
287
+ get directOnly() {
288
+ return this.directOnlyValue;
289
+ }
290
+ set directOnly(directOnly) {
291
+ if (directOnly === this.directOnlyValue) {
292
+ return;
293
+ }
294
+ this.directOnlyValue = directOnly;
295
+ this.directOnlyChange.emit(this.directOnly);
296
+ }
297
+ /**
298
+ * @description
299
+ * Selected datefor outbound calendar.
300
+ */
301
+ get outboundSelectedDate() {
302
+ return this.outboundSelectedDateValue;
303
+ }
304
+ set outboundSelectedDate(date) {
305
+ if (!date) {
306
+ return;
307
+ }
308
+ setTimeout(() => {
309
+ this.outboundSelectedDateValue = date;
310
+ this.outboundSelectedDateChange.emit(date);
311
+ });
312
+ }
313
+ /**
314
+ * @description
315
+ * Selected datefor inbound calendar.
316
+ */
317
+ get inboundSelectedDate() {
318
+ return this.inboundSelectedDateValue;
319
+ }
320
+ set inboundSelectedDate(date) {
321
+ if (!date) {
322
+ return;
323
+ }
324
+ setTimeout(() => {
325
+ this.inboundSelectedDateValue = date;
326
+ this.inboundSelectedDateChange.emit(date);
327
+ });
328
+ }
329
+ get inboundSelectedMonth() {
330
+ return this.inboundSelectedMonthValue;
331
+ }
332
+ set inboundSelectedMonth(month) {
333
+ if (this.dateService.isSameMonth(month, this.inboundSelectedMonthValue)) {
334
+ return;
335
+ }
336
+ setTimeout(() => {
337
+ this.inboundMonthChange.emit(month);
338
+ this.inboundSelectedMonthValue = month;
339
+ });
340
+ }
341
+ ngOnInit() {
342
+ if (!this.nasFormGroup) {
343
+ return;
344
+ }
345
+ this.nasFormGroup.statusChanges.subscribe(x => {
346
+ setTimeout(() => {
347
+ this.isNasGroupValid = x;
348
+ });
349
+ });
350
+ if (this.nasFormControlNameDirectOnly) {
351
+ const directOnlyControl = this.nasFormGroup.get(this.nasFormControlNameDirectOnly);
352
+ if (directOnlyControl) {
353
+ this.directOnly = directOnlyControl.value;
354
+ }
355
+ }
356
+ if (this.nasFormControlNameTripType) {
357
+ const tripTypeControl = this.nasFormGroup.get(this.nasFormControlNameTripType);
358
+ if (tripTypeControl) {
359
+ this.tripType = tripTypeControl.value;
360
+ this.inboundDisabled = tripTypeControl.value === TripType.oneWay;
361
+ if (this.nasFormControlNameInbound) {
362
+ const inboundControl = this.nasFormGroup.get(this.nasFormControlNameInbound);
363
+ if (inboundControl && this.inboundDisabled) {
364
+ inboundControl.disable();
365
+ }
366
+ }
367
+ tripTypeControl.valueChanges.subscribe((value) => {
368
+ this.inboundDisabled = value === TripType.oneWay;
369
+ });
370
+ }
371
+ }
372
+ }
373
+ ngAfterViewChecked() {
374
+ this.containerWidth.next(this.container.nativeElement.offsetWidth);
375
+ window.onresize = () => {
376
+ this.containerWidth.next(this.container.nativeElement.offsetWidth);
377
+ };
378
+ }
379
+ onSubsidyDiscountInfoClick() {
380
+ this.subsidyDiscountInfoClick.emit();
381
+ }
382
+ onSubsidyDiscountSelectChange(model) {
383
+ if (!this.nasFormGroup || !this.nasFormControlNameSubsidyDiscount) {
384
+ return;
385
+ }
386
+ const subsidyDiscountControl = this.nasFormGroup.get(this.nasFormControlNameSubsidyDiscount);
387
+ subsidyDiscountControl.patchValue(model);
388
+ }
389
+ getClosestAirports(position) {
390
+ this.positionChange.emit(position);
391
+ }
392
+ getFilterClass(element, modifiersInput) {
393
+ let modifiers = modifiersInput || new Array();
394
+ if (typeof modifiersInput === 'string' || modifiersInput instanceof String) {
395
+ modifiers = [modifiersInput];
396
+ }
397
+ const widths = [];
398
+ if (this.deviceHelper.isWidthTablet(this.containerWidth.getValue())) {
399
+ widths.push('md');
400
+ }
401
+ if (this.deviceHelper.isWidthDesktop(this.containerWidth.getValue())) {
402
+ widths.push('lg');
403
+ }
404
+ modifiers = [...modifiers, ...widths];
405
+ return this.getClass(element, modifiers);
406
+ }
407
+ getAirportSelectClass() {
408
+ return this.getClass('airport-select', [
409
+ this.deviceHelper.isWidthDesktop(this.containerWidth.getValue()) && 'lg',
410
+ this.deviceHelper.isWidthTablet(this.containerWidth.getValue()) && 'md',
411
+ this.exists(this.enableDatepickers) && 'no-border'
412
+ ]);
413
+ }
414
+ getSuggestions() {
415
+ const suggestions = Array.from(new Set([
416
+ ...this.latestSearchesOrigin ? this.latestSearchesOrigin.filter(x => x.code !== this.originAirportCode) : [],
417
+ ...this.closestAirports ? this.closestAirports.filter(x => x.code !== this.originAirportCode) : []
418
+ ]));
419
+ return suggestions.slice(0, 3);
420
+ }
421
+ getDatePickersClass() {
422
+ return this.getFilterClass('date-combo', [
423
+ this.exists(this.minimize) && 'minimized',
424
+ this.containerWidth.getValue() > 500 && 'side-by-side'
425
+ ]);
426
+ }
427
+ getTravelDetailsClass(element, modifiersInput) {
428
+ let modifiers = modifiersInput || new Array();
429
+ if (typeof modifiersInput === 'string' || modifiersInput instanceof String) {
430
+ modifiers = [modifiersInput];
431
+ }
432
+ const widths = [
433
+ this.deviceHelper.isWidthTablet(this.containerWidth.getValue()) && 'md',
434
+ this.deviceHelper.isWidthDesktop(this.containerWidth.getValue()) && 'lg'
435
+ ];
436
+ modifiers = [...modifiers, ...widths];
437
+ const travelDetailsBase = new NasComponentBase('travel-details');
438
+ return travelDetailsBase.getClass(element, modifiers);
439
+ }
440
+ onInboundMonthChange(month) { this.inboundMonthChange.emit(month); }
441
+ onOutboundMonthChange(month) { this.outboundMonthChange.emit(month); }
442
+ onPassengersSelectFocusOnPrevious() {
443
+ if (this.isMobileDisplay()) {
444
+ this.onTransitSwitchOpen(true);
445
+ this.focusAsync(this.transitSwitch.toggleElement);
446
+ }
447
+ else if (this.isTabletDisplay()) {
448
+ this.selectPreviousControl();
449
+ }
450
+ }
451
+ passengerKeyDown(event) {
452
+ switch (event.key) {
453
+ case 'Tab':
454
+ if (event.shiftKey) {
455
+ if (this.isMobileDisplay() || this.isTabletDisplay()) {
456
+ break;
457
+ }
458
+ this.focusOnAirportSelectBackwards();
459
+ break;
460
+ }
461
+ if (this.isMobileDisplay()) {
462
+ if (this.subsidyDiscounts && this.subsidyDiscounts.length > 0) {
463
+ this.subsidyDiscount.infoButton.button.nativeElement.focus();
464
+ }
465
+ else {
466
+ this.focusOnNextChange.emit();
467
+ }
468
+ }
469
+ break;
470
+ case 'Enter':
471
+ if (event.shiftKey || this.isMobileDisplay()) {
472
+ break;
473
+ }
474
+ if (document.activeElement === this.passengerSelectDropdown.toggleElement.nativeElement) {
475
+ if (this.passengerSelectDropdown.open) {
476
+ this.onTripSwitchOpen(true);
477
+ this.focusAsync(this.tripSwitch.toggleElement);
478
+ }
479
+ else {
480
+ this.onPassengerSelectOpen(true);
481
+ }
482
+ }
483
+ break;
484
+ case 'Escape':
485
+ this.onPassengerSelectOpen(false);
486
+ event.preventDefault();
487
+ this.setFocusOnNativeElement(this.passengerSelectDropdown.toggleElement);
488
+ break;
489
+ }
490
+ }
491
+ onTripSwitchKeyDown(event) {
492
+ switch (event.key) {
493
+ case 'ArrowRight':
494
+ if (document.activeElement === this.tripTypeRoundTrip.nativeElement) {
495
+ this.tripTypeOneway.nativeElement.focus();
496
+ }
497
+ break;
498
+ case 'ArrowLeft':
499
+ if (document.activeElement === this.tripTypeOneway.nativeElement) {
500
+ this.tripTypeRoundTrip.nativeElement.focus();
501
+ }
502
+ break;
503
+ case 'Tab':
504
+ case 'Enter':
505
+ if (event.shiftKey) {
506
+ event.preventDefault();
507
+ if (this.isMobileDisplay() || !this.passengerSelectDropdown) {
508
+ this.selectPreviousControl();
509
+ }
510
+ else {
511
+ this.onPassengerSelectOpen(true);
512
+ this.focusAsync(this.passengerSelectDropdown.toggleElement);
513
+ }
514
+ }
515
+ else {
516
+ if (event.key === 'Tab') {
517
+ this.onTransitSwitchOpen(true);
518
+ }
519
+ else {
520
+ if (this.tripSwitch.open) {
521
+ this.onTransitSwitchOpen(true);
522
+ this.focusAsync(this.transitSwitch.toggleElement);
523
+ }
524
+ else {
525
+ this.onTripSwitchOpen(true);
526
+ }
527
+ }
528
+ }
529
+ break;
530
+ case 'Escape':
531
+ this.onTripSwitchOpen(false);
532
+ this.setFocusOnNativeElement(this.tripSwitch.toggleElement);
533
+ break;
534
+ }
535
+ }
536
+ transitKeyDown(event) {
537
+ switch (event.key) {
538
+ case 'ArrowRight':
539
+ if (document.activeElement === this.transitTypeTransit.nativeElement) {
540
+ this.transitTypeDirectOnly.nativeElement.focus();
541
+ }
542
+ break;
543
+ case 'ArrowLeft':
544
+ if (document.activeElement === this.transitTypeDirectOnly.nativeElement) {
545
+ this.transitTypeTransit.nativeElement.focus();
546
+ }
547
+ break;
548
+ case 'Tab':
549
+ case 'Enter':
550
+ if (event.shiftKey) {
551
+ event.preventDefault();
552
+ this.onTripSwitchOpen(true);
553
+ this.focusAsync(this.tripSwitch.toggleElement);
554
+ }
555
+ else {
556
+ if (this.isMobileDisplay()) {
557
+ this.onPassengerSelectOpen(true);
558
+ this.focusAsync(this.passengerSelectDropdown.toggleElement);
559
+ }
560
+ else {
561
+ this.onTransitSwitchOpen(!this.transitSwitch.open);
562
+ if (this.subsidyDiscounts && this.subsidyDiscounts.length > 0) {
563
+ this.subsidyDiscount.infoButton.button.nativeElement.focus();
564
+ }
565
+ else {
566
+ this.focusOnNextChange.emit();
567
+ }
568
+ }
569
+ if (event.key === 'Tab') {
570
+ event.preventDefault();
571
+ }
572
+ }
573
+ break;
574
+ case 'Escape':
575
+ this.onTransitSwitchOpen(false);
576
+ event.preventDefault();
577
+ this.setFocusOnNativeElement(this.transitSwitch.toggleElement);
578
+ break;
579
+ }
580
+ }
581
+ onSubsidyDiscountInfoButtonKeydown(event) {
582
+ switch (event.key) {
583
+ case 'Tab':
584
+ if (event.shiftKey) {
585
+ if (this.isMobileDisplay()) {
586
+ this.focusAsync(this.passengerSelectDropdown.toggleElement);
587
+ }
588
+ else {
589
+ this.focusAsync(this.transitSwitch.toggleElement);
590
+ }
591
+ event.preventDefault();
592
+ }
593
+ break;
594
+ default:
595
+ break;
596
+ }
597
+ }
598
+ onPassengersSelectFocusOnNext() {
599
+ if (this.isMobileDisplay()) {
600
+ this.passengerSelectDropdown.toggle();
601
+ }
602
+ else {
603
+ this.onTripSwitchOpen(true);
604
+ this.focusAsync(this.tripSwitch.toggleElement);
605
+ }
606
+ }
607
+ focusAsync(refElement) {
608
+ clearTimeout(this.focusAsyncTimout);
609
+ this.focusAsyncTimout = setTimeout(() => this.setFocusOnNativeElement(refElement));
610
+ }
611
+ onDatepickerFocusOnPrevious(event) {
612
+ event.preventDefault();
613
+ this.focusOnAirportSelectBackwards();
614
+ }
615
+ selectPreviousControl() {
616
+ if (this.datepickerCombo) {
617
+ if (this.datepickerCombo.outboundOnly) {
618
+ this.outboundOpen = true;
619
+ }
620
+ else {
621
+ this.inboundOpen = true;
622
+ }
623
+ }
624
+ else if (this.airportSelect) {
625
+ if (this.exists(this.airportSelect.combo)) {
626
+ this.airportSelect.onDestinationOpen(true);
627
+ if (this.airportSelect.airportSelectDropdownDestination) {
628
+ this.focusAsync(this.airportSelect.airportSelectDropdownDestination.input);
629
+ }
630
+ }
631
+ else {
632
+ this.airportSelect.onOriginOpen(true);
633
+ if (this.airportSelect.airportSelectDropdownOrigin) {
634
+ this.focusAsync(this.airportSelect.airportSelectDropdownOrigin.input);
635
+ }
636
+ }
637
+ }
638
+ }
639
+ onFocusOnNextChange(event) {
640
+ if (this.isMobileDisplay() && this.tripSwitch) {
641
+ this.onTripSwitchOpen(true);
642
+ this.focusAsync(this.tripSwitch.toggleElement);
643
+ }
644
+ else if (this.isTabletDisplay()) {
645
+ if (this.passengerSelectDropdown) {
646
+ event.preventDefault();
647
+ setTimeout(() => {
648
+ this.onPassengerSelectOpen(true);
649
+ this.setFocusOnNativeElement(this.passengerSelectDropdown.toggleElement);
650
+ });
651
+ }
652
+ else if (this.tripSwitch) {
653
+ this.onTripSwitchOpen(true);
654
+ this.focusAsync(this.tripSwitch.toggleElement);
655
+ }
656
+ }
657
+ }
658
+ isMobileDisplay() {
659
+ return this.deviceHelper.isWidthMobile(this.containerWidth.getValue());
660
+ }
661
+ isTabletDisplay() {
662
+ return this.deviceHelper.isWidthTablet(this.containerWidth.getValue());
663
+ }
664
+ onOriginOpen(open) {
665
+ if (this.passengerSelectDropdown) {
666
+ this.passengerSelectDropdown.open = false;
667
+ }
668
+ if (this.tripSwitch) {
669
+ this.tripSwitch.open = false;
670
+ }
671
+ if (this.transitSwitch) {
672
+ this.transitSwitch.open = false;
673
+ }
674
+ if (this.datepickerCombo) {
675
+ this.datepickerCombo.inboundOpen = false;
676
+ this.datepickerCombo.outboundOpen = false;
677
+ }
678
+ if (this.airportSelect && !this.airportSelect.originOpen) {
679
+ this.updateMaximize();
680
+ }
681
+ this.originOpenChange.emit(open);
682
+ this.changeDetector.detectChanges();
683
+ }
684
+ validateAirportValues() {
685
+ if (!this.airportSelect) {
686
+ return false;
687
+ }
688
+ const originSnapshot = this.airportSelect.origin;
689
+ const destinationSnapshot = this.airportSelect.destination;
690
+ if ((originSnapshot && destinationSnapshot && originSnapshot.code && originSnapshot.code.length
691
+ && destinationSnapshot.code && destinationSnapshot.code.length)) {
692
+ return true;
693
+ }
694
+ return false;
695
+ }
696
+ updateMaximize() {
697
+ setTimeout(() => {
698
+ this.maximize = this.validateAirportValues();
699
+ });
700
+ }
701
+ onDestinationOpen(open) {
702
+ if (this.passengerSelectDropdown) {
703
+ this.passengerSelectDropdown.open = false;
704
+ }
705
+ if (this.tripSwitch) {
706
+ this.tripSwitch.open = false;
707
+ }
708
+ if (this.transitSwitch) {
709
+ this.transitSwitch.open = false;
710
+ }
711
+ if (this.datepickerCombo) {
712
+ this.datepickerCombo.inboundOpen = false;
713
+ this.datepickerCombo.outboundOpen = false;
714
+ }
715
+ if (this.airportSelect && !this.airportSelect.destinationOpen) {
716
+ this.updateMaximize();
717
+ }
718
+ this.destinationOpenChange.emit(open);
719
+ }
720
+ onPassengerSelectOpen(open) {
721
+ if (this.airportSelect) {
722
+ this.airportSelect.originOpen = false;
723
+ this.airportSelect.destinationOpen = false;
724
+ }
725
+ if (this.tripSwitch) {
726
+ this.tripSwitch.open = false;
727
+ }
728
+ if (this.transitSwitch) {
729
+ this.transitSwitch.open = false;
730
+ }
731
+ if (this.datepickerCombo) {
732
+ if (this.datepickerCombo.inboundOpen) {
733
+ this.datepickerCombo.inboundOpen = false;
734
+ }
735
+ if (this.datepickerCombo.outboundOpen) {
736
+ this.datepickerCombo.outboundOpen = false;
737
+ }
738
+ }
739
+ this.passengerSelectDropdown.open = open;
740
+ this.passengerSelectOpenChange.emit(open);
741
+ if (open) {
742
+ setTimeout(() => {
743
+ if (this.passengerSelect.numberFields.first) {
744
+ this.passengerSelect.numberFields.first.input.nativeElement.focus();
745
+ }
746
+ }, 300);
747
+ }
748
+ }
749
+ onTripSwitchOpen(open) {
750
+ clearTimeout(this.tripSwitchFocusTimeout);
751
+ if (this.passengerSelectDropdown) {
752
+ setTimeout(() => {
753
+ this.passengerSelectDropdown.open = false;
754
+ });
755
+ }
756
+ if (this.transitSwitch) {
757
+ this.transitSwitch.open = false;
758
+ }
759
+ if (this.airportSelect) {
760
+ this.airportSelect.originOpen = false;
761
+ this.airportSelect.destinationOpen = false;
762
+ }
763
+ if (this.datepickerCombo) {
764
+ this.datepickerCombo.inboundOpen = false;
765
+ this.datepickerCombo.outboundOpen = false;
766
+ }
767
+ this.tripSwitch.open = open;
768
+ if (open) {
769
+ this.tripSwitchFocusTimeout = setTimeout(() => {
770
+ this.tripTypeRoundTrip.nativeElement.focus();
771
+ }, 200);
772
+ }
773
+ }
774
+ onTransitSwitchOpen(open) {
775
+ clearTimeout(this.transitSwitchFocusTimeout);
776
+ if (this.passengerSelectDropdown) {
777
+ this.passengerSelectDropdown.open = false;
778
+ }
779
+ if (this.tripSwitch) {
780
+ this.tripSwitch.open = false;
781
+ }
782
+ if (this.airportSelect) {
783
+ this.airportSelect.originOpen = false;
784
+ this.airportSelect.destinationOpen = false;
785
+ }
786
+ if (this.datepickerCombo) {
787
+ this.datepickerCombo.inboundOpen = false;
788
+ this.datepickerCombo.outboundOpen = false;
789
+ }
790
+ if (this.transitSwitch) {
791
+ this.transitSwitch.open = open;
792
+ }
793
+ if (open) {
794
+ this.transitSwitchFocusTimeout = setTimeout(() => {
795
+ this.transitTypeTransit.nativeElement.focus();
796
+ }, 200);
797
+ }
798
+ }
799
+ onOriginChange(airport) {
800
+ this.originChange.emit(airport);
801
+ }
802
+ setSelectedOriginAirport(airport) {
803
+ if (!airport) {
804
+ return;
805
+ }
806
+ this.onOriginChange(airport);
807
+ if (this.originAirportCode === airport.code) {
808
+ return;
809
+ }
810
+ this.originAirportCode = airport.code;
811
+ this.changeDetector.detectChanges();
812
+ }
813
+ onDestinationChange(airport) {
814
+ this.destinationChange.emit(airport);
815
+ }
816
+ setFocusOnPassengerSelect(event) {
817
+ this.minimize = false;
818
+ if (this.isMobileDisplay()) {
819
+ if (this.datepickerCombo) {
820
+ event.preventDefault();
821
+ this.outboundOpen = true;
822
+ this.focusAsync(this.datepickerCombo.datepickerOutbound.input);
823
+ }
824
+ else if (this.tripSwitch) {
825
+ event.preventDefault();
826
+ this.onTripSwitchOpen(true);
827
+ this.focusAsync(this.tripSwitch.toggleElement);
828
+ }
829
+ }
830
+ else if (this.isTabletDisplay() && this.datepickerCombo) {
831
+ setTimeout(() => {
832
+ this.outboundOpen = true;
833
+ });
834
+ }
835
+ else {
836
+ if (this.passengerSelectDropdown) {
837
+ this.onPassengerSelectOpen(true);
838
+ const currentElementRef = this.passengerSelectDropdown.toggleElement;
839
+ setTimeout(() => this.setFocusOnNativeElement(currentElementRef));
840
+ }
841
+ else if (this.tripSwitch) {
842
+ this.onTripSwitchOpen(true);
843
+ this.tripSwitch.toggleElement.nativeElement.focus();
844
+ }
845
+ }
846
+ }
847
+ setFocusOnNativeElement(element) {
848
+ element.nativeElement.focus();
849
+ }
850
+ onTripTypeChange(tripType) {
851
+ setTimeout(() => {
852
+ this.tripSwitch.open = false;
853
+ });
854
+ this.tripType = tripType;
855
+ if (this.nasFormGroup && this.nasFormControlNameTripType) {
856
+ const tripSwitchControl = this.nasFormGroup.get(this.nasFormControlNameTripType);
857
+ tripSwitchControl.patchValue(tripType);
858
+ }
859
+ }
860
+ onTransitChange(directOnly) {
861
+ setTimeout(() => {
862
+ this.transitSwitch.open = false;
863
+ });
864
+ this.directOnly = directOnly;
865
+ if (this.nasFormGroup && this.nasFormControlNameDirectOnly) {
866
+ const tripTypeControl = this.nasFormGroup.get(this.nasFormControlNameDirectOnly);
867
+ tripTypeControl.patchValue(directOnly);
868
+ }
869
+ }
870
+ getTravelDetailsTripSwitchIconClass(modifiers) {
871
+ const iconMediumBase = new NasComponentBase('icon-medium');
872
+ return [
873
+ iconMediumBase.getClass('', modifiers),
874
+ this.getTravelDetailsClass('icon')
875
+ ];
876
+ }
877
+ getTripSwitchLabel() {
878
+ return this.tripType === TripType.twoWayReturn ? this.tripSwitchRoundTripLabel : this.tripSwitchOneWayLabel;
879
+ }
880
+ getTransitLabel() {
881
+ return this.directOnly ? this.directOnlyLabel : this.directTransitLabel;
882
+ }
883
+ onAccordionToggleChange(expanded) {
884
+ this.displaySummary = !expanded;
885
+ }
886
+ getSummary() {
887
+ return `${this.passengerSelectLabel}${this.defaultSummarySeparator}` +
888
+ `${this.getTripSwitchLabel().toLowerCase()}${this.lastSummarySeparator}${this.getTransitLabel().toLowerCase()}`;
889
+ }
890
+ shouldMaximize() {
891
+ if (!this.exists(this.minimize)) {
892
+ return true;
893
+ }
894
+ else if (this.airportSelect
895
+ && this.airportSelect.origin
896
+ && this.airportSelect.origin.code
897
+ && this.airportSelect.destination
898
+ && this.airportSelect.destination.code) {
899
+ return true;
900
+ }
901
+ else if (this.airportSelect && (this.airportSelect.originOpen || this.airportSelect.destinationOpen)) {
902
+ return this.maximize;
903
+ }
904
+ else if (this.exists(this.minimize)) {
905
+ if (this.maximize) {
906
+ if (this.nasFormGroup) {
907
+ return this.isNasGroupValid;
908
+ }
909
+ return true;
910
+ }
911
+ else {
912
+ return false;
913
+ }
914
+ }
915
+ }
916
+ focusOnAirportSelectBackwards() {
917
+ if (this.exists(this.airportSelect.combo)) {
918
+ this.airportSelect.onDestinationOpen(true);
919
+ setTimeout(() => {
920
+ this.airportSelect.airportSelectDropdownDestination.input.nativeElement.focus();
921
+ }, 100);
922
+ }
923
+ else {
924
+ this.airportSelect.onOriginOpen(true);
925
+ this.focusAsync(this.airportSelect.airportSelectDropdownOrigin.input);
926
+ }
927
+ }
928
+ setLatestSearches(abandonedBasket, airports) {
929
+ if (!abandonedBasket || !airports) {
930
+ return;
931
+ }
932
+ const unique = new Array();
933
+ for (const item of abandonedBasket) {
934
+ if (!unique.some(x => x.destinationCode === item.destinationCode)) {
935
+ unique.push(item);
936
+ }
937
+ }
938
+ const originCodes = unique.map(x => x.originCode);
939
+ const destinationCodes = unique.map(x => x.destinationCode);
940
+ const latestSearchesOrigin = airports.filter(airport => {
941
+ return unique.some(x => x.originCode.toLowerCase() === airport.code.toLowerCase());
942
+ });
943
+ const latestSearchesDestination = airports.filter(airport => {
944
+ return unique.some(x => x.destinationCode.toLowerCase() === airport.code.toLowerCase());
945
+ });
946
+ const code = 'code';
947
+ this.latestSearchesOrigin = this.sortService.sortByObject(latestSearchesOrigin, originCodes, code).slice(0, 3);
948
+ if (this.latestSearchesOrigin && this.latestSearchesOrigin.length > 0 && this.exists(this.overrideOrigin)) {
949
+ this.originAirportCode = this.latestSearchesOrigin[0].code;
950
+ }
951
+ this.latestSearchesDestination = this.sortService.sortByObject(latestSearchesDestination, destinationCodes, code).slice(0, 3);
952
+ }
953
+ closeDropdowns() {
954
+ if (this.passengerSelectDropdown) {
955
+ this.passengerSelectDropdown.open = false;
956
+ }
957
+ if (this.tripSwitch) {
958
+ this.tripSwitch.open = false;
959
+ }
960
+ if (this.transitSwitch) {
961
+ this.transitSwitch.open = false;
962
+ }
963
+ }
964
+ }
965
+ FilterComponent.decorators = [
966
+ { type: Component, args: [{
967
+ selector: 'nas-filter',
968
+ 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 && airportRelations\">\n <nas-airport-select *ngIf=\"airports && airportRelations\"\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-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]=\"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>",
969
+ 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 .nas-filter__date-combo--minimized{transform-origin:center top;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-animation:flip-in .55s ease both;animation:flip-in .55s ease both}.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--minimized{transform-origin:center top;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-animation:flip-in .55s ease both;animation:flip-in .55s ease both}.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__subsidy-discount{order:3}::ng-deep .nas-filter__subsidy-discount .nas-subsidy-discount{margin-top:16px}\n"]
970
+ },] }
971
+ ];
972
+ FilterComponent.ctorParameters = () => [
973
+ { type: DeviceHelper },
974
+ { type: SortService },
975
+ { type: AbandonedBasketService },
976
+ { type: DateHelper },
977
+ { type: ElementRef },
978
+ { type: ChangeDetectorRef }
979
+ ];
980
+ FilterComponent.propDecorators = {
981
+ passengerSelectDropdown: [{ type: ViewChild, args: ['passengerSelectDropdown',] }],
982
+ passengerSelect: [{ type: ViewChild, args: ['passengerSelect',] }],
983
+ tripSwitch: [{ type: ViewChild, args: ['tripSwitch',] }],
984
+ transitSwitch: [{ type: ViewChild, args: ['transitSwitch',] }],
985
+ airportSelect: [{ type: ViewChild, args: ['airportSelect',] }],
986
+ datepickerCombo: [{ type: ViewChild, args: ['datepickerCombo',] }],
987
+ container: [{ type: ViewChild, args: ['container',] }],
988
+ tripTypeOneway: [{ type: ViewChild, args: ['tripTypeOneway',] }],
989
+ tripTypeRoundTrip: [{ type: ViewChild, args: ['tripTypeRoundTrip',] }],
990
+ transitTypeDirectOnly: [{ type: ViewChild, args: ['transitTypeDirectOnly',] }],
991
+ transitTypeTransit: [{ type: ViewChild, args: ['transitTypeTransit',] }],
992
+ subsidyDiscount: [{ type: ViewChild, args: ['subsidyDiscount',] }],
993
+ airportRelations: [{ type: Input }],
994
+ ariaLabelClear: [{ type: Input }],
995
+ ariaLabelSubtract: [{ type: Input }],
996
+ ariaLabelBackdrop: [{ type: Input }],
997
+ ariaLabelAdd: [{ type: Input }],
998
+ allowedOriginAirports: [{ type: Input }],
999
+ allowedDestinationAirports: [{ type: Input }],
1000
+ displayLatestSearches: [{ type: Input }],
1001
+ useSwitch: [{ type: Input }],
1002
+ displayClosestAirports: [{ type: Input }],
1003
+ originAirportCode: [{ type: Input }],
1004
+ destinationAirportCode: [{ type: Input }],
1005
+ passengerSelectLabel: [{ type: Input }],
1006
+ maxPaxCount: [{ type: Input }],
1007
+ passengers: [{ type: Input }],
1008
+ minAdultCount: [{ type: Input }],
1009
+ tripSwitchRoundTripLabel: [{ type: Input }],
1010
+ tripSwitchOneWayLabel: [{ type: Input }],
1011
+ directOnlyLabel: [{ type: Input }],
1012
+ directTransitLabel: [{ type: Input }],
1013
+ minimizeOnMobile: [{ type: Input }],
1014
+ expandedAccordionMobile: [{ type: Input }],
1015
+ defaultSummarySeparator: [{ type: Input }],
1016
+ lastSummarySeparator: [{ type: Input }],
1017
+ passengerSelectTitle: [{ type: Input }],
1018
+ passengerSelectAdultsLabel: [{ type: Input }],
1019
+ passengerSelectChildrenLabel: [{ type: Input }],
1020
+ passengerSelectInfantsLabel: [{ type: Input }],
1021
+ groupBookingLabel: [{ type: Input }],
1022
+ allAirportsLabel: [{ type: Input }],
1023
+ latestSearchesLabel: [{ type: Input }],
1024
+ closestAirportsLabel: [{ type: Input }],
1025
+ selectOriginFirstLabel: [{ type: Input }],
1026
+ labelOrigin: [{ type: Input }],
1027
+ placeholderOrigin: [{ type: Input }],
1028
+ labelDestination: [{ type: Input }],
1029
+ geolocationLabel: [{ type: Input }],
1030
+ geolocationBlockedLabel: [{ type: Input }],
1031
+ placeholderDestination: [{ type: Input }],
1032
+ keepSelection: [{ type: Input }],
1033
+ editSearchTitle: [{ type: Input }],
1034
+ nasFormGroup: [{ type: Input }],
1035
+ nasFormControlNameOrigin: [{ type: Input }],
1036
+ nasFormControlNameDestination: [{ type: Input }],
1037
+ nasFormControlNameTripType: [{ type: Input }],
1038
+ nasFormControlNameDirectOnly: [{ type: Input }],
1039
+ nasFormControlNameOutbound: [{ type: Input }],
1040
+ nasFormControlNameInbound: [{ type: Input }],
1041
+ nasFormControlGroupBooking: [{ type: Input }],
1042
+ nasFormControlNameSubsidyDiscount: [{ type: Input }],
1043
+ overrideOrigin: [{ type: Input }],
1044
+ enableSuggestions: [{ type: Input }],
1045
+ closestAirports: [{ type: Input }],
1046
+ minimize: [{ type: Input }],
1047
+ airports: [{ type: Input }],
1048
+ tripType: [{ type: Input }],
1049
+ directOnly: [{ type: Input }],
1050
+ groupBookingLimit: [{ type: Input }],
1051
+ subsidyDiscounts: [{ type: Input }],
1052
+ selectedSubsidyDiscount: [{ type: Input }],
1053
+ subsidyDiscountLabel: [{ type: Input }],
1054
+ ariaLabelPreviousMonth: [{ type: Input }],
1055
+ ariaLabelNextMonth: [{ type: Input }],
1056
+ originOpenChange: [{ type: Output }],
1057
+ destinationOpenChange: [{ type: Output }],
1058
+ passengerSelectOpenChange: [{ type: Output }],
1059
+ originChange: [{ type: Output }],
1060
+ destinationChange: [{ type: Output }],
1061
+ passengersChange: [{ type: Output }],
1062
+ tripTypeChange: [{ type: Output }],
1063
+ directOnlyChange: [{ type: Output }],
1064
+ noAvailableFlightsLabel: [{ type: Input }],
1065
+ availableFlightsLabel: [{ type: Input }],
1066
+ disablePastSelection: [{ type: Input }],
1067
+ outboundLabel: [{ type: Input }],
1068
+ inboundLabel: [{ type: Input }],
1069
+ availability: [{ type: Input }],
1070
+ outboundAvailableDates: [{ type: Input }],
1071
+ inboundAvailableDates: [{ type: Input }],
1072
+ times: [{ type: Input }],
1073
+ dateDisplayFormat: [{ type: Input }],
1074
+ timeDisplayFormat: [{ type: Input }],
1075
+ locale: [{ type: Input }],
1076
+ compact: [{ type: Input }],
1077
+ outboundDisabled: [{ type: Input }],
1078
+ inboundDisabled: [{ type: Input }],
1079
+ enableDatepickers: [{ type: Input }],
1080
+ minimizingLabel: [{ type: Input }],
1081
+ maximizingLabel: [{ type: Input }],
1082
+ directOnlyMobileLabel: [{ type: Input }],
1083
+ orLabel: [{ type: Input }],
1084
+ invalidDestinationText: [{ type: Input }],
1085
+ outboundSelectedDate: [{ type: Input }],
1086
+ inboundSelectedDate: [{ type: Input }],
1087
+ enablePassengersSelect: [{ type: Input }],
1088
+ enableTripSwitch: [{ type: Input }],
1089
+ enableTransitSwitch: [{ type: Input }],
1090
+ outboundSelectedDateChange: [{ type: Output }],
1091
+ inboundSelectedDateChange: [{ type: Output }],
1092
+ outboundOpenChange: [{ type: Output }],
1093
+ inboundOpenChange: [{ type: Output }],
1094
+ outboundMonthChange: [{ type: Output }],
1095
+ inboundMonthChange: [{ type: Output }],
1096
+ focusOnNextChange: [{ type: Output }],
1097
+ positionChange: [{ type: Output }],
1098
+ subsidyDiscountInfoClick: [{ type: Output }]
1099
+ };
1100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUl0RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUN2RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQVVwRTs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxnQkFBZ0I7SUErMUJuRCxZQUNTLFlBQTBCLEVBQ3pCLFdBQXdCLEVBQ3hCLHNCQUE4QyxFQUM5QyxXQUF1QixFQUN4QixVQUFzQixFQUNyQixjQUFpQztRQUN6QyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFOYixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3hCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFD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QUFLO2dDQU1MLEtBQUs7OEJBT0wsS0FBSzs4QkFPTCxLQUFLO29DQU9MLEtBQUs7c0JBTUwsS0FBSztxQ0FNTCxLQUFLO21DQU1MLEtBQUs7a0NBbUJMLEtBQUs7cUNBbUJMLEtBQUs7K0JBTUwsS0FBSztrQ0FNTCxLQUFLO3lDQU1MLE1BQU07d0NBTU4sTUFBTTtpQ0FPTixNQUFNO2dDQU1OLE1BQU07a0NBTU4sTUFBTTtpQ0FNTixNQUFNO2dDQU1OLE1BQU07NkJBTU4sTUFBTTt1Q0FNTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IE5vcndlZ2lhbiBBaXIgU2h1dHRsZS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUcmlwVHlwZSB9IGZyb20gJy4vZW51bXMvdHJpcC10eXBlLmVudW0nO1xuaW1wb3J0IHsgTmFzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZS9uYXMtY29tcG9uZW50LmJhc2UnO1xuaW1wb3J0IHsgQWJhbmRvbmVkQmFza2V0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvYWJhbmRvbmVkLWJhc2tldC1pdGVtLm1vZGVsJztcbmltcG9ydCB7IENsYXNzTW9kZWwgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9jbGFzcy5tb2RlbCc7XG5pbXBvcnQgeyBVdGNEYXRlIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvdXRjLWRhdGUubW9kZWwnO1xuaW1wb3J0IHsgQWJhbmRvbmVkQmFza2V0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvYWJhbmRvbmVkLWJhc2tldC9hYmFuZG9uZWQtYmFza2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZUhlbHBlciB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvZGF0ZS9kYXRlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IERldmljZUhlbHBlciB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvZGV2aWNlL2RldmljZS1oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvc29ydC9zb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWlycG9ydFNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL2FpcnBvcnQtc2VsZWN0L2FpcnBvcnQtc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBaXJwb3J0TW9kZWwgfSBmcm9tICcuLi9haXJwb3J0LXNlbGVjdC9tb2RlbHMvYWlycG9ydC5tb2RlbCc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQ29tYm9Db21wb25lbnQgfSBmcm9tICcuLi9kYXRlcGlja2VyLWNvbWJvL2RhdGVwaWNrZXItY29tYm8uY29tcG9uZW50JztcbmltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IFBhc3NlbmdlcnNNb2RlbCB9IGZyb20gJy4uL3Bhc3Nlbmdlci1zZWxlY3QvbW9kZWxzL3Bhc3NlbmdlcnMubW9kZWwnO1xuaW1wb3J0IHsgU3Vic2lkeURpc2NvdW50TW9kZWwgfSBmcm9tICcuLi9zdWJzaWR5LWRpc2NvdW50L21vZGVscy9zdWJzaWR5LWRpc2NvdW50Lm1vZGVsJztcbmltcG9ydCB7IFBhc3NlbmdlclNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL3Bhc3Nlbmdlci1zZWxlY3QvcGFzc2VuZ2VyLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2lkeURpc2NvdW50Q29tcG9uZW50IH0gZnJvbSAnLi4vc3Vic2lkeS1kaXNjb3VudC9zdWJzaWR5LWRpc2NvdW50LmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBOb3J3ZWdpYW4gRmlsdGVyIENvbXBvbmVudCB8IEZ1bmN0aW9uYWxcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmFzLWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWx0ZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJDb21wb25lbnQgZXh0ZW5kcyBOYXNDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkIHtcbiAgQFZpZXdDaGlsZCgncGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24nKSBwYXNzZW5nZXJTZWxlY3REcm9wZG93bjogRHJvcGRvd25Db21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3Bhc3NlbmdlclNlbGVjdCcpIHBhc3NlbmdlclNlbGVjdDogUGFzc2VuZ2VyU2VsZWN0Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCd0cmlwU3dpdGNoJykgdHJpcFN3aXRjaDogRHJvcGRvd25Db21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyYW5zaXRTd2l0Y2gnKSB0cmFuc2l0U3dpdGNoOiBEcm9wZG93bkNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnYWlycG9ydFNlbGVjdCcpIGFpcnBvcnRTZWxlY3Q6IEFpcnBvcnRTZWxlY3RDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2RhdGVwaWNrZXJDb21ibycpIGRhdGVwaWNrZXJDb21ibzogRGF0ZXBpY2tlckNvbWJvQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RyaXBUeXBlT25ld2F5JykgdHJpcFR5cGVPbmV3YXk6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RyaXBUeXBlUm91bmRUcmlwJykgdHJpcFR5cGVSb3VuZFRyaXA6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RyYW5zaXRUeXBlRGlyZWN0T25seScpIHRyYW5zaXRUeXBlRGlyZWN0T25seTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJhbnNpdFR5cGVUcmFuc2l0JykgdHJhbnNpdFR5cGVUcmFuc2l0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzdWJzaWR5RGlzY291bnQnKSBzdWJzaWR5RGlzY291bnQ6IFN1YnNpZHlEaXNjb3VudENvbXBvbmVudDtcblxuICBsYXRlc3RTZWFyY2hlc09yaWdpbjogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgbGF0ZXN0U2VhcmNoZXNEZXN0aW5hdGlvbjogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgZGlzcGxheVN1bW1hcnkgPSB0cnVlO1xuICBuYXRpdmVFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgaW5ib3VuZExvd2VyTGltaXREYXRlOiBVdGNEYXRlO1xuICBjb250YWluZXJXaWR0aCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgbWF4aW1pemUgPSBmYWxzZTtcbiAgaXNOYXNHcm91cFZhbGlkID0gZmFsc2U7XG5cbiAgZ2V0IG91dGJvdW5kT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vdXRib3VuZE9wZW5WYWx1ZTtcbiAgfVxuICBzZXQgb3V0Ym91bmRPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMub3V0Ym91bmRPcGVuVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd25zKCk7XG5cbiAgICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub3V0Ym91bmRPcGVuVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm91dGJvdW5kT3BlbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBpbmJvdW5kT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbmJvdW5kT3BlblZhbHVlO1xuICB9XG4gIHNldCBpbmJvdW5kT3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmluYm91bmRPcGVuVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd25zKCk7XG5cbiAgICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLmluYm91bmRPcGVuVGltZW91dCk7XG5cbiAgICB0aGlzLmluYm91bmRPcGVuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pbmJvdW5kT3BlblZhbHVlID0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICB0aGlzLmluYm91bmRPcGVuQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmJvdW5kT3BlblRpbWVvdXQ6IGFueTtcblxuICAvKipcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHJlY29yZCBjb250YWluaW5nIGtleXMgd2l0aCBhbGwgYWlycG9ydCBjb2RlcyB3aXRoIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgYWlycG9ydCBjb2RlcyBjb25uZWN0ZWQgdG8gdGhlIGtleS5cbiAgICovXG4gIEBJbnB1dCgpIGFpcnBvcnRSZWxhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEFycmF5PHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQWRkcyAnYXJpYS1sYWJlbCcgb24gdGhlIGNsZWFyIGJ1dHRvbiBpbnNpZGUgdGhlIGFpcnBvcnQgc2VsZWN0IGlucHV0cy5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbENsZWFyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBUklBIGxhYmVsIGZvciB0aGUgc3VidHJhY3QgYnV0dG9ucy5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbFN1YnRyYWN0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBZGRzICdhcmlhLWxhYmVsJyB0byB0aGUgYmFja2Ryb3BzLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsQmFja2Ryb3A6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFSSUEgbGFiZWwgZm9yIHRoZSBhZGQgYnV0dG9ucy5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbEFkZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsaXN0IG9mIGFpcnBvcnRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JpZ2luIGRyb3Bkb3duLlxuICAgKiBJZiBub3QgaW5jbHVkZWQsIGFsbCBhaXJwb3J0cyB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICovXG4gIEBJbnB1dCgpIGFsbG93ZWRPcmlnaW5BaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGFycmF5IG9mIGFpcnBvcnRzIHRoYXQgYXJlIHJlc3RyaWN0ZWQgZm9yIGRlc3RpbmF0aW9uIGFpcnBvcnRzLiBJdCB3aWxsIGRlZmF1bHQgdG8gYWlycG9ydHMgaWYgbm90IHNldC5cbiAgICovXG4gIEBJbnB1dCgpIGFsbG93ZWREZXN0aW5hdGlvbkFpcnBvcnRzOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBib29sZWFuIGluZGljYXRpbmcgaWYgYWlycG9ydHMgdGhhdCB0aGUgdXNlciBhbGxyZWFkeSBoYXMgc2VhcmggZm9yIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5TGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEaXNwbGF5IHN3aXRjaCBVSSB0byBpbnRlcmNoYW5nZSBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIGFpcnBvcnQuXG4gICAqL1xuICBASW5wdXQoKSB1c2VTd2l0Y2g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBib29sZWFuIGluZGljYXRpbmcgaWYgYWlycG9ydHMgdGhhdCBhcmUgY2xvc2UgdG8gdGhlIHVzZXIgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlDbG9zZXN0QWlycG9ydHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgYWlycG9ydCBjb2RlIG9mIHRoZSBvcmlnaW4gYWlycG9ydC4gSXQgd2lsbCBzZXQgdGhlIHNlbGVjdGVkIG9yaWdpbiBhaXJwb3J0IGJhc2VkIG9uIHRoaXMgdmFsdWUuXG4gICAqL1xuICBASW5wdXQoKSBvcmlnaW5BaXJwb3J0Q29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIGFpcnBvcnQgY29kZSBvZiB0aGUgZGVzdGluYXRpb24gYWlycG9ydC4gSXQgd2lsbCBzZXQgdGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uIGFpcnBvcnQgYmFzZWQgb24gdGhpcyB2YWx1ZS5cbiAgICovXG4gIEBJbnB1dCgpIGRlc3RpbmF0aW9uQWlycG9ydENvZGU6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgcGFzc2VuZ2VyU2VsZWN0TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSB0b3RhbCBtYXhpbXVtIGFtb3VudCBvZiBwYXNzZW5nZXJzIGluIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgbWF4UGF4Q291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGFycmF5IG9mIGRpZmZlcmVudCBwYXNzZW5nZXIgdHlwZXMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBwYXNzZW5nZXJzKCk6IEFycmF5PFBhc3NlbmdlcnNNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLnBhc3NlbmdlcnNWYWx1ZTtcbiAgfVxuICBzZXQgcGFzc2VuZ2Vycyh2YWx1ZTogQXJyYXk8UGFzc2VuZ2Vyc01vZGVsPikge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBhc3NlbmdlcnNWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMucGFzc2VuZ2Vyc0NoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIGFkdWx0cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIG1pbkFkdWx0Q291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIHJvdW5kIHRyaXAgc2VsZWN0aW9uIGluIHRoZSB0cmlwIHN3aXRjaCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHRyaXBTd2l0Y2hSb3VuZFRyaXBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3Igb25lIHdheSBzZWxlY3Rpb24gaW4gdGhlIHRyaXAgc3dpdGNoIGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgdHJpcFN3aXRjaE9uZVdheUxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciBkaXJlY3Qgb25seSBzZWxlY3Rpb24gaW4gdGhlIHRyYW5zaXQgc3dpdGNoIGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0T25seUxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciBib3RoIGRpcmVjdCBhbmQgdHJhbnNpdCBzZWxlY3Rpb24gaW4gdGhlIHRyYW5zaXQgc3dpdGNoIGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0VHJhbnNpdExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGZpbHRlciBzaG91bGQgYmUgbWluaW1pemVkIG9uIG1vYmlsZSBzY3JlZW4gc2l6ZXMuXG4gICAqL1xuICBASW5wdXQoKSBtaW5pbWl6ZU9uTW9iaWxlPzogYm9vbGVhbjtcblxuIC8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbmRpY2F0ZXMgaWYgdGhlIGVkaXQgc2VhcmNoIG9mIGFjY29yZGlvbiBzaG91bGQgYmUgZXhwZW5kZWQgb24gbW9iaWxlIHNjcmVlbiBzaXplcy5cbiAqL1xuICBASW5wdXQoKVxuICBnZXQgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZTtcbiAgfVxuICBzZXQgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHNlcGFyYXRvciBmb3IgdGhlIGZpbHRlciBzdW1tYXJ5IHRoYXQgaXMgZGlzcGF5ZWQgaWYgbWluaW1pemVPbk1vYmlsZSBpcyB0cnVlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKiAxIHRyYXZlbGxlciwgcm91bmQgdHJpcCBhbmQgZGlyZWN0L3RyYW5zaXRcbiAgICovXG4gIEBJbnB1dCgpIGRlZmF1bHRTdW1tYXJ5U2VwYXJhdG9yID0gJyc7XG5cbiAgLyoqXG4gICAqIEEgc2VwYXJhdG9yIGZvciB0aGUgZmlsdGVyIHN1bW1hcnkgaXMgYXJlIGRpc3BheWVkIGlmIG1pbmltaXplT25Nb2JpbGUgaXMgdHJ1ZS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICogMSB0cmF2ZWxsZXIsIHJvdW5kIHRyaXAgYW5kIGRpcmVjdC90cmFuc2l0XG4gICAqL1xuICBASW5wdXQoKSBsYXN0U3VtbWFyeVNlcGFyYXRvciA9ICcnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSB0aXRsZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RUaXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIGFkdWx0cyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdEFkdWx0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciB0aGUgY2hpbGRyZW4gcGFzc2VuZ2VyIHR5cGUgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RDaGlsZHJlbkxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciB0aGUgaW5mYW50cyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdEluZmFudHNMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIHdoZW4gdG90YWwgbnVtYmVyIG9mIHNlbGVjdGVkIHBhc3NlbmdlcnMgZXhjZWVkcyB0aGUgZ3JvdXAgYm9va2luZyBsaW1pdFxuICAgKi9cbiAgQElucHV0KCkgZ3JvdXBCb29raW5nTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBvbiB0b3Agb2YgYWxsIGFpcnBvcnRzIGluIHRoZSBhaXJwb3J0IHNlbGVjdCBkcm9wIGRvd24gbGlzdHMuXG4gICAqL1xuICBASW5wdXQoKSBhbGxBaXJwb3J0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgb24gdG9wIG9mIHRoZSBsYXRlc3Qgc2VhcmNoZXMgaW4gdGhlIGFpcnBvcnQgc2VsZWN0IGRyb3AgZG93biBsaXN0cy5cbiAgICovXG4gIEBJbnB1dCgpIGxhdGVzdFNlYXJjaGVzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNsb3Nlc3QgYWlycG9ydHMgaW4gdGhlIGFpcnBvcnQgc2VsZWN0IGRyb3AgZG93biBsaXN0cy5cbiAgICovXG4gIEBJbnB1dCgpIGNsb3Nlc3RBaXJwb3J0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgaW4gdGhlIGRlc3RpbmF0aW9uIGlucHV0IGZpZWxkIGluIHRoZSBhaXJwb3J0IHNlbGVjdCwgaWYgdGhlXG4gICAqIHVzZXIgdHJpZXMgdG8gc2VsZWN0IGEgZGVzdGluYXRpb24gYWlycG9ydCB3aXRob3V0IHNlbGVjdGluZyBhbiBvcmlnaW4gYWlycG9ydC5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdE9yaWdpbkZpcnN0TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgb24gdG9wIG9mIHRoZSBvcmlnaW4gYWlycG9ydCBpbnB1dCBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsT3JpZ2luOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHBsYWNlaG9sZGVyIHRoYXQgd2lsbCBhcHBlYXIgb24gdGhlIG9yaWdpbiBhaXJwb3J0IGlucHV0IGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXJPcmlnaW4gPSAnJztcblxuICAvKipcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgb24gdG9wIG9mIHRoZSBkZXN0aW5hdGlvbiBhaXJwb3J0IGlucHV0IGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWxEZXN0aW5hdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIGluIG15IGxvY2F0aW9uIGluIHRoZSBkcm9wIGRvd24gbGlzdCBpbiBhaXJwb3J0IHNlbGVjdC5cbiAgICovXG4gIEBJbnB1dCgpIGdlb2xvY2F0aW9uTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBpbiBteSBsb2NhdGlvbiwgaW4gdGhlIGRyb3AgZG93biBsaXN0IGluIGFpcnBvcnQgc2VsZWN0IGlmIHVzZXIgaGFzIGRlbmllZCBnZW9sb2NhdGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIGdlb2xvY2F0aW9uQmxvY2tlZExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHBsYWNlaG9sZGVyIHRoYXQgd2lsbCBhcHBlYXIgb24gdGhlIGRlc3RpbmF0aW9uIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlckRlc3RpbmF0aW9uID0gJyc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIG1vZGlmaWVyIHRoYXQgd2lsbCBhbGxvdyBhbHdheXMga2VlcGluZyB0aGUgc2VsZWN0ZWQgYWlycG9ydC5cbiAgICogVGhlIGxhc3Qgc2VsZWN0ZWQgYWlycG9ydCB3aWxsIGJlIHNob3duIG9uY2UgdXNlciBjbGVhcnMgdGhlIHNlbGVjdGlvbiBhbmQgYmx1ci5cbiAgICovXG4gIEBJbnB1dCgpIGtlZXBTZWxlY3Rpb246IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHRpdGxlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBlZGl0IHNlYXJjaCBhY2NvcmRpb24uXG4gICAqL1xuICBASW5wdXQoKSBlZGl0U2VhcmNoVGl0bGU6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFkZHMgdGhlIHBhcmVudCdzIGZvcm0gZ3JvdXAuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IGlzIHJlcXVpZXJlZCB0byBiZSBmaWxsZWQgaWYgbmFzRm9ybUNvbnRyb2xOYW1lIGFkZGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVPcmlnaW46IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZURlc3RpbmF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVUcmlwVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lT3V0Ym91bmQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZUluYm91bmQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sR3JvdXBCb29raW5nOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVTdWJzaWR5RGlzY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE1ha2UgbGF0ZXN0IHNlYXJjaGVzIGFuZCBnZW9sb2NhdGlvbiBvdmVycmlkZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBvcmlnaW4gYWlycG9ydCBzZWxlY3Rvci5cbiAgICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlT3JpZ2luPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgd2lsbCBtYWtlIHRoZSBmaWx0ZXIgZGlzcGxheSBzdWdnZXN0ZWQgYWlycG9ydHMgYmFzZWQgb24gZ2VvbG9jYXRpb24gYW5kIGxhdGVzdCBzZWFyY2hlcy5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZVN1Z2dlc3Rpb25zPzogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBnZXQgY2xvc2VzdEFpcnBvcnRzKCkge1xuICAgIHJldHVybiB0aGlzLmNsb3Nlc3RBaXJwb3J0c1ZhbHVlO1xuICB9XG4gIHNldCBjbG9zZXN0QWlycG9ydHMoYWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD4pIHtcbiAgICBpZiAoIWFpcnBvcnRzIHx8IGFpcnBvcnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3Nlc3RBaXJwb3J0c1ZhbHVlID0gYWlycG9ydHM7XG5cbiAgICBpZiAodGhpcy5leGlzdHModGhpcy5vdmVycmlkZU9yaWdpbikpIHtcbiAgICAgIHRoaXMub3JpZ2luQWlycG9ydENvZGUgPSBhaXJwb3J0c1swXS5jb2RlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgb25seSBkaXNwbGF5IGFpcnBvcnQgc2VsZWN0aW9uLiBXaGVuIGEgY2l0eSBwYWlyIGlzIHNlbGVjdGVkLCB0aGUgcmVzdCBvZiB0aGUgZmlsdGVyIHdpbGwgYmUgdmlzaWJsZS5cbiAgICovXG4gIEBJbnB1dCgpIG1pbmltaXplPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbGwgYWlycG9ydHMgdGhhdCB3aWxsIGJlIHBvcHVsYXRlZCBpbnRvIHRoZSBkcm9wZG93biBsaXN0cy5cbiAgICogSWYgZGlzcGxheUxhdGVzdFNlYXJjaGVzIGlzIHRydWUsIGl0IHdpbGwgdHJ5IHRvIGdldCB0aGUgbGF0ZXN0IHNlYXJjaGVzIGZyb20gdGhlIGFiYW5kb25lZCBiYXNrZXQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgYWlycG9ydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWlycG9ydHNWYWx1ZTtcbiAgfVxuICBzZXQgYWlycG9ydHMoYWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD4pIHtcbiAgICB0aGlzLmFpcnBvcnRzVmFsdWUgPSBhaXJwb3J0cztcblxuICAgIGlmICh0aGlzLmV4aXN0cyh0aGlzLmRpc3BsYXlMYXRlc3RTZWFyY2hlcykpIHtcbiAgICAgIGNvbnN0IGFiYW5kb25lZEJhc2tldCA9IHRoaXMuYWJhbmRvbmVkQmFza2V0U2VydmljZS5nZXRBbGwoKTtcbiAgICAgIHRoaXMuc2V0TGF0ZXN0U2VhcmNoZXMoYWJhbmRvbmVkQmFza2V0LCB0aGlzLmFpcnBvcnRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYW5kIGdldHMgdGhlIHNlbGVjdGVkIHRyaXAgdHlwZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB0cmlwVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmlwVHlwZVZhbHVlO1xuICB9XG4gIHNldCB0cmlwVHlwZSh0cmlwVHlwZTogVHJpcFR5cGUpIHtcbiAgICBpZiAodHJpcFR5cGUgPT09IHRoaXMudHJpcFR5cGVWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudHJpcFR5cGVWYWx1ZSA9IHRyaXBUeXBlO1xuICAgIHRoaXMudHJpcFR5cGVDaGFuZ2UuZW1pdCh0aGlzLnRyaXBUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB3aGV0aGVyIHRoZSBzZWxlY3RlZCB0cmFuc2l0IHR5cGUgaXMgZGlyZWN0IG9ubHkgb3Igbm90LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpcmVjdE9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0T25seVZhbHVlO1xuICB9XG4gIHNldCBkaXJlY3RPbmx5KGRpcmVjdE9ubHk6IGJvb2xlYW4pIHtcbiAgICBpZiAoZGlyZWN0T25seSA9PT0gdGhpcy5kaXJlY3RPbmx5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpcmVjdE9ubHlWYWx1ZSA9IGRpcmVjdE9ubHk7XG4gICAgdGhpcy5kaXJlY3RPbmx5Q2hhbmdlLmVtaXQodGhpcy5kaXJlY3RPbmx5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIGxpbWl0IGZvciB3aGVuIHRoZSB0b3RhbCBhbW91bnQgb2YgcGFzc2VuZ2VycyBleGNlZWRzIHRvIGJlIGEgZ3JvdXAgYm9va2luZy5cbiAgICovXG4gIEBJbnB1dCgpIGdyb3VwQm9va2luZ0xpbWl0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTdWJzaWR5IGRpc2NvdW50c1xuICAgKi9cbiAgQElucHV0KCkgc3Vic2lkeURpc2NvdW50czogQXJyYXk8U3Vic2lkeURpc2NvdW50TW9kZWw+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2VsZWN0ZWQgc3Vic2lkeSBkaXNjb3VudFxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRTdWJzaWR5RGlzY291bnQ6IFN1YnNpZHlEaXNjb3VudE1vZGVsO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU3Vic2lkeSBkaXNjb3VudCBsYWJlbFxuICAgKi9cbiAgQElucHV0KCkgc3Vic2lkeURpc2NvdW50TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFSSUEgbGFiZWwgZm9yIHRoZSBwcmV2aW91cyBtb250aCBidXR0b24gaW4gdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsUHJldmlvdXNNb250aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQVJJQSBsYWJlbCBmb3IgdGhlIG5leHQgbW9udGggYnV0dG9uIGluIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbE5leHRNb250aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBvcmlnaW4gZHJvcGRvd24gc2VsZWN0b3Igb3BlbnMgb3IgY2xvc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIG9yaWdpbk9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICogQGRlc2NyaXB0aW9uXG4gICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBvcmlnaW4gZHJvcGRvd24gc2VsZWN0b3Igb3BlbnMgb3IgY2xvc2VzLlxuICAqL1xuICBAT3V0cHV0KCkgZGVzdGluYXRpb25PcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duIG9wZW5zIG9yIGNsb3Nlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBwYXNzZW5nZXJTZWxlY3RPcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBzZWxlY3RlZCBvcmlnaW4gYWlycG9ydCBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIG9yaWdpbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QWlycG9ydE1vZGVsPigpO1xuXG4gIC8qKlxuICAqIEBkZXNjcmlwdGlvblxuICAqIEFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24gYWlycG9ydCBjaGFuZ2VzLlxuICAqL1xuICBAT3V0cHV0KCkgZGVzdGluYXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFpcnBvcnRNb2RlbD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSBhIHBhc3NlbmdlciBzZWxlY3Rpb24gY2hhbmdlIGlzIHBlcmZvcm1lZC5cbiAgICovXG4gIEBPdXRwdXQoKSBwYXNzZW5nZXJzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxQYXNzZW5nZXJzTW9kZWw+PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB0aGUgc2VsZWN0ZWQgdHJpcCB0eXBlLlxuICAgKi9cbiAgQE91dHB1dCgpIHRyaXBUeXBlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUcmlwVHlwZT4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYW5kIGdldHMgd2hldGhlciB0aGUgc2VsZWN0ZWQgdHJhbnNpdCB0eXBlIGlzIGRpcmVjdCBvbmx5IG9yIG5vdC5cbiAgICovXG4gIEBPdXRwdXQoKSBkaXJlY3RPbmx5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIG5vIGF2YWlsYWJsZSBmbGlnaHRzLlxuICAgKi9cbiAgQElucHV0KCkgbm9BdmFpbGFibGVGbGlnaHRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciBhdmFpbGFibGUgZmxpZ2h0cy5cbiAgICovXG4gIEBJbnB1dCgpIGF2YWlsYWJsZUZsaWdodHNMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRGlzYWJsZSBwb3NzaWJpbGl0eSB0byBzZWxlY3QgZGF0ZXMgaW4gdGhlIHBhc3QuXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlUGFzdFNlbGVjdGlvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciBvdXRib3VuZCBkYXRlcGlja2VyLlxuICAgKi9cbiAgQElucHV0KCkgb3V0Ym91bmRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIGluYm91bmQgZGF0ZXBpY2tlci5cbiAgICovXG4gIEBJbnB1dCgpIGluYm91bmRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyB0aGUgZGF0ZXBpY2tlcnMgaW4gYXZhaWxhYmlsaXR5IG1vZGUgd2hlcmUgYXZhaWxhYmxlIGRhdGVzIGNhbiBiZSBhZGRlZC5cbiAgICovXG4gIEBJbnB1dCgpIGF2YWlsYWJpbGl0eTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEF2YWlsYWJsZSBkYXRlcyBmb3Igb3V0Ym91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBvdXRib3VuZEF2YWlsYWJsZURhdGVzOiBBcnJheTxVdGNEYXRlPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEF2YWlsYWJsZSBkYXRlcyBmb3IgaW5ib3VuZCBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIGluYm91bmRBdmFpbGFibGVEYXRlczogQXJyYXk8VXRjRGF0ZT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJZiBzZXQsIEVuYWJsZXMgdGhlIHRpbWUgZHJvcGRvd24gc2VsZWN0b3IgYWxvbmdzaWRlIGRhdGVwaWNrZXIuXG4gICAqL1xuICBASW5wdXQoKSB0aW1lczogQXJyYXk8VXRjRGF0ZT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgZGlzcGxheSBmb3JtYXQgb2YgdGhlIGRhdGUgd2hlbiB1c2VyIGhhcyBzZWxlY3RlZCB0aGUgZGF0ZSBhbmQgaXQgaXMgYmVpbmcgc2hvd24gaW4gdGhlIGlucHV0IGJveCBmb3IgdGhlIGRhdGUgcGlja2VyLlxuICAgKiBQbGVhc2UgbG9vayBhdCB0aGUgYW5ndWxhciBEYXRlIHBpcGUgZm9yIHZhbGlkIGZvcm1hdHMgYW5kIHZhcmlhdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKSBkYXRlRGlzcGxheUZvcm1hdCA9ICdFRUVFIGQsIE1NTU0geXl5eSc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgdGltZSBkaXNwbGF5IGZvcm1hdC5cbiAgICovXG4gIEBJbnB1dCgpIHRpbWVEaXNwbGF5Rm9ybWF0ID0gJ0hIOm1tJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4gV2hlbiBub3Qgc3VwcGxpZWQsIHVzZXMgdGhlIHZhbHVlIG9mIExPQ0FMRV9JRCwgd2hpY2ggaXMgZW4tVVMgYnkgZGVmYXVsdC5cbiAgICogVGhpcyByZXF1aXJlcyB0aGF0IHJlZ2lzdGVyTG9jYWxlRGF0YSBpcyBjYWxsZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBsb2NhbGUuXG4gICAqL1xuICBASW5wdXQoKSBsb2NhbGUgPSAnZW4tR0InO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBtb2RpZmllciB0byByZW1vdmUgdGhlIHBhZGRpbmcgYW5kIG1hcmdpbnMgYXJvdW5kIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgY29tcGFjdDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIERpc2FibGUgcG9zc2liaWxpdHkgdG8gc2VsZWN0IG91dGJvdW5kIGRhdGVzLlxuICAgKi9cbiAgQElucHV0KCkgb3V0Ym91bmREaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIERpc2FibGUgcG9zc2liaWxpdHkgdG8gc2VsZWN0IGluYm91bmQgZGF0ZXMuXG4gICAqL1xuICBASW5wdXQoKSBpbmJvdW5kRGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTaG93L0FkZCBkYXRlIHBpY2tlciBjb21ibyBpbnRvIHRoZSBmaWx0ZXIgaWYgc2V0IHRvIHRydWUuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVEYXRlcGlja2VyczogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgdGhlIHRvZ2dsZSBpY29uIGZvciBtaW5pbWl6aW5nIGZpbHRlci5cbiAgICovXG4gIEBJbnB1dCgpIG1pbmltaXppbmdMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciB0aGUgdG9nZ2xlIGljb24gZm9yIG1heGltaXppbmcgZmlsdGVyLlxuICAgKi9cbiAgQElucHV0KCkgbWF4aW1pemluZ0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIHRoZSB0b2dnbGluZyB0cmFuc2l0IHR5cGUgd2hlbiBmaWx0ZXIgaXMgbWluaW1pemVkLlxuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0T25seU1vYmlsZUxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgJ29yJyBpbiB0aGUgc3VnZ2VzdGlvbmVkIGFpcnBvcnRzLlxuICAgKi9cbiAgQElucHV0KCkgb3JMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSB0ZXh0IHRoYXQgYXBwZWFycyBpbiB0aGUgZGVzdGluYXRpb25zIGRyb3Bkb3duIGxpc3Qgd2hlbiBvcmlnaW4gYWlycG9ydCBpcyBub3Qgc2V0LlxuICAgKi9cbiAgQElucHV0KCkgaW52YWxpZERlc3RpbmF0aW9uVGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2VsZWN0ZWQgZGF0ZWZvciBvdXRib3VuZCBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBvdXRib3VuZFNlbGVjdGVkRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vdXRib3VuZFNlbGVjdGVkRGF0ZVZhbHVlO1xuICB9XG4gIHNldCBvdXRib3VuZFNlbGVjdGVkRGF0ZShkYXRlOiBVdGNEYXRlKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm91dGJvdW5kU2VsZWN0ZWREYXRlVmFsdWUgPSBkYXRlO1xuICAgICAgdGhpcy5vdXRib3VuZFNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZWxlY3RlZCBkYXRlZm9yIGluYm91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaW5ib3VuZFNlbGVjdGVkRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmJvdW5kU2VsZWN0ZWREYXRlVmFsdWU7XG4gIH1cbiAgc2V0IGluYm91bmRTZWxlY3RlZERhdGUoZGF0ZTogVXRjRGF0ZSkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pbmJvdW5kU2VsZWN0ZWREYXRlVmFsdWUgPSBkYXRlO1xuICAgICAgdGhpcy5pbmJvdW5kU2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdpbGwgZGlzcGxheSBwYXNzZW5nZXIgc2VsZWN0LCBzZXQgdGhpcyB0byBmYWxzZSB0byByZW1vdmUgaXQuIEl0J3MgdHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlUGFzc2VuZ2Vyc1NlbGVjdCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaWxsIGRpc3BsYXkgdGhlIHRyaXAgc3dpdGNoLCBzZXQgdGhpcyB0byBmYWxzZSB0byByZW1vdmUgaXQuIEl0J3MgdHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlVHJpcFN3aXRjaCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaWxsIGRpc3BsYXkgdGhlIHRyYW5zaXQgc3dpdGNoLCBzZXQgdGhpcyB0byBmYWxzZSB0byByZW1vdmUgaXQuIEl0J3MgdHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlVHJhbnNpdFN3aXRjaCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaGVuIHNlbGVjdGVkIGRhdGVoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBvdXRib3VuZCBjYWxlbmRhci5cbiAgICovXG4gIEBPdXRwdXQoKSBvdXRib3VuZFNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXRjRGF0ZT4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdoZW4gc2VsZWN0ZWQgZGF0ZWhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGluYm91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBAT3V0cHV0KCkgaW5ib3VuZFNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXRjRGF0ZT4oKTtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogT3V0Ym91bmQgZGF0ZXBpY2tlciBpcyBvcGVuIG9yIGNsb3NlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBvdXRib3VuZE9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbmJvdW5kIGRhdGVwaWNrZXIgaXMgb3BlbiBvciBjbG9zZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgaW5ib3VuZE9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBPdXRib3VuZCBjYWxlbmRhciBjaGFuZ2VzIG1vbnRoLlxuICAgKi9cbiAgQE91dHB1dCgpIG91dGJvdW5kTW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFV0Y0RhdGU+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbmJvdW5kIGNhbGVuZGFyIGNoYW5nZXMgbW9udGguXG4gICAqL1xuICBAT3V0cHV0KCkgaW5ib3VuZE1vbnRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVdGNEYXRlPigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2hlbiBhIHVzZXIgaGFzIGFjdGl2ZWx5IGNoYW5nZWQgdGhlIGRhdGUuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9jdXNPbk5leHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgZ2VvbG9jYXRpb24gb2YgdGhlIHVzZXIuIFdpbGwgYmUgZW1pdHRlZCBpZiAnZW5hYmxlU3VnZ2VzdGlvbnMnIGlzIHRydWUuXG4gICAqL1xuICBAT3V0cHV0KCkgcG9zaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdlb2xvY2F0aW9uUG9zaXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVuIHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSB0aGUgaW5mbyBidXR0b24gb24gdGhlIHN1YnNpZHkgZGlzY291bnQgaXMgY2xpY2tlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBzdWJzaWR5RGlzY291bnRJbmZvQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZ2V0IGluYm91bmRTZWxlY3RlZE1vbnRoKCk6IFV0Y0RhdGUge1xuICAgIHJldHVybiB0aGlzLmluYm91bmRTZWxlY3RlZE1vbnRoVmFsdWU7XG4gIH1cbiAgc2V0IGluYm91bmRTZWxlY3RlZE1vbnRoKG1vbnRoOiBVdGNEYXRlKSB7XG4gICAgaWYgKHRoaXMuZGF0ZVNlcnZpY2UuaXNTYW1lTW9udGgobW9udGgsIHRoaXMuaW5ib3VuZFNlbGVjdGVkTW9udGhWYWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW5ib3VuZE1vbnRoQ2hhbmdlLmVtaXQobW9udGgpO1xuICAgICAgdGhpcy5pbmJvdW5kU2VsZWN0ZWRNb250aFZhbHVlID0gbW9udGg7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG91dGJvdW5kU2VsZWN0ZWREYXRlVmFsdWU6IFV0Y0RhdGU7XG4gIHByaXZhdGUgaW5ib3VuZFNlbGVjdGVkRGF0ZVZhbHVlOiBVdGNEYXRlO1xuICBwcml2YXRlIGluYm91bmRTZWxlY3RlZE1vbnRoVmFsdWU6IFV0Y0RhdGU7XG4gIHByaXZhdGUgYWlycG9ydHNWYWx1ZTogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgcHJpdmF0ZSB0cmlwVHlwZVZhbHVlOiBUcmlwVHlwZTtcbiAgcHJpdmF0ZSBkaXJlY3RPbmx5VmFsdWU6IGJvb2xlYW47XG4gIHByaXZhdGUgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjbG9zZXN0QWlycG9ydHNWYWx1ZTogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgcHJpdmF0ZSBvdXRib3VuZE9wZW5WYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIGluYm91bmRPcGVuVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwYXNzZW5nZXJzVmFsdWUgPSBuZXcgQXJyYXk8UGFzc2VuZ2Vyc01vZGVsPigpO1xuICBwcml2YXRlIGZvY3VzQXN5bmNUaW1vdXQ6IGFueTtcbiAgcHJpdmF0ZSB0cmFuc2l0U3dpdGNoRm9jdXNUaW1lb3V0OiBhbnk7XG4gIHByaXZhdGUgdHJpcFN3aXRjaEZvY3VzVGltZW91dDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkZXZpY2VIZWxwZXI6IERldmljZUhlbHBlcixcbiAgICBwcml2YXRlIHNvcnRTZXJ2aWNlOiBTb3J0U2VydmljZSxcbiAgICBwcml2YXRlIGFiYW5kb25lZEJhc2tldFNlcnZpY2U6IEFiYW5kb25lZEJhc2tldFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlU2VydmljZTogRGF0ZUhlbHBlcixcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKCduYXMtZmlsdGVyJyk7XG4gICAgdGhpcy5uYXRpdmVFbGVtZW50ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm5hc0Zvcm1Hcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubmFzRm9ybUdyb3VwLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHggPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNOYXNHcm91cFZhbGlkID0geDtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seSkge1xuICAgICAgY29uc3QgZGlyZWN0T25seUNvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVEaXJlY3RPbmx5KTtcblxuICAgICAgaWYgKGRpcmVjdE9ubHlDb250cm9sKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0T25seSA9IGRpcmVjdE9ubHlDb250cm9sLnZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVRyaXBUeXBlKSB7XG4gICAgICBjb25zdCB0cmlwVHlwZUNvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVUcmlwVHlwZSk7XG5cbiAgICAgIGlmICh0cmlwVHlwZUNvbnRyb2wpIHtcbiAgICAgICAgdGhpcy50cmlwVHlwZSA9IHRyaXBUeXBlQ29udHJvbC52YWx1ZTtcbiAgICAgICAgdGhpcy5pbmJvdW5kRGlzYWJsZWQgPSB0cmlwVHlwZUNvbnRyb2wudmFsdWUgPT09IFRyaXBUeXBlLm9uZVdheTtcblxuICAgICAgICBpZiAodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVJbmJvdW5kKSB7XG4gICAgICAgICAgY29uc3QgaW5ib3VuZENvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVJbmJvdW5kKTtcblxuICAgICAgICAgIGlmIChpbmJvdW5kQ29udHJvbCAmJiB0aGlzLmluYm91bmREaXNhYmxlZCkge1xuICAgICAgICAgICAgaW5ib3VuZENvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRyaXBUeXBlQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZTogVHJpcFR5cGUpID0+IHtcbiAgICAgICAgICB0aGlzLmluYm91bmREaXNhYmxlZCA9IHZhbHVlID09PSBUcmlwVHlwZS5vbmVXYXk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcblxuICAgIHRoaXMuY29udGFpbmVyV2lkdGgubmV4dCgodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkub2Zmc2V0V2lkdGgpO1xuXG4gICAgd2luZG93Lm9ucmVzaXplID0gKCkgPT4ge1xuICAgICAgdGhpcy5jb250YWluZXJXaWR0aC5uZXh0KCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aCk7XG4gICAgfTtcbiAgfVxuXG4gIG9uU3Vic2lkeURpc2NvdW50SW5mb0NsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2lkeURpc2NvdW50SW5mb0NsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIG9uU3Vic2lkeURpc2NvdW50U2VsZWN0Q2hhbmdlKG1vZGVsOiBTdWJzaWR5RGlzY291bnRNb2RlbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uYXNGb3JtR3JvdXAgfHwgIXRoaXMubmFzRm9ybUNvbnRyb2xOYW1lU3Vic2lkeURpc2NvdW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2lkeURpc2NvdW50Q29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldCh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVN1YnNpZHlEaXNjb3VudCk7XG4gICAgc3Vic2lkeURpc2NvdW50Q29udHJvbC5wYXRjaFZhbHVlKG1vZGVsKTtcbiAgfVxuXG4gIGdldENsb3Nlc3RBaXJwb3J0cyhwb3NpdGlvbjogR2VvbG9jYXRpb25Qb3NpdGlvbik6IHZvaWQge1xuICAgIHRoaXMucG9zaXRpb25DaGFuZ2UuZW1pdChwb3NpdGlvbik7XG4gIH1cblxuICBnZXRGaWx0ZXJDbGFzcyhlbGVtZW50Pzogc3RyaW5nLCBtb2RpZmllcnNJbnB1dD86IGFueSk6IENsYXNzTW9kZWwge1xuICAgIGxldCBtb2RpZmllcnMgPSBtb2RpZmllcnNJbnB1dCB8fCBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKHR5cGVvZiBtb2RpZmllcnNJbnB1dCA9PT0gJ3N0cmluZycgfHwgbW9kaWZpZXJzSW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIG1vZGlmaWVycyA9IFttb2RpZmllcnNJbnB1dF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGhzID0gW107XG5cbiAgICBpZiAodGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aFRhYmxldCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpKSB7XG4gICAgICB3aWR0aHMucHVzaCgnbWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aERlc2t0b3AodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKSkge1xuICAgICAgd2lkdGhzLnB1c2goJ2xnJyk7XG4gICAgfVxuXG4gICAgbW9kaWZpZXJzID0gWy4uLm1vZGlmaWVycywgLi4ud2lkdGhzXTtcblxuICAgIHJldHVybiB0aGlzLmdldENsYXNzKGVsZW1lbnQsIG1vZGlmaWVycyk7XG4gIH1cblxuICBnZXRBaXJwb3J0U2VsZWN0Q2xhc3MoKTogQ2xhc3NNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoXG4gICAgICAnYWlycG9ydC1zZWxlY3QnLFxuICAgICAgW1xuICAgICAgICB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoRGVza3RvcCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpICYmICdsZycsXG4gICAgICAgIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhUYWJsZXQodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKSAmJiAnbWQnLFxuICAgICAgICB0aGlzLmV4aXN0cyh0aGlzLmVuYWJsZURhdGVwaWNrZXJzKSAmJiAnbm8tYm9yZGVyJ1xuICAgICAgXSk7XG4gIH1cblxuICBnZXRTdWdnZXN0aW9ucygpOiBBcnJheTxBaXJwb3J0TW9kZWw+IHtcbiAgICBjb25zdCBzdWdnZXN0aW9ucyA9IEFycmF5LmZyb20obmV3IFNldChbXG4gICAgICAuLi50aGlzLmxhdGVzdFNlYXJjaGVzT3JpZ2luID8gdGhpcy5sYXRlc3RTZWFyY2hlc09yaWdpbi5maWx0ZXIoeCA9PiB4LmNvZGUgIT09IHRoaXMub3JpZ2luQWlycG9ydENvZGUpIDogW10sXG4gICAgICAuLi50aGlzLmNsb3Nlc3RBaXJwb3J0cyA/IHRoaXMuY2xvc2VzdEFpcnBvcnRzLmZpbHRlcih4ID0+IHguY29kZSAhPT0gdGhpcy5vcmlnaW5BaXJwb3J0Q29kZSkgOiBbXVxuICAgIF0pKTtcblxuICAgIHJldHVybiBzdWdnZXN0aW9ucy5zbGljZSgwLCAzKTtcbiAgfVxuXG4gIGdldERhdGVQaWNrZXJzQ2xhc3MoKTogQ2xhc3NNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyQ2xhc3MoJ2RhdGUtY29tYm8nLCBbXG4gICAgICB0aGlzLmV4aXN0cyh0aGlzLm1pbmltaXplKSAmJiAnbWluaW1pemVkJyxcbiAgICAgIHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSA+IDUwMCAmJiAnc2lkZS1ieS1zaWRlJ1xuICAgIF0pO1xuICB9XG5cbiAgZ2V0VHJhdmVsRGV0YWlsc0NsYXNzKGVsZW1lbnQ/OiBzdHJpbmcsIG1vZGlmaWVyc0lucHV0PzogYW55KTogQ2xhc3NNb2RlbCB7XG4gICAgbGV0IG1vZGlmaWVycyA9IG1vZGlmaWVyc0lucHV0IHx8IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAodHlwZW9mIG1vZGlmaWVyc0lucHV0ID09PSAnc3RyaW5nJyB8fCBtb2RpZmllcnNJbnB1dCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgbW9kaWZpZXJzID0gW21vZGlmaWVyc0lucHV0XTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aHMgPSBbXG4gICAgICB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoVGFibGV0KHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ21kJyxcbiAgICAgIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhEZXNrdG9wKHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ2xnJ1xuICAgIF07XG5cbiAgICBtb2RpZmllcnMgPSBbLi4ubW9kaWZpZXJzLCAuLi53aWR0aHNdO1xuXG4gICAgY29uc3QgdHJhdmVsRGV0YWlsc0Jhc2UgPSBuZXcgTmFzQ29tcG9uZW50QmFzZSgndHJhdmVsLWRldGFpbHMnKTtcbiAgICByZXR1cm4gdHJhdmVsRGV0YWlsc0Jhc2UuZ2V0Q2xhc3MoZWxlbWVudCwgbW9kaWZpZXJzKTtcbiAgfVxuXG4gIG9uSW5ib3VuZE1vbnRoQ2hhbmdlKG1vbnRoOiBVdGNEYXRlKTogdm9pZCB7IHRoaXMuaW5ib3VuZE1vbnRoQ2hhbmdlLmVtaXQobW9udGgpOyB9XG4gIG9uT3V0Ym91bmRNb250aENoYW5nZShtb250aDogVXRjRGF0ZSk6IHZvaWQgeyB0aGlzLm91dGJvdW5kTW9udGhDaGFuZ2UuZW1pdChtb250aCk7IH1cblxuICBvblBhc3NlbmdlcnNTZWxlY3RGb2N1c09uUHJldmlvdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgIHRoaXMub25UcmFuc2l0U3dpdGNoT3Blbih0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyYW5zaXRTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGFibGV0RGlzcGxheSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdFByZXZpb3VzQ29udHJvbCgpO1xuICAgIH1cbiAgfVxuXG4gIHBhc3NlbmdlcktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkgfHwgdGhpcy5pc1RhYmxldERpc3BsYXkoKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5mb2N1c09uQWlycG9ydFNlbGVjdEJhY2t3YXJkcygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdWJzaWR5RGlzY291bnRzICYmIHRoaXMuc3Vic2lkeURpc2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNpZHlEaXNjb3VudC5pbmZvQnV0dG9uLmJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbk5leHRDaGFuZ2UuZW1pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3Blbih0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3BlbihmYWxzZSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXNPbk5hdGl2ZUVsZW1lbnQodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25UcmlwU3dpdGNoS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudHJpcFR5cGVSb3VuZFRyaXAubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudHJpcFR5cGVPbmV3YXkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudHJpcFR5cGVPbmV3YXkubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudHJpcFR5cGVSb3VuZFRyaXAubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpIHx8ICF0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFByZXZpb3VzQ29udHJvbCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3Blbih0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICAgICAgdGhpcy5vblRyYW5zaXRTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy50cmlwU3dpdGNoLm9wZW4pIHtcbiAgICAgICAgICAgICAgdGhpcy5vblRyYW5zaXRTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmFuc2l0U3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZXRGb2N1c09uTmF0aXZlRWxlbWVudCh0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50cmFuc2l0VHlwZVRyYW5zaXQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudHJhbnNpdFR5cGVEaXJlY3RPbmx5Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRyYW5zaXRUeXBlRGlyZWN0T25seS5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0VHlwZVRyYW5zaXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKDxhbnk+dGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3Blbih0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uVHJhbnNpdFN3aXRjaE9wZW4oIXRoaXMudHJhbnNpdFN3aXRjaC5vcGVuKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2lkeURpc2NvdW50cyAmJiB0aGlzLnN1YnNpZHlEaXNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLnN1YnNpZHlEaXNjb3VudC5pbmZvQnV0dG9uLmJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmZvY3VzT25OZXh0Q2hhbmdlLmVtaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHRoaXMub25UcmFuc2l0U3dpdGNoT3BlbihmYWxzZSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXNPbk5hdGl2ZUVsZW1lbnQodGhpcy50cmFuc2l0U3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvblN1YnNpZHlEaXNjb3VudEluZm9CdXR0b25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMudHJhbnNpdFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvblBhc3NlbmdlcnNTZWxlY3RGb2N1c09uTmV4dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgdGhpcy5mb2N1c0FzeW5jKDxhbnk+dGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzQXN5bmMocmVmRWxlbWVudDogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmZvY3VzQXN5bmNUaW1vdXQpO1xuXG4gICAgdGhpcy5mb2N1c0FzeW5jVGltb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KHJlZkVsZW1lbnQpKTtcbiAgfVxuXG4gIG9uRGF0ZXBpY2tlckZvY3VzT25QcmV2aW91cyhldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5mb2N1c09uQWlycG9ydFNlbGVjdEJhY2t3YXJkcygpO1xuICB9XG5cbiAgc2VsZWN0UHJldmlvdXNDb250cm9sKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT25seSkge1xuICAgICAgICB0aGlzLm91dGJvdW5kT3BlbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluYm91bmRPcGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMuYWlycG9ydFNlbGVjdC5jb21ibykpIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9uRGVzdGluYXRpb25PcGVuKHRydWUpO1xuICAgICAgICBpZiAoKDxhbnk+dGhpcy5haXJwb3J0U2VsZWN0LmFpcnBvcnRTZWxlY3REcm9wZG93bkRlc3RpbmF0aW9uKSkge1xuICAgICAgICAgIHRoaXMuZm9jdXNBc3luYygoPGFueT50aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duRGVzdGluYXRpb24pLmlucHV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9uT3JpZ2luT3Blbih0cnVlKTtcbiAgICAgICAgaWYgKCg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25PcmlnaW4pKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKCg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25PcmlnaW4pLmlucHV0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgb25Gb2N1c09uTmV4dENoYW5nZShldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSAmJiB0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGFibGV0RGlzcGxheSgpKSB7XG4gICAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3Blbih0cnVlKTtcbiAgICAgICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzTW9iaWxlRGlzcGxheSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aE1vYmlsZSh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgaXNUYWJsZXREaXNwbGF5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoVGFibGV0KHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSk7XG4gIH1cblxuICBvbk9yaWdpbk9wZW4ob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICB0aGlzLnRyaXBTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYW5zaXRTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPcGVuID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QgJiYgIXRoaXMuYWlycG9ydFNlbGVjdC5vcmlnaW5PcGVuKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1heGltaXplKCk7XG4gICAgfVxuXG4gICAgdGhpcy5vcmlnaW5PcGVuQ2hhbmdlLmVtaXQob3Blbik7XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWlycG9ydFZhbHVlcygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5TbmFwc2hvdCA9IHRoaXMuYWlycG9ydFNlbGVjdC5vcmlnaW47XG4gICAgY29uc3QgZGVzdGluYXRpb25TbmFwc2hvdCA9IHRoaXMuYWlycG9ydFNlbGVjdC5kZXN0aW5hdGlvbjtcbiAgICBpZiAoKG9yaWdpblNuYXBzaG90ICYmIGRlc3RpbmF0aW9uU25hcHNob3QgJiYgb3JpZ2luU25hcHNob3QuY29kZSAmJiBvcmlnaW5TbmFwc2hvdC5jb2RlLmxlbmd0aFxuICAgICAgJiYgZGVzdGluYXRpb25TbmFwc2hvdC5jb2RlICYmIGRlc3RpbmF0aW9uU25hcHNob3QuY29kZS5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdXBkYXRlTWF4aW1pemUoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1heGltaXplID0gdGhpcy52YWxpZGF0ZUFpcnBvcnRWYWx1ZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uRGVzdGluYXRpb25PcGVuKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0ICYmICF0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1heGltaXplKCk7XG4gICAgfVxuICAgIHRoaXMuZGVzdGluYXRpb25PcGVuQ2hhbmdlLmVtaXQob3Blbik7XG4gIH1cblxuICBvblBhc3NlbmdlclNlbGVjdE9wZW4ob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vcmlnaW5PcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4pIHtcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21iby5vdXRib3VuZE9wZW4pIHtcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gb3BlbjtcbiAgICB0aGlzLnBhc3NlbmdlclNlbGVjdE9wZW5DaGFuZ2UuZW1pdChvcGVuKTtcblxuICAgIGlmIChvcGVuKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0Lm51bWJlckZpZWxkcy5maXJzdCkge1xuICAgICAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0Lm51bWJlckZpZWxkcy5maXJzdC5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9XG5cbiAgb25UcmlwU3dpdGNoT3BlbihvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudHJpcFN3aXRjaEZvY3VzVGltZW91dCk7XG5cbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24ub3BlbiA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhbnNpdFN3aXRjaCkge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBvcGVuO1xuXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaEZvY3VzVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRyaXBUeXBlUm91bmRUcmlwLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICB9XG5cbiAgb25UcmFuc2l0U3dpdGNoT3BlbihvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudHJhbnNpdFN3aXRjaEZvY3VzVGltZW91dCk7XG5cbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYW5zaXRTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gb3BlbjtcbiAgICB9XG5cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoRm9jdXNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNpdFR5cGVUcmFuc2l0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICB9XG5cbiAgb25PcmlnaW5DaGFuZ2UoYWlycG9ydDogQWlycG9ydE1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy5vcmlnaW5DaGFuZ2UuZW1pdChhaXJwb3J0KTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkT3JpZ2luQWlycG9ydChhaXJwb3J0OiBBaXJwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICBpZiAoIWFpcnBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uT3JpZ2luQ2hhbmdlKGFpcnBvcnQpO1xuXG4gICAgaWYgKHRoaXMub3JpZ2luQWlycG9ydENvZGUgPT09IGFpcnBvcnQuY29kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3JpZ2luQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkRlc3RpbmF0aW9uQ2hhbmdlKGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdGluYXRpb25DaGFuZ2UuZW1pdChhaXJwb3J0KTtcbiAgfVxuXG4gIHNldEZvY3VzT25QYXNzZW5nZXJTZWxlY3QoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm1pbmltaXplID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub3V0Ym91bmRPcGVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c0FzeW5jKCg8YW55PnRoaXMuZGF0ZXBpY2tlckNvbWJvLmRhdGVwaWNrZXJPdXRib3VuZCkuaW5wdXQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGFibGV0RGlzcGxheSgpICYmIHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5vdXRib3VuZE9wZW4gPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG5cbiAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4odHJ1ZSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50UmVmID0gdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50O1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0Rm9jdXNPbk5hdGl2ZUVsZW1lbnQoY3VycmVudEVsZW1lbnRSZWYpKTtcblxuICAgICAgfSBlbHNlIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcblxuICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgIHRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIHNldEZvY3VzT25OYXRpdmVFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIG9uVHJpcFR5cGVDaGFuZ2UodHJpcFR5cGU6IFRyaXBUeXBlKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaXBTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGhpcy50cmlwVHlwZSA9IHRyaXBUeXBlO1xuXG4gICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwICYmIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lVHJpcFR5cGUpIHtcbiAgICAgIGNvbnN0IHRyaXBTd2l0Y2hDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lVHJpcFR5cGUpO1xuICAgICAgdHJpcFN3aXRjaENvbnRyb2wucGF0Y2hWYWx1ZSh0cmlwVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgb25UcmFuc2l0Q2hhbmdlKGRpcmVjdE9ubHk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRpcmVjdE9ubHkgPSBkaXJlY3RPbmx5O1xuXG4gICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwICYmIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seSkge1xuICAgICAgY29uc3QgdHJpcFR5cGVDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seSk7XG4gICAgICB0cmlwVHlwZUNvbnRyb2wucGF0Y2hWYWx1ZShkaXJlY3RPbmx5KTtcbiAgICB9XG4gIH1cblxuICBnZXRUcmF2ZWxEZXRhaWxzVHJpcFN3aXRjaEljb25DbGFzcyhtb2RpZmllcnM/OiBhbnkpOiBBcnJheTxDbGFzc01vZGVsPiB7XG4gICAgY29uc3QgaWNvbk1lZGl1bUJhc2UgPSBuZXcgTmFzQ29tcG9uZW50QmFzZSgnaWNvbi1tZWRpdW0nKTtcblxuICAgIHJldHVybiBbXG4gICAgICBpY29uTWVkaXVtQmFzZS5nZXRDbGFzcygnJywgbW9kaWZpZXJzKSxcbiAgICAgIHRoaXMuZ2V0VHJhdmVsRGV0YWlsc0NsYXNzKCdpY29uJylcbiAgICBdO1xuICB9XG5cbiAgZ2V0VHJpcFN3aXRjaExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJpcFR5cGUgPT09IFRyaXBUeXBlLnR3b1dheVJldHVybiA/IHRoaXMudHJpcFN3aXRjaFJvdW5kVHJpcExhYmVsIDogdGhpcy50cmlwU3dpdGNoT25lV2F5TGFiZWw7XG4gIH1cblxuICBnZXRUcmFuc2l0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaXJlY3RPbmx5ID8gdGhpcy5kaXJlY3RPbmx5TGFiZWwgOiB0aGlzLmRpcmVjdFRyYW5zaXRMYWJlbDtcbiAgfVxuXG4gIG9uQWNjb3JkaW9uVG9nZ2xlQ2hhbmdlKGV4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3VtbWFyeSA9ICFleHBhbmRlZDtcbiAgfVxuXG4gIGdldFN1bW1hcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5wYXNzZW5nZXJTZWxlY3RMYWJlbH0ke3RoaXMuZGVmYXVsdFN1bW1hcnlTZXBhcmF0b3J9YCArXG4gICAgICBgJHt0aGlzLmdldFRyaXBTd2l0Y2hMYWJlbCgpLnRvTG93ZXJDYXNlKCl9JHt0aGlzLmxhc3RTdW1tYXJ5U2VwYXJhdG9yfSR7dGhpcy5nZXRUcmFuc2l0TGFiZWwoKS50b0xvd2VyQ2FzZSgpfWA7XG4gIH1cblxuICBzaG91bGRNYXhpbWl6ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKHRoaXMubWluaW1pemUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWlycG9ydFNlbGVjdFxuICAgICAgJiYgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpblxuICAgICAgJiYgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbi5jb2RlXG4gICAgICAmJiB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25cbiAgICAgICYmIHRoaXMuYWlycG9ydFNlbGVjdC5kZXN0aW5hdGlvbi5jb2RlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCAmJiAodGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gfHwgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbikpIHtcbiAgICAgIHJldHVybiB0aGlzLm1heGltaXplO1xuICAgIH0gZWxzZSBpZiAodGhpcy5leGlzdHModGhpcy5taW5pbWl6ZSkpIHtcbiAgICAgIGlmICh0aGlzLm1heGltaXplKSB7XG4gICAgICAgIGlmICh0aGlzLm5hc0Zvcm1Hcm91cCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlzTmFzR3JvdXBWYWxpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzT25BaXJwb3J0U2VsZWN0QmFja3dhcmRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4aXN0cyh0aGlzLmFpcnBvcnRTZWxlY3QuY29tYm8pKSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub25EZXN0aW5hdGlvbk9wZW4odHJ1ZSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmFpcnBvcnRTZWxlY3REcm9wZG93bkRlc3RpbmF0aW9uLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDEwMCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9uT3JpZ2luT3Blbih0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNBc3luYygoPGFueT50aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duT3JpZ2luKS5pbnB1dCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRMYXRlc3RTZWFyY2hlcyhhYmFuZG9uZWRCYXNrZXQ6IEFycmF5PEFiYW5kb25lZEJhc2tldEl0ZW1Nb2RlbD4sIGFpcnBvcnRzOiBBcnJheTxBaXJwb3J0TW9kZWw+KTogdm9pZCB7XG4gICAgaWYgKCFhYmFuZG9uZWRCYXNrZXQgfHwgIWFpcnBvcnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5pcXVlID0gbmV3IEFycmF5PEFiYW5kb25lZEJhc2tldEl0ZW1Nb2RlbD4oKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBhYmFuZG9uZWRCYXNrZXQpIHtcbiAgICAgIGlmICghdW5pcXVlLnNvbWUoeCA9PiB4LmRlc3RpbmF0aW9uQ29kZSA9PT0gaXRlbS5kZXN0aW5hdGlvbkNvZGUpKSB7XG4gICAgICAgIHVuaXF1ZS5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbkNvZGVzID0gdW5pcXVlLm1hcCh4ID0+IHgub3JpZ2luQ29kZSk7XG4gICAgY29uc3QgZGVzdGluYXRpb25Db2RlcyA9IHVuaXF1ZS5tYXAoeCA9PiB4LmRlc3RpbmF0aW9uQ29kZSk7XG5cbiAgICBjb25zdCBsYXRlc3RTZWFyY2hlc09yaWdpbiA9IGFpcnBvcnRzLmZpbHRlcihhaXJwb3J0ID0+IHtcbiAgICAgIHJldHVybiB1bmlxdWUuc29tZSh4ID0+IHgub3JpZ2luQ29kZS50b0xvd2VyQ2FzZSgpID09PSBhaXJwb3J0LmNvZGUudG9Mb3dlckNhc2UoKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uID0gYWlycG9ydHMuZmlsdGVyKGFpcnBvcnQgPT4ge1xuICAgICAgcmV0dXJuIHVuaXF1ZS5zb21lKHggPT4geC5kZXN0aW5hdGlvbkNvZGUudG9Mb3dlckNhc2UoKSA9PT0gYWlycG9ydC5jb2RlLnRvTG93ZXJDYXNlKCkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29kZSA9ICdjb2RlJztcbiAgICB0aGlzLmxhdGVzdFNlYXJjaGVzT3JpZ2luID0gdGhpcy5zb3J0U2VydmljZS5zb3J0QnlPYmplY3QobGF0ZXN0U2VhcmNoZXNPcmlnaW4sIG9yaWdpbkNvZGVzLCBjb2RlKS5zbGljZSgwLCAzKTtcblxuICAgIGlmICh0aGlzLmxhdGVzdFNlYXJjaGVzT3JpZ2luICYmIHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4ubGVuZ3RoID4gMCAmJiB0aGlzLmV4aXN0cyh0aGlzLm92ZXJyaWRlT3JpZ2luKSkge1xuICAgICAgdGhpcy5vcmlnaW5BaXJwb3J0Q29kZSA9IHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW5bMF0uY29kZTtcbiAgICB9XG5cbiAgICB0aGlzLmxhdGVzdFNlYXJjaGVzRGVzdGluYXRpb24gPSB0aGlzLnNvcnRTZXJ2aWNlLnNvcnRCeU9iamVjdChsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uLCBkZXN0aW5hdGlvbkNvZGVzLCBjb2RlKS5zbGljZSgwLCAzKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VEcm9wZG93bnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24ub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhbnNpdFN3aXRjaCkge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==