@sabstravtech/obtservices 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (904) hide show
  1. package/dist/obtservices/angular/components/basket-panel.d.ts +34 -0
  2. package/dist/obtservices/angular/components/with-component.d.ts +12 -0
  3. package/dist/obtservices/angular/data.d.ts +5530 -0
  4. package/dist/obtservices/angular/fetchers.d.ts +32 -0
  5. package/dist/obtservices/angular/lib/vendor/classes/environment.d.ts +3 -0
  6. package/dist/obtservices/angular/lib/vendor/classes/event-messenager.d.ts +4 -0
  7. package/dist/obtservices/angular/lib/vendor/classes/helpers.d.ts +15 -0
  8. package/dist/obtservices/angular/lib/vendor/fetchers/basket-fetcher.d.ts +6 -0
  9. package/dist/obtservices/angular/lib/vendor/fetchers/cabhire-quote-fetcher.d.ts +7 -0
  10. package/dist/obtservices/angular/lib/vendor/fetchers/carhire-availability-detail.fetcher.d.ts +7 -0
  11. package/dist/obtservices/angular/lib/vendor/fetchers/carhire-quote-fetcher.d.ts +7 -0
  12. package/dist/obtservices/angular/lib/vendor/fetchers/conferma-office-names.fetcher.d.ts +7 -0
  13. package/dist/obtservices/angular/lib/vendor/fetchers/conferma-quicklist.fetcher.d.ts +7 -0
  14. package/dist/obtservices/angular/lib/vendor/fetchers/eurostar-quote.fetcher.d.ts +7 -0
  15. package/dist/obtservices/angular/lib/vendor/fetchers/flight-quote.fetcher.d.ts +7 -0
  16. package/dist/obtservices/angular/lib/vendor/fetchers/get-rail-cards.fetcher.d.ts +7 -0
  17. package/dist/obtservices/angular/lib/vendor/fetchers/get-rail-station.fetcher.d.ts +7 -0
  18. package/dist/obtservices/angular/lib/vendor/fetchers/get-risk-alerts.fetcher.d.ts +7 -0
  19. package/dist/obtservices/angular/lib/vendor/fetchers/get-user-company-offices.fetcher.d.ts +7 -0
  20. package/dist/obtservices/angular/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.d.ts +7 -0
  21. package/dist/obtservices/angular/lib/vendor/fetchers/get-user-recent-searches.fetcher.d.ts +7 -0
  22. package/dist/obtservices/angular/lib/vendor/fetchers/get-users-baskets-fetcher.d.ts +7 -0
  23. package/dist/obtservices/angular/lib/vendor/fetchers/getMiAutoSugestions.fetcher.d.ts +7 -0
  24. package/dist/obtservices/angular/lib/vendor/fetchers/hotel-avaliability-fetcher.d.ts +7 -0
  25. package/dist/obtservices/angular/lib/vendor/fetchers/hotel-quote-fetcher.d.ts +7 -0
  26. package/dist/obtservices/angular/lib/vendor/fetchers/irl-quote-fetcher.d.ts +7 -0
  27. package/dist/obtservices/angular/lib/vendor/fetchers/lounge-quote.fetcher.d.ts +7 -0
  28. package/dist/obtservices/angular/lib/vendor/fetchers/parking-quote-fetcher.d.ts +7 -0
  29. package/dist/obtservices/angular/lib/vendor/fetchers/rail-quote-fetcher.d.ts +7 -0
  30. package/dist/obtservices/angular/lib/vendor/fetchers/search-airlines-fetcher.d.ts +6 -0
  31. package/dist/obtservices/angular/lib/vendor/fetchers/search-airports-fetcher.d.ts +6 -0
  32. package/dist/obtservices/angular/lib/vendor/fetchers/search-cities.fetcher.d.ts +7 -0
  33. package/dist/obtservices/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +6 -0
  34. package/dist/obtservices/angular/lib/vendor/fetchers/search-depots.fetcher.d.ts +7 -0
  35. package/dist/obtservices/angular/lib/vendor/fetchers/search-hotel-chains.fetcher.d.ts +7 -0
  36. package/dist/obtservices/angular/lib/vendor/fetchers/search-postcodes.fetcher.d.ts +7 -0
  37. package/dist/obtservices/angular/lib/vendor/fetchers/search-rail-stations.fetcher.d.ts +7 -0
  38. package/dist/obtservices/angular/lib/vendor/fetchers/search-users-can-book-for-fetcher.d.ts +7 -0
  39. package/dist/obtservices/angular/lib/vendor/fetchers/user-addresses.fetcher.d.ts +7 -0
  40. package/dist/obtservices/angular/lib/vendor/fetchers/user-fetcher.d.ts +6 -0
  41. package/dist/obtservices/angular/lib/vendor/fetchers/user-message.fetcher.d.ts +7 -0
  42. package/dist/obtservices/angular/lib/vendor/fetchers/user-products-fetcher.d.ts +7 -0
  43. package/dist/obtservices/angular/lib/vendor/fetchers/user-ui-configs-fetcher.d.ts +7 -0
  44. package/dist/obtservices/angular/lib/vendor/services/enterprise-basket.service.d.ts +29 -0
  45. package/dist/obtservices/angular/lib/vendor/services/hotel-avallibility.service.d.ts +9 -0
  46. package/dist/obtservices/angular/lib/vendor/services/http-call.service.d.ts +48 -0
  47. package/dist/obtservices/angular/lib/vendor/services/logon.service.d.ts +18 -0
  48. package/dist/obtservices/angular/lib/vendor/services/modal-opener.service.d.ts +4 -0
  49. package/dist/obtservices/angular/lib/vendor/services/my-bookings.service.d.ts +7 -0
  50. package/dist/obtservices/angular/lib/vendor/services/route-happy.service.d.ts +6 -0
  51. package/dist/obtservices/angular/lib/vendor/services/search.service.d.ts +47 -0
  52. package/dist/obtservices/angular/lib/vendor/services/storage.service.d.ts +18 -0
  53. package/dist/obtservices/angular/lib/vendor/services/user.service.d.ts +10 -0
  54. package/dist/obtservices/angular/lib/vendor/services/webtoken.service.d.ts +7 -0
  55. package/dist/obtservices/angular/lib/vendor/testers/postcode-validate.tester.d.ts +6 -0
  56. package/dist/obtservices/angular/lib/vendor/testers/validate-mi-free-value.tester.d.ts +6 -0
  57. package/dist/obtservices/angular/lib/vendor/types/graphql.angular.types.d.ts +5915 -0
  58. package/dist/obtservices/angular/lib/vendor/updaters/accept-new-price.updater.d.ts +6 -0
  59. package/dist/obtservices/angular/lib/vendor/updaters/add-item-to-basket.updater.d.ts +6 -0
  60. package/dist/obtservices/angular/lib/vendor/updaters/addUserToBasketItem.d.ts +6 -0
  61. package/dist/obtservices/angular/lib/vendor/updaters/book-basket-updater.d.ts +6 -0
  62. package/dist/obtservices/angular/lib/vendor/updaters/create-basket-updater.d.ts +6 -0
  63. package/dist/obtservices/angular/lib/vendor/updaters/move-basket-item-to-basket.d.ts +6 -0
  64. package/dist/obtservices/angular/lib/vendor/updaters/remove-basket-updater.d.ts +6 -0
  65. package/dist/obtservices/angular/lib/vendor/updaters/remove-item-from-basket.updater.d.ts +6 -0
  66. package/dist/obtservices/angular/lib/vendor/updaters/remove-recent-search.updater.d.ts +6 -0
  67. package/dist/obtservices/angular/lib/vendor/updaters/remove-user-address.updater.d.ts +6 -0
  68. package/dist/obtservices/angular/lib/vendor/updaters/revalidate-basket-updater.d.ts +6 -0
  69. package/dist/obtservices/angular/lib/vendor/updaters/save-recent-search.updater.d.ts +6 -0
  70. package/dist/obtservices/angular/lib/vendor/updaters/save-user-address.updater.d.ts +6 -0
  71. package/dist/obtservices/angular/lib/vendor/updaters/send-basket-for-approval.updater.d.ts +6 -0
  72. package/dist/obtservices/angular/lib/vendor/updaters/set-basket-item-lead-passenger.updater.d.ts +6 -0
  73. package/dist/obtservices/angular/lib/vendor/updaters/set-basket-item-mi-group.d.ts +6 -0
  74. package/dist/obtservices/angular/lib/vendor/updaters/set-basket-item-mi-value-updater.d.ts +6 -0
  75. package/dist/obtservices/angular/lib/vendor/updaters/set-payment-option.updater.d.ts +6 -0
  76. package/dist/obtservices/angular/lib/vendor/updaters/update-basket-notes-updater.d.ts +6 -0
  77. package/dist/obtservices/angular/lib/vendor/updaters/update-basket-title-updater.d.ts +6 -0
  78. package/dist/obtservices/angular/obtservices-angular.d.ts +17 -0
  79. package/dist/obtservices/angular/obtservices-angular.metadata.json +1 -0
  80. package/dist/obtservices/angular/obtservices.module.d.ts +7 -0
  81. package/dist/obtservices/angular/package.json +11 -0
  82. package/dist/obtservices/base/fetchers.d.ts +36 -0
  83. package/dist/obtservices/base/lib/vendor/classes/base-enterprise.d.ts +39 -0
  84. package/dist/obtservices/base/lib/vendor/classes/base-network-call.d.ts +10 -0
  85. package/dist/obtservices/base/lib/vendor/classes/basket-info-mi-details.impl.d.ts +20 -0
  86. package/dist/obtservices/base/lib/vendor/classes/bookable-basket.d.ts +40 -0
  87. package/dist/obtservices/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +138 -0
  88. package/dist/obtservices/base/lib/vendor/classes/carhire-enterprise-search.d.ts +203 -0
  89. package/dist/obtservices/base/lib/vendor/classes/enviroment.d.ts +24 -0
  90. package/dist/obtservices/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +268 -0
  91. package/dist/obtservices/base/lib/vendor/classes/eurostar-search-type.enum.d.ts +4 -0
  92. package/dist/obtservices/base/lib/vendor/classes/event-messenager.d.ts +12 -0
  93. package/dist/obtservices/base/lib/vendor/classes/flight-enterprise-search.d.ts +251 -0
  94. package/dist/obtservices/base/lib/vendor/classes/flight-search-type.enum.d.ts +5 -0
  95. package/dist/obtservices/base/lib/vendor/classes/helpers.d.ts +173 -0
  96. package/dist/obtservices/base/lib/vendor/classes/hotel-enterprise-search.d.ts +176 -0
  97. package/dist/obtservices/base/lib/vendor/classes/irl-enterprise-search.d.ts +139 -0
  98. package/dist/obtservices/base/lib/vendor/classes/limited-cache.class.d.ts +21 -0
  99. package/dist/obtservices/base/lib/vendor/classes/lounges-enterprise-search.d.ts +68 -0
  100. package/dist/obtservices/base/lib/vendor/classes/management-info-and-valid.d.ts +41 -0
  101. package/dist/obtservices/base/lib/vendor/classes/modal-types.enum.d.ts +12 -0
  102. package/dist/obtservices/base/lib/vendor/classes/parking-enterprise-search.d.ts +103 -0
  103. package/dist/obtservices/base/lib/vendor/classes/rail-direction.enum.d.ts +4 -0
  104. package/dist/obtservices/base/lib/vendor/classes/rail-enterprise-search.d.ts +193 -0
  105. package/dist/obtservices/base/lib/vendor/classes/routehappy-request.d.ts +126 -0
  106. package/dist/obtservices/base/lib/vendor/classes/routehappy-response.d.ts +107 -0
  107. package/dist/obtservices/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +62 -0
  108. package/dist/obtservices/base/lib/vendor/classes/user-favourite.enum.d.ts +12 -0
  109. package/dist/obtservices/base/lib/vendor/classes/validator.checker.d.ts +6 -0
  110. package/dist/obtservices/base/lib/vendor/fetchers/basket-fetcher.d.ts +20 -0
  111. package/dist/obtservices/base/lib/vendor/fetchers/cabhire-quote-fetcher.d.ts +23 -0
  112. package/dist/obtservices/base/lib/vendor/fetchers/carhire-availability-detail.fetcher.d.ts +20 -0
  113. package/dist/obtservices/base/lib/vendor/fetchers/carhire-quote-fetcher.d.ts +23 -0
  114. package/dist/obtservices/base/lib/vendor/fetchers/conferma-office-names.fetcher.d.ts +21 -0
  115. package/dist/obtservices/base/lib/vendor/fetchers/conferma-quicklist.fetcher.d.ts +23 -0
  116. package/dist/obtservices/base/lib/vendor/fetchers/eurostar-quote.fetcher.d.ts +23 -0
  117. package/dist/obtservices/base/lib/vendor/fetchers/flight-quote.fetcher.d.ts +23 -0
  118. package/dist/obtservices/base/lib/vendor/fetchers/get-rail-cards.fetcher.d.ts +21 -0
  119. package/dist/obtservices/base/lib/vendor/fetchers/get-rail-station.fetcher.d.ts +21 -0
  120. package/dist/obtservices/base/lib/vendor/fetchers/get-risk-alerts.fetcher.d.ts +21 -0
  121. package/dist/obtservices/base/lib/vendor/fetchers/get-user-company-offices.fetcher.d.ts +21 -0
  122. package/dist/obtservices/base/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.d.ts +20 -0
  123. package/dist/obtservices/base/lib/vendor/fetchers/get-user-recent-searches.fetcher.d.ts +21 -0
  124. package/dist/obtservices/base/lib/vendor/fetchers/get-users-baskets-fetcher.d.ts +21 -0
  125. package/dist/obtservices/base/lib/vendor/fetchers/getMiAutoSugestions.fetcher.d.ts +21 -0
  126. package/dist/obtservices/base/lib/vendor/fetchers/hotel-avaliability-fetcher.d.ts +24 -0
  127. package/dist/obtservices/base/lib/vendor/fetchers/hotel-quote-fetcher.d.ts +23 -0
  128. package/dist/obtservices/base/lib/vendor/fetchers/irl-quote-fetcher.d.ts +23 -0
  129. package/dist/obtservices/base/lib/vendor/fetchers/list-fetchable-enterprise.d.ts +20 -0
  130. package/dist/obtservices/base/lib/vendor/fetchers/lounge-quote.fetcher.d.ts +23 -0
  131. package/dist/obtservices/base/lib/vendor/fetchers/object-fetchable-enterprise.d.ts +11 -0
  132. package/dist/obtservices/base/lib/vendor/fetchers/parking-quote-fetcher.d.ts +23 -0
  133. package/dist/obtservices/base/lib/vendor/fetchers/rail-quote-fetcher.d.ts +23 -0
  134. package/dist/obtservices/base/lib/vendor/fetchers/search-airlines.fetcher.d.ts +20 -0
  135. package/dist/obtservices/base/lib/vendor/fetchers/search-airports-fetcher.d.ts +20 -0
  136. package/dist/obtservices/base/lib/vendor/fetchers/search-cities.fetcher.d.ts +21 -0
  137. package/dist/obtservices/base/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +20 -0
  138. package/dist/obtservices/base/lib/vendor/fetchers/search-depots.fetcher.d.ts +20 -0
  139. package/dist/obtservices/base/lib/vendor/fetchers/search-hotel-chains.fetcher.d.ts +21 -0
  140. package/dist/obtservices/base/lib/vendor/fetchers/search-postcodes.fetcher.d.ts +21 -0
  141. package/dist/obtservices/base/lib/vendor/fetchers/search-rail-stations.fetcher.d.ts +21 -0
  142. package/dist/obtservices/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.d.ts +21 -0
  143. package/dist/obtservices/base/lib/vendor/fetchers/user-addresses.fetcher.d.ts +21 -0
  144. package/dist/obtservices/base/lib/vendor/fetchers/user-fetcher.d.ts +20 -0
  145. package/dist/obtservices/base/lib/vendor/fetchers/user-message.fetcher.d.ts +21 -0
  146. package/dist/obtservices/base/lib/vendor/fetchers/user-products-fetcher.d.ts +21 -0
  147. package/dist/obtservices/base/lib/vendor/fetchers/user-ui-configs-fetcher.d.ts +23 -0
  148. package/dist/obtservices/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +133 -0
  149. package/dist/obtservices/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +99 -0
  150. package/dist/obtservices/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +64 -0
  151. package/dist/obtservices/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +124 -0
  152. package/dist/obtservices/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +123 -0
  153. package/dist/obtservices/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +192 -0
  154. package/dist/obtservices/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +45 -0
  155. package/dist/obtservices/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +36 -0
  156. package/dist/obtservices/base/lib/vendor/interfaces/Imybookings.service.d.ts +24 -0
  157. package/dist/obtservices/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +58 -0
  158. package/dist/obtservices/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +110 -0
  159. package/dist/obtservices/base/lib/vendor/interfaces/Isearch.service.d.ts +101 -0
  160. package/dist/obtservices/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.d.ts +42 -0
  161. package/dist/obtservices/base/lib/vendor/interfaces/Iuser.service.d.ts +59 -0
  162. package/dist/obtservices/base/lib/vendor/interfaces/car-hire-classes.interface.d.ts +7 -0
  163. package/dist/obtservices/base/lib/vendor/interfaces/car-hire-filters.interface.d.ts +10 -0
  164. package/dist/obtservices/base/lib/vendor/interfaces/car-hire-sort.interface.d.ts +4 -0
  165. package/dist/obtservices/base/lib/vendor/interfaces/cheapest-price.d.ts +4 -0
  166. package/dist/obtservices/base/lib/vendor/interfaces/code-name.d.ts +4 -0
  167. package/dist/obtservices/base/lib/vendor/interfaces/flight-filters.interface.d.ts +29 -0
  168. package/dist/obtservices/base/lib/vendor/interfaces/flight-multi-destination.interface.d.ts +7 -0
  169. package/dist/obtservices/base/lib/vendor/interfaces/rail-airport-express-stations.interface.d.ts +4 -0
  170. package/dist/obtservices/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +69 -0
  171. package/dist/obtservices/base/lib/vendor/interfaces/rail-journey-leg.interface.d.ts +6 -0
  172. package/dist/obtservices/base/lib/vendor/interfaces/rail-recent-search-args.interface.d.ts +19 -0
  173. package/dist/obtservices/base/lib/vendor/interfaces/rail-selected-ticket.interface.d.ts +10 -0
  174. package/dist/obtservices/base/lib/vendor/interfaces/rail-ticket-group.interface.d.ts +26 -0
  175. package/dist/obtservices/base/lib/vendor/interfaces/rail-ticket-groups.interface.d.ts +4 -0
  176. package/dist/obtservices/base/lib/vendor/interfaces/search-objects.interface.d.ts +16 -0
  177. package/dist/obtservices/base/lib/vendor/interfaces/select-filter.interface.d.ts +5 -0
  178. package/dist/obtservices/base/lib/vendor/interfaces/user.data.d.ts +21 -0
  179. package/dist/obtservices/base/lib/vendor/interfaces/value-display.d.ts +4 -0
  180. package/dist/obtservices/base/lib/vendor/models/login.model.d.ts +52 -0
  181. package/dist/obtservices/base/lib/vendor/models/regexp.model.d.ts +10 -0
  182. package/dist/obtservices/base/lib/vendor/models/traveller.object.d.ts +22 -0
  183. package/dist/obtservices/base/lib/vendor/services/enterprise-basket.service.d.ts +177 -0
  184. package/dist/obtservices/base/lib/vendor/services/hotel-avallibility.service.d.ts +31 -0
  185. package/dist/obtservices/base/lib/vendor/services/http-call.service.d.ts +17 -0
  186. package/dist/obtservices/base/lib/vendor/services/logon.service.d.ts +39 -0
  187. package/dist/obtservices/base/lib/vendor/services/modal-opener.service.d.ts +13 -0
  188. package/dist/obtservices/base/lib/vendor/services/my-bookings.service.d.ts +31 -0
  189. package/dist/obtservices/base/lib/vendor/services/routehappy.service.d.ts +47 -0
  190. package/dist/obtservices/base/lib/vendor/services/search.service.d.ts +236 -0
  191. package/dist/obtservices/base/lib/vendor/services/storage.service.d.ts +9 -0
  192. package/dist/obtservices/base/lib/vendor/services/url.service.d.ts +10 -0
  193. package/dist/obtservices/base/lib/vendor/services/user.service.d.ts +62 -0
  194. package/dist/obtservices/base/lib/vendor/services/webtoken.service.d.ts +20 -0
  195. package/dist/obtservices/base/lib/vendor/testers/base.tester.d.ts +11 -0
  196. package/dist/obtservices/base/lib/vendor/testers/postcode-validate.tester.d.ts +17 -0
  197. package/dist/obtservices/base/lib/vendor/testers/validate-mi-free-value.tester.d.ts +17 -0
  198. package/dist/obtservices/base/lib/vendor/types/graphql.types.d.ts +5597 -0
  199. package/dist/obtservices/base/lib/vendor/types/types.d.ts +444 -0
  200. package/dist/obtservices/base/lib/vendor/updaters/accept-new-price.updater.d.ts +20 -0
  201. package/dist/obtservices/base/lib/vendor/updaters/add-item-to-basket.updater.d.ts +20 -0
  202. package/dist/obtservices/base/lib/vendor/updaters/addUserToBasketItem.d.ts +20 -0
  203. package/dist/obtservices/base/lib/vendor/updaters/book-basket-updater.d.ts +20 -0
  204. package/dist/obtservices/base/lib/vendor/updaters/create-basket-updater.d.ts +20 -0
  205. package/dist/obtservices/base/lib/vendor/updaters/move-basket-item-to-basket.d.ts +20 -0
  206. package/dist/obtservices/base/lib/vendor/updaters/object-updater-enterprise.d.ts +11 -0
  207. package/dist/obtservices/base/lib/vendor/updaters/remove-basket-updater.d.ts +19 -0
  208. package/dist/obtservices/base/lib/vendor/updaters/remove-item-from-basket.updater.d.ts +20 -0
  209. package/dist/obtservices/base/lib/vendor/updaters/remove-recent-search-updater.d.ts +19 -0
  210. package/dist/obtservices/base/lib/vendor/updaters/remove-user-address-updater.d.ts +19 -0
  211. package/dist/obtservices/base/lib/vendor/updaters/revalidate-basket-updater.d.ts +20 -0
  212. package/dist/obtservices/base/lib/vendor/updaters/save-recent-search-updater.d.ts +20 -0
  213. package/dist/obtservices/base/lib/vendor/updaters/save-user-address.updater.d.ts +20 -0
  214. package/dist/obtservices/base/lib/vendor/updaters/send-basket-for-approval.updater.d.ts +20 -0
  215. package/dist/obtservices/base/lib/vendor/updaters/set-basket-item-lead-passenger.updater.d.ts +20 -0
  216. package/dist/obtservices/base/lib/vendor/updaters/set-basket-item-mi-group.d.ts +20 -0
  217. package/dist/obtservices/base/lib/vendor/updaters/set-basket-item-mi-value-updater.d.ts +20 -0
  218. package/dist/obtservices/base/lib/vendor/updaters/set-basket-item-paymenr-option.updater.d.ts +20 -0
  219. package/dist/obtservices/base/lib/vendor/updaters/update-basket-notes-updater.d.ts +20 -0
  220. package/dist/obtservices/base/lib/vendor/updaters/update-basket-title-updater.d.ts +20 -0
  221. package/dist/obtservices/base/obtservices-base.d.ts +9 -0
  222. package/dist/obtservices/base/obtservices-base.metadata.json +1 -0
  223. package/dist/obtservices/base/package.json +11 -0
  224. package/dist/obtservices/bundles/obtservices-angular.umd.js +32033 -0
  225. package/dist/obtservices/bundles/obtservices-angular.umd.js.map +1 -0
  226. package/dist/obtservices/bundles/obtservices-angular.umd.min.js +2 -0
  227. package/dist/obtservices/bundles/obtservices-angular.umd.min.js.map +1 -0
  228. package/dist/obtservices/bundles/obtservices-base.umd.js +18609 -0
  229. package/dist/obtservices/bundles/obtservices-base.umd.js.map +1 -0
  230. package/dist/obtservices/bundles/obtservices-base.umd.min.js +16 -0
  231. package/dist/obtservices/bundles/obtservices-base.umd.min.js.map +1 -0
  232. package/dist/obtservices/bundles/obtservices.umd.js +18 -0
  233. package/dist/obtservices/bundles/obtservices.umd.js.map +1 -0
  234. package/dist/obtservices/bundles/obtservices.umd.min.js +2 -0
  235. package/dist/obtservices/bundles/obtservices.umd.min.js.map +1 -0
  236. package/dist/obtservices/esm2015/angular/classes.js +4 -0
  237. package/dist/obtservices/esm2015/angular/components/basket-panel.js +113 -0
  238. package/dist/obtservices/esm2015/angular/components/with-component.js +26 -0
  239. package/dist/obtservices/esm2015/angular/components.js +3 -0
  240. package/dist/obtservices/esm2015/angular/data.js +5 -0
  241. package/dist/obtservices/esm2015/angular/fetchers.js +33 -0
  242. package/dist/obtservices/esm2015/angular/lib/vendor/classes/environment.js +10 -0
  243. package/dist/obtservices/esm2015/angular/lib/vendor/classes/event-messenager.js +16 -0
  244. package/dist/obtservices/esm2015/angular/lib/vendor/classes/helpers.js +81 -0
  245. package/dist/obtservices/esm2015/angular/lib/vendor/data/airports.data.json +5508 -0
  246. package/dist/obtservices/esm2015/angular/lib/vendor/data/flight-booking.data.json +136 -0
  247. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/basket-fetcher.js +22 -0
  248. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/cabhire-quote-fetcher.js +25 -0
  249. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/carhire-availability-detail.fetcher.js +25 -0
  250. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/carhire-quote-fetcher.js +25 -0
  251. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/conferma-office-names.fetcher.js +25 -0
  252. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/conferma-quicklist.fetcher.js +25 -0
  253. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/eurostar-quote.fetcher.js +25 -0
  254. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/flight-quote.fetcher.js +25 -0
  255. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-rail-cards.fetcher.js +25 -0
  256. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-rail-station.fetcher.js +25 -0
  257. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-risk-alerts.fetcher.js +25 -0
  258. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-user-company-offices.fetcher.js +25 -0
  259. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.js +25 -0
  260. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-user-recent-searches.fetcher.js +25 -0
  261. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/get-users-baskets-fetcher.js +25 -0
  262. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/getMiAutoSugestions.fetcher.js +25 -0
  263. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/hotel-avaliability-fetcher.js +25 -0
  264. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/hotel-quote-fetcher.js +25 -0
  265. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/irl-quote-fetcher.js +25 -0
  266. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/lounge-quote.fetcher.js +25 -0
  267. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/parking-quote-fetcher.js +25 -0
  268. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/rail-quote-fetcher.js +25 -0
  269. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-airlines-fetcher.js +22 -0
  270. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-airports-fetcher.js +22 -0
  271. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-cities.fetcher.js +25 -0
  272. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.js +22 -0
  273. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-depots.fetcher.js +25 -0
  274. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-hotel-chains.fetcher.js +25 -0
  275. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-postcodes.fetcher.js +25 -0
  276. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-rail-stations.fetcher.js +25 -0
  277. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/search-users-can-book-for-fetcher.js +25 -0
  278. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-addresses.fetcher.js +25 -0
  279. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-fetcher.js +22 -0
  280. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-message.fetcher.js +25 -0
  281. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-products-fetcher.js +25 -0
  282. package/dist/obtservices/esm2015/angular/lib/vendor/fetchers/user-ui-configs-fetcher.js +25 -0
  283. package/dist/obtservices/esm2015/angular/lib/vendor/services/enterprise-basket.service.js +91 -0
  284. package/dist/obtservices/esm2015/angular/lib/vendor/services/hotel-avallibility.service.js +28 -0
  285. package/dist/obtservices/esm2015/angular/lib/vendor/services/http-call.service.js +220 -0
  286. package/dist/obtservices/esm2015/angular/lib/vendor/services/logon.service.js +41 -0
  287. package/dist/obtservices/esm2015/angular/lib/vendor/services/modal-opener.service.js +15 -0
  288. package/dist/obtservices/esm2015/angular/lib/vendor/services/my-bookings.service.js +22 -0
  289. package/dist/obtservices/esm2015/angular/lib/vendor/services/route-happy.service.js +22 -0
  290. package/dist/obtservices/esm2015/angular/lib/vendor/services/search.service.js +142 -0
  291. package/dist/obtservices/esm2015/angular/lib/vendor/services/storage.service.js +79 -0
  292. package/dist/obtservices/esm2015/angular/lib/vendor/services/user.service.js +31 -0
  293. package/dist/obtservices/esm2015/angular/lib/vendor/services/webtoken.service.js +59 -0
  294. package/dist/obtservices/esm2015/angular/lib/vendor/testers/postcode-validate.tester.js +22 -0
  295. package/dist/obtservices/esm2015/angular/lib/vendor/testers/validate-mi-free-value.tester.js +22 -0
  296. package/dist/obtservices/esm2015/angular/lib/vendor/types/graphql.angular.types.js +5662 -0
  297. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/accept-new-price.updater.js +22 -0
  298. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/add-item-to-basket.updater.js +22 -0
  299. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/addUserToBasketItem.js +22 -0
  300. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/book-basket-updater.js +22 -0
  301. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/create-basket-updater.js +22 -0
  302. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/move-basket-item-to-basket.js +22 -0
  303. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/remove-basket-updater.js +22 -0
  304. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/remove-item-from-basket.updater.js +22 -0
  305. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/remove-recent-search.updater.js +22 -0
  306. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/remove-user-address.updater.js +22 -0
  307. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/revalidate-basket-updater.js +22 -0
  308. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/save-recent-search.updater.js +22 -0
  309. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/save-user-address.updater.js +22 -0
  310. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/send-basket-for-approval.updater.js +22 -0
  311. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/set-basket-item-lead-passenger.updater.js +22 -0
  312. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/set-basket-item-mi-group.js +22 -0
  313. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/set-basket-item-mi-value-updater.js +22 -0
  314. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/set-payment-option.updater.js +22 -0
  315. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/update-basket-notes-updater.js +22 -0
  316. package/dist/obtservices/esm2015/angular/lib/vendor/updaters/update-basket-title-updater.js +22 -0
  317. package/dist/obtservices/esm2015/angular/obtservices-angular.js +18 -0
  318. package/dist/obtservices/esm2015/angular/obtservices.module.js +128 -0
  319. package/dist/obtservices/esm2015/angular/public_api.js +9 -0
  320. package/dist/obtservices/esm2015/angular/services.js +12 -0
  321. package/dist/obtservices/esm2015/angular/types.js +2 -0
  322. package/dist/obtservices/esm2015/angular/updaters.js +14 -0
  323. package/dist/obtservices/esm2015/base/classes.js +28 -0
  324. package/dist/obtservices/esm2015/base/fetchers.js +37 -0
  325. package/dist/obtservices/esm2015/base/interfaces.js +30 -0
  326. package/dist/obtservices/esm2015/base/lib/vendor/classes/base-enterprise.js +78 -0
  327. package/dist/obtservices/esm2015/base/lib/vendor/classes/base-network-call.js +24 -0
  328. package/dist/obtservices/esm2015/base/lib/vendor/classes/basket-info-mi-details.impl.js +35 -0
  329. package/dist/obtservices/esm2015/base/lib/vendor/classes/bookable-basket.js +237 -0
  330. package/dist/obtservices/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +696 -0
  331. package/dist/obtservices/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +1204 -0
  332. package/dist/obtservices/esm2015/base/lib/vendor/classes/enviroment.js +12 -0
  333. package/dist/obtservices/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +1462 -0
  334. package/dist/obtservices/esm2015/base/lib/vendor/classes/eurostar-search-type.enum.js +6 -0
  335. package/dist/obtservices/esm2015/base/lib/vendor/classes/event-messenager.js +17 -0
  336. package/dist/obtservices/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +1640 -0
  337. package/dist/obtservices/esm2015/base/lib/vendor/classes/flight-search-type.enum.js +7 -0
  338. package/dist/obtservices/esm2015/base/lib/vendor/classes/helpers.js +978 -0
  339. package/dist/obtservices/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +1022 -0
  340. package/dist/obtservices/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +1117 -0
  341. package/dist/obtservices/esm2015/base/lib/vendor/classes/limited-cache.class.js +64 -0
  342. package/dist/obtservices/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +323 -0
  343. package/dist/obtservices/esm2015/base/lib/vendor/classes/management-info-and-valid.js +174 -0
  344. package/dist/obtservices/esm2015/base/lib/vendor/classes/modal-types.enum.js +22 -0
  345. package/dist/obtservices/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +397 -0
  346. package/dist/obtservices/esm2015/base/lib/vendor/classes/rail-direction.enum.js +6 -0
  347. package/dist/obtservices/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +1324 -0
  348. package/dist/obtservices/esm2015/base/lib/vendor/classes/routehappy-request.js +2 -0
  349. package/dist/obtservices/esm2015/base/lib/vendor/classes/routehappy-response.js +8 -0
  350. package/dist/obtservices/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +250 -0
  351. package/dist/obtservices/esm2015/base/lib/vendor/classes/user-favourite.enum.js +15 -0
  352. package/dist/obtservices/esm2015/base/lib/vendor/classes/validator.checker.js +4 -0
  353. package/dist/obtservices/esm2015/base/lib/vendor/data/countries.json +1212 -0
  354. package/dist/obtservices/esm2015/base/lib/vendor/data/euro-stations.json +30 -0
  355. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/basket-fetcher.js +11 -0
  356. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/cabhire-quote-fetcher.js +11 -0
  357. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/carhire-availability-detail.fetcher.js +10 -0
  358. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/carhire-quote-fetcher.js +11 -0
  359. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/conferma-office-names.fetcher.js +11 -0
  360. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/conferma-quicklist.fetcher.js +11 -0
  361. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/eurostar-quote.fetcher.js +11 -0
  362. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/flight-quote.fetcher.js +11 -0
  363. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-rail-cards.fetcher.js +11 -0
  364. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-rail-station.fetcher.js +11 -0
  365. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-risk-alerts.fetcher.js +11 -0
  366. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-user-company-offices.fetcher.js +11 -0
  367. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.js +10 -0
  368. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-user-recent-searches.fetcher.js +10 -0
  369. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/get-users-baskets-fetcher.js +10 -0
  370. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/getMiAutoSugestions.fetcher.js +10 -0
  371. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/hotel-avaliability-fetcher.js +22 -0
  372. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/hotel-quote-fetcher.js +11 -0
  373. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/irl-quote-fetcher.js +11 -0
  374. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/list-fetchable-enterprise.js +27 -0
  375. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/lounge-quote.fetcher.js +11 -0
  376. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/object-fetchable-enterprise.js +11 -0
  377. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/parking-quote-fetcher.js +11 -0
  378. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/rail-quote-fetcher.js +11 -0
  379. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-airlines.fetcher.js +11 -0
  380. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-airports-fetcher.js +10 -0
  381. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-cities.fetcher.js +11 -0
  382. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-conferma-cities.fetcher.js +11 -0
  383. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-depots.fetcher.js +10 -0
  384. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-hotel-chains.fetcher.js +11 -0
  385. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-postcodes.fetcher.js +11 -0
  386. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-rail-stations.fetcher.js +11 -0
  387. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.js +11 -0
  388. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-addresses.fetcher.js +11 -0
  389. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-fetcher.js +10 -0
  390. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-message.fetcher.js +11 -0
  391. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-products-fetcher.js +11 -0
  392. package/dist/obtservices/esm2015/base/lib/vendor/fetchers/user-ui-configs-fetcher.js +11 -0
  393. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +17 -0
  394. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +2 -0
  395. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +2 -0
  396. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +2 -0
  397. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +2 -0
  398. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +18 -0
  399. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +2 -0
  400. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +2 -0
  401. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Imybookings.service.js +2 -0
  402. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +2 -0
  403. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +2 -0
  404. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Isearch.service.js +2 -0
  405. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.js +2 -0
  406. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/Iuser.service.js +2 -0
  407. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/car-hire-classes.interface.js +2 -0
  408. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/car-hire-filters.interface.js +2 -0
  409. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/car-hire-sort.interface.js +2 -0
  410. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/cheapest-price.js +2 -0
  411. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/code-name.js +2 -0
  412. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/flight-filters.interface.js +2 -0
  413. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/flight-multi-destination.interface.js +2 -0
  414. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-airport-express-stations.interface.js +2 -0
  415. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +2 -0
  416. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-journey-leg.interface.js +2 -0
  417. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-recent-search-args.interface.js +2 -0
  418. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-selected-ticket.interface.js +2 -0
  419. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-ticket-group.interface.js +2 -0
  420. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/rail-ticket-groups.interface.js +2 -0
  421. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/search-objects.interface.js +2 -0
  422. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/select-filter.interface.js +2 -0
  423. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/user.data.js +2 -0
  424. package/dist/obtservices/esm2015/base/lib/vendor/interfaces/value-display.js +2 -0
  425. package/dist/obtservices/esm2015/base/lib/vendor/models/login.model.js +71 -0
  426. package/dist/obtservices/esm2015/base/lib/vendor/models/regexp.model.js +13 -0
  427. package/dist/obtservices/esm2015/base/lib/vendor/models/traveller.object.js +38 -0
  428. package/dist/obtservices/esm2015/base/lib/vendor/services/enterprise-basket.service.js +669 -0
  429. package/dist/obtservices/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +165 -0
  430. package/dist/obtservices/esm2015/base/lib/vendor/services/http-call.service.js +16 -0
  431. package/dist/obtservices/esm2015/base/lib/vendor/services/logon.service.js +177 -0
  432. package/dist/obtservices/esm2015/base/lib/vendor/services/modal-opener.service.js +20 -0
  433. package/dist/obtservices/esm2015/base/lib/vendor/services/my-bookings.service.js +124 -0
  434. package/dist/obtservices/esm2015/base/lib/vendor/services/routehappy.service.js +196 -0
  435. package/dist/obtservices/esm2015/base/lib/vendor/services/search.service.js +1281 -0
  436. package/dist/obtservices/esm2015/base/lib/vendor/services/storage.service.js +3 -0
  437. package/dist/obtservices/esm2015/base/lib/vendor/services/url.service.js +12 -0
  438. package/dist/obtservices/esm2015/base/lib/vendor/services/user.service.js +223 -0
  439. package/dist/obtservices/esm2015/base/lib/vendor/services/webtoken.service.js +56 -0
  440. package/dist/obtservices/esm2015/base/lib/vendor/testers/base.tester.js +11 -0
  441. package/dist/obtservices/esm2015/base/lib/vendor/testers/postcode-validate.tester.js +10 -0
  442. package/dist/obtservices/esm2015/base/lib/vendor/testers/validate-mi-free-value.tester.js +10 -0
  443. package/dist/obtservices/esm2015/base/lib/vendor/types/graphql.types.js +456 -0
  444. package/dist/obtservices/esm2015/base/lib/vendor/types/types.js +161 -0
  445. package/dist/obtservices/esm2015/base/lib/vendor/updaters/accept-new-price.updater.js +10 -0
  446. package/dist/obtservices/esm2015/base/lib/vendor/updaters/add-item-to-basket.updater.js +10 -0
  447. package/dist/obtservices/esm2015/base/lib/vendor/updaters/addUserToBasketItem.js +10 -0
  448. package/dist/obtservices/esm2015/base/lib/vendor/updaters/book-basket-updater.js +11 -0
  449. package/dist/obtservices/esm2015/base/lib/vendor/updaters/create-basket-updater.js +11 -0
  450. package/dist/obtservices/esm2015/base/lib/vendor/updaters/move-basket-item-to-basket.js +10 -0
  451. package/dist/obtservices/esm2015/base/lib/vendor/updaters/object-updater-enterprise.js +11 -0
  452. package/dist/obtservices/esm2015/base/lib/vendor/updaters/remove-basket-updater.js +11 -0
  453. package/dist/obtservices/esm2015/base/lib/vendor/updaters/remove-item-from-basket.updater.js +10 -0
  454. package/dist/obtservices/esm2015/base/lib/vendor/updaters/remove-recent-search-updater.js +11 -0
  455. package/dist/obtservices/esm2015/base/lib/vendor/updaters/remove-user-address-updater.js +11 -0
  456. package/dist/obtservices/esm2015/base/lib/vendor/updaters/revalidate-basket-updater.js +10 -0
  457. package/dist/obtservices/esm2015/base/lib/vendor/updaters/save-recent-search-updater.js +11 -0
  458. package/dist/obtservices/esm2015/base/lib/vendor/updaters/save-user-address.updater.js +10 -0
  459. package/dist/obtservices/esm2015/base/lib/vendor/updaters/send-basket-for-approval.updater.js +10 -0
  460. package/dist/obtservices/esm2015/base/lib/vendor/updaters/set-basket-item-lead-passenger.updater.js +10 -0
  461. package/dist/obtservices/esm2015/base/lib/vendor/updaters/set-basket-item-mi-group.js +10 -0
  462. package/dist/obtservices/esm2015/base/lib/vendor/updaters/set-basket-item-mi-value-updater.js +10 -0
  463. package/dist/obtservices/esm2015/base/lib/vendor/updaters/set-basket-item-paymenr-option.updater.js +10 -0
  464. package/dist/obtservices/esm2015/base/lib/vendor/updaters/update-basket-notes-updater.js +10 -0
  465. package/dist/obtservices/esm2015/base/lib/vendor/updaters/update-basket-title-updater.js +10 -0
  466. package/dist/obtservices/esm2015/base/models.js +4 -0
  467. package/dist/obtservices/esm2015/base/obtservices-base.js +9 -0
  468. package/dist/obtservices/esm2015/base/public_api.js +9 -0
  469. package/dist/obtservices/esm2015/base/services.js +13 -0
  470. package/dist/obtservices/esm2015/base/testers.js +3 -0
  471. package/dist/obtservices/esm2015/base/types.js +2 -0
  472. package/dist/obtservices/esm2015/base/updaters.js +21 -0
  473. package/dist/obtservices/esm2015/obtservices.js +5 -0
  474. package/dist/obtservices/esm2015/public_api.js +2 -0
  475. package/dist/obtservices/fesm2015/obtservices-angular.js +35267 -0
  476. package/dist/obtservices/fesm2015/obtservices-angular.js.map +1 -0
  477. package/dist/obtservices/fesm2015/obtservices-base.js +16573 -0
  478. package/dist/obtservices/fesm2015/obtservices-base.js.map +1 -0
  479. package/dist/obtservices/fesm2015/obtservices.js +8 -0
  480. package/dist/obtservices/fesm2015/obtservices.js.map +1 -0
  481. package/dist/obtservices/obtservices.d.ts +4 -0
  482. package/dist/obtservices/obtservices.metadata.json +1 -0
  483. package/dist/obtservices/package.json +23 -0
  484. package/dist/obtservices/public_api.d.ts +1 -0
  485. package/dist/obtservices/tsconfig.lib.tsbuildinfo +3 -0
  486. package/package.json +4 -1
  487. package/.editorconfig +0 -13
  488. package/.gitmodules +0 -0
  489. package/.vscode/settings.json +0 -4
  490. package/angular.json +0 -45
  491. package/audit.config.json +0 -6
  492. package/codegen.yml +0 -18
  493. package/ng-package.json +0 -7
  494. package/projects/obtservices/angular/package.json +0 -3
  495. package/projects/obtservices/angular/src/components/basket-panel.ts +0 -139
  496. package/projects/obtservices/angular/src/components/with-component.ts +0 -40
  497. package/projects/obtservices/angular/src/data.ts +0 -5
  498. package/projects/obtservices/angular/src/fetchers.ts +0 -32
  499. package/projects/obtservices/angular/src/lib/vendor/classes/environment.ts +0 -5
  500. package/projects/obtservices/angular/src/lib/vendor/classes/event-messenager.ts +0 -11
  501. package/projects/obtservices/angular/src/lib/vendor/classes/helpers.ts +0 -87
  502. package/projects/obtservices/angular/src/lib/vendor/data/airports.data.json +0 -5508
  503. package/projects/obtservices/angular/src/lib/vendor/data/animations.ts +0 -38
  504. package/projects/obtservices/angular/src/lib/vendor/data/booking-expected-responses.json +0 -100
  505. package/projects/obtservices/angular/src/lib/vendor/data/cities.data.json +0 -31499
  506. package/projects/obtservices/angular/src/lib/vendor/data/countries.json +0 -1212
  507. package/projects/obtservices/angular/src/lib/vendor/data/flight-booking.data.json +0 -136
  508. package/projects/obtservices/angular/src/lib/vendor/data/postcodes1.json +0 -194
  509. package/projects/obtservices/angular/src/lib/vendor/data/rail_addresses.json +0 -2524
  510. package/projects/obtservices/angular/src/lib/vendor/fetchers/basket-fetcher.ts +0 -14
  511. package/projects/obtservices/angular/src/lib/vendor/fetchers/cabhire-quote-fetcher.ts +0 -15
  512. package/projects/obtservices/angular/src/lib/vendor/fetchers/carhire-availability-detail.fetcher.ts +0 -17
  513. package/projects/obtservices/angular/src/lib/vendor/fetchers/carhire-quote-fetcher.ts +0 -16
  514. package/projects/obtservices/angular/src/lib/vendor/fetchers/conferma-office-names.fetcher.ts +0 -16
  515. package/projects/obtservices/angular/src/lib/vendor/fetchers/conferma-quicklist.fetcher.ts +0 -16
  516. package/projects/obtservices/angular/src/lib/vendor/fetchers/eurostar-quote.fetcher.ts +0 -16
  517. package/projects/obtservices/angular/src/lib/vendor/fetchers/flight-quote.fetcher.ts +0 -16
  518. package/projects/obtservices/angular/src/lib/vendor/fetchers/get-rail-cards.fetcher.ts +0 -16
  519. package/projects/obtservices/angular/src/lib/vendor/fetchers/get-rail-station.fetcher.ts +0 -16
  520. package/projects/obtservices/angular/src/lib/vendor/fetchers/get-risk-alerts.fetcher.ts +0 -18
  521. package/projects/obtservices/angular/src/lib/vendor/fetchers/get-user-company-offices.fetcher.ts +0 -16
  522. package/projects/obtservices/angular/src/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.ts +0 -16
  523. package/projects/obtservices/angular/src/lib/vendor/fetchers/get-user-recent-searches.fetcher.ts +0 -16
  524. package/projects/obtservices/angular/src/lib/vendor/fetchers/get-users-baskets-fetcher.ts +0 -16
  525. package/projects/obtservices/angular/src/lib/vendor/fetchers/getMiAutoSugestions.fetcher.ts +0 -16
  526. package/projects/obtservices/angular/src/lib/vendor/fetchers/hotel-avaliability-fetcher.ts +0 -17
  527. package/projects/obtservices/angular/src/lib/vendor/fetchers/hotel-quote-fetcher.ts +0 -16
  528. package/projects/obtservices/angular/src/lib/vendor/fetchers/irl-quote-fetcher.ts +0 -16
  529. package/projects/obtservices/angular/src/lib/vendor/fetchers/lounge-quote.fetcher.ts +0 -16
  530. package/projects/obtservices/angular/src/lib/vendor/fetchers/parking-quote-fetcher.ts +0 -16
  531. package/projects/obtservices/angular/src/lib/vendor/fetchers/rail-quote-fetcher.ts +0 -16
  532. package/projects/obtservices/angular/src/lib/vendor/fetchers/search-airlines-fetcher.ts +0 -14
  533. package/projects/obtservices/angular/src/lib/vendor/fetchers/search-airports-fetcher.ts +0 -14
  534. package/projects/obtservices/angular/src/lib/vendor/fetchers/search-cities.fetcher.ts +0 -16
  535. package/projects/obtservices/angular/src/lib/vendor/fetchers/search-conferma-cities.fetcher.ts +0 -14
  536. package/projects/obtservices/angular/src/lib/vendor/fetchers/search-depots.fetcher.ts +0 -18
  537. package/projects/obtservices/angular/src/lib/vendor/fetchers/search-hotel-chains.fetcher.ts +0 -16
  538. package/projects/obtservices/angular/src/lib/vendor/fetchers/search-postcodes.fetcher.ts +0 -16
  539. package/projects/obtservices/angular/src/lib/vendor/fetchers/search-rail-stations.fetcher.ts +0 -16
  540. package/projects/obtservices/angular/src/lib/vendor/fetchers/search-users-can-book-for-fetcher.ts +0 -16
  541. package/projects/obtservices/angular/src/lib/vendor/fetchers/user-addresses.fetcher.ts +0 -16
  542. package/projects/obtservices/angular/src/lib/vendor/fetchers/user-fetcher.ts +0 -14
  543. package/projects/obtservices/angular/src/lib/vendor/fetchers/user-message.fetcher.ts +0 -16
  544. package/projects/obtservices/angular/src/lib/vendor/fetchers/user-products-fetcher.ts +0 -16
  545. package/projects/obtservices/angular/src/lib/vendor/fetchers/user-ui-configs-fetcher.ts +0 -16
  546. package/projects/obtservices/angular/src/lib/vendor/services/enterprise-basket.service.ts +0 -133
  547. package/projects/obtservices/angular/src/lib/vendor/services/hotel-avallibility.service.ts +0 -19
  548. package/projects/obtservices/angular/src/lib/vendor/services/http-call.service.ts +0 -252
  549. package/projects/obtservices/angular/src/lib/vendor/services/logon.service.ts +0 -40
  550. package/projects/obtservices/angular/src/lib/vendor/services/modal-opener.service.ts +0 -9
  551. package/projects/obtservices/angular/src/lib/vendor/services/my-bookings.service.ts +0 -21
  552. package/projects/obtservices/angular/src/lib/vendor/services/route-happy.service.ts +0 -11
  553. package/projects/obtservices/angular/src/lib/vendor/services/search.service.ts +0 -213
  554. package/projects/obtservices/angular/src/lib/vendor/services/storage.service.ts +0 -82
  555. package/projects/obtservices/angular/src/lib/vendor/services/user.service.ts +0 -36
  556. package/projects/obtservices/angular/src/lib/vendor/services/webtoken.service.ts +0 -62
  557. package/projects/obtservices/angular/src/lib/vendor/testers/postcode-validate.tester.ts +0 -14
  558. package/projects/obtservices/angular/src/lib/vendor/testers/validate-mi-free-value.tester.ts +0 -14
  559. package/projects/obtservices/angular/src/lib/vendor/types/graphql.angular.types.ts +0 -11081
  560. package/projects/obtservices/angular/src/lib/vendor/updaters/accept-new-price.updater.ts +0 -14
  561. package/projects/obtservices/angular/src/lib/vendor/updaters/add-item-to-basket.updater.ts +0 -14
  562. package/projects/obtservices/angular/src/lib/vendor/updaters/addUserToBasketItem.ts +0 -14
  563. package/projects/obtservices/angular/src/lib/vendor/updaters/book-basket-updater.ts +0 -14
  564. package/projects/obtservices/angular/src/lib/vendor/updaters/create-basket-updater.ts +0 -14
  565. package/projects/obtservices/angular/src/lib/vendor/updaters/move-basket-item-to-basket.ts +0 -14
  566. package/projects/obtservices/angular/src/lib/vendor/updaters/remove-basket-updater.ts +0 -14
  567. package/projects/obtservices/angular/src/lib/vendor/updaters/remove-item-from-basket.updater.ts +0 -14
  568. package/projects/obtservices/angular/src/lib/vendor/updaters/remove-recent-search.updater.ts +0 -14
  569. package/projects/obtservices/angular/src/lib/vendor/updaters/remove-user-address.updater.ts +0 -14
  570. package/projects/obtservices/angular/src/lib/vendor/updaters/revalidate-basket-updater.ts +0 -14
  571. package/projects/obtservices/angular/src/lib/vendor/updaters/save-recent-search.updater.ts +0 -14
  572. package/projects/obtservices/angular/src/lib/vendor/updaters/save-user-address.updater.ts +0 -11
  573. package/projects/obtservices/angular/src/lib/vendor/updaters/send-basket-for-approval.updater.ts +0 -14
  574. package/projects/obtservices/angular/src/lib/vendor/updaters/set-basket-item-lead-passenger.updater.ts +0 -14
  575. package/projects/obtservices/angular/src/lib/vendor/updaters/set-basket-item-mi-group.ts +0 -14
  576. package/projects/obtservices/angular/src/lib/vendor/updaters/set-basket-item-mi-value-updater.ts +0 -15
  577. package/projects/obtservices/angular/src/lib/vendor/updaters/set-payment-option.updater.ts +0 -15
  578. package/projects/obtservices/angular/src/lib/vendor/updaters/update-basket-notes-updater.ts +0 -14
  579. package/projects/obtservices/angular/src/lib/vendor/updaters/update-basket-title-updater.ts +0 -14
  580. package/projects/obtservices/angular/src/obtservices.module.ts +0 -131
  581. package/projects/obtservices/base/package.json +0 -3
  582. package/projects/obtservices/base/src/custom.d.ts +0 -3
  583. package/projects/obtservices/base/src/fetchers.ts +0 -36
  584. package/projects/obtservices/base/src/lib/vendor/classes/base-enterprise.ts +0 -126
  585. package/projects/obtservices/base/src/lib/vendor/classes/base-network-call.ts +0 -40
  586. package/projects/obtservices/base/src/lib/vendor/classes/basket-info-mi-details.impl.ts +0 -68
  587. package/projects/obtservices/base/src/lib/vendor/classes/bookable-basket.ts +0 -343
  588. package/projects/obtservices/base/src/lib/vendor/classes/cabhire-enterprise-search.ts +0 -907
  589. package/projects/obtservices/base/src/lib/vendor/classes/carhire-enterprise-search.ts +0 -1597
  590. package/projects/obtservices/base/src/lib/vendor/classes/empty-enterprise-search.ts +0 -75
  591. package/projects/obtservices/base/src/lib/vendor/classes/enviroment.ts +0 -25
  592. package/projects/obtservices/base/src/lib/vendor/classes/eurostar-enterprise-search.ts +0 -2126
  593. package/projects/obtservices/base/src/lib/vendor/classes/eurostar-search-type.enum.ts +0 -4
  594. package/projects/obtservices/base/src/lib/vendor/classes/event-messenager.ts +0 -23
  595. package/projects/obtservices/base/src/lib/vendor/classes/flight-enterprise-search.ts +0 -2399
  596. package/projects/obtservices/base/src/lib/vendor/classes/flight-search-type.enum.ts +0 -5
  597. package/projects/obtservices/base/src/lib/vendor/classes/helpers.ts +0 -1233
  598. package/projects/obtservices/base/src/lib/vendor/classes/hotel-enterprise-search.ts +0 -1370
  599. package/projects/obtservices/base/src/lib/vendor/classes/irl-enterprise-search.ts +0 -1380
  600. package/projects/obtservices/base/src/lib/vendor/classes/limited-cache.class.ts +0 -70
  601. package/projects/obtservices/base/src/lib/vendor/classes/lounges-enterprise-search.ts +0 -444
  602. package/projects/obtservices/base/src/lib/vendor/classes/management-info-and-valid.ts +0 -268
  603. package/projects/obtservices/base/src/lib/vendor/classes/modal-types.enum.ts +0 -28
  604. package/projects/obtservices/base/src/lib/vendor/classes/parking-enterprise-search.ts +0 -541
  605. package/projects/obtservices/base/src/lib/vendor/classes/rail-direction.enum.ts +0 -4
  606. package/projects/obtservices/base/src/lib/vendor/classes/rail-enterprise-search.ts +0 -1751
  607. package/projects/obtservices/base/src/lib/vendor/classes/routehappy-request.ts +0 -146
  608. package/projects/obtservices/base/src/lib/vendor/classes/routehappy-response.ts +0 -128
  609. package/projects/obtservices/base/src/lib/vendor/classes/supplementary-booking-info-impl.ts +0 -375
  610. package/projects/obtservices/base/src/lib/vendor/classes/user-favourite.enum.ts +0 -12
  611. package/projects/obtservices/base/src/lib/vendor/classes/validator.checker.ts +0 -7
  612. package/projects/obtservices/base/src/lib/vendor/data/airports.data.json +0 -5508
  613. package/projects/obtservices/base/src/lib/vendor/data/booking-expected-responses.json +0 -100
  614. package/projects/obtservices/base/src/lib/vendor/data/cities.data.json +0 -31499
  615. package/projects/obtservices/base/src/lib/vendor/data/countries.json +0 -1212
  616. package/projects/obtservices/base/src/lib/vendor/data/euro-stations.json +0 -30
  617. package/projects/obtservices/base/src/lib/vendor/data/flight-booking.data.json +0 -136
  618. package/projects/obtservices/base/src/lib/vendor/data/postcodes1.json +0 -194
  619. package/projects/obtservices/base/src/lib/vendor/data/rail_addresses.json +0 -2524
  620. package/projects/obtservices/base/src/lib/vendor/fetchers/basket-fetcher.ts +0 -29
  621. package/projects/obtservices/base/src/lib/vendor/fetchers/cabhire-quote-fetcher.ts +0 -34
  622. package/projects/obtservices/base/src/lib/vendor/fetchers/carhire-availability-detail.fetcher.ts +0 -35
  623. package/projects/obtservices/base/src/lib/vendor/fetchers/carhire-quote-fetcher.ts +0 -34
  624. package/projects/obtservices/base/src/lib/vendor/fetchers/conferma-office-names.fetcher.ts +0 -34
  625. package/projects/obtservices/base/src/lib/vendor/fetchers/conferma-quicklist.fetcher.ts +0 -35
  626. package/projects/obtservices/base/src/lib/vendor/fetchers/eurostar-quote.fetcher.ts +0 -35
  627. package/projects/obtservices/base/src/lib/vendor/fetchers/flight-quote.fetcher.ts +0 -35
  628. package/projects/obtservices/base/src/lib/vendor/fetchers/get-rail-cards.fetcher.ts +0 -35
  629. package/projects/obtservices/base/src/lib/vendor/fetchers/get-rail-station.fetcher.ts +0 -35
  630. package/projects/obtservices/base/src/lib/vendor/fetchers/get-risk-alerts.fetcher.ts +0 -35
  631. package/projects/obtservices/base/src/lib/vendor/fetchers/get-user-company-offices.fetcher.ts +0 -34
  632. package/projects/obtservices/base/src/lib/vendor/fetchers/get-user-current-carbon-allowance.fetcher.ts +0 -35
  633. package/projects/obtservices/base/src/lib/vendor/fetchers/get-user-recent-searches.fetcher.ts +0 -36
  634. package/projects/obtservices/base/src/lib/vendor/fetchers/get-users-baskets-fetcher.ts +0 -33
  635. package/projects/obtservices/base/src/lib/vendor/fetchers/getMiAutoSugestions.fetcher.ts +0 -35
  636. package/projects/obtservices/base/src/lib/vendor/fetchers/hotel-avaliability-fetcher.ts +0 -53
  637. package/projects/obtservices/base/src/lib/vendor/fetchers/hotel-quote-fetcher.ts +0 -35
  638. package/projects/obtservices/base/src/lib/vendor/fetchers/irl-quote-fetcher.ts +0 -34
  639. package/projects/obtservices/base/src/lib/vendor/fetchers/list-fetchable-enterprise.ts +0 -59
  640. package/projects/obtservices/base/src/lib/vendor/fetchers/lounge-quote.fetcher.ts +0 -34
  641. package/projects/obtservices/base/src/lib/vendor/fetchers/object-fetchable-enterprise.ts +0 -20
  642. package/projects/obtservices/base/src/lib/vendor/fetchers/parking-quote-fetcher.ts +0 -34
  643. package/projects/obtservices/base/src/lib/vendor/fetchers/rail-quote-fetcher.ts +0 -34
  644. package/projects/obtservices/base/src/lib/vendor/fetchers/search-airlines.fetcher.ts +0 -30
  645. package/projects/obtservices/base/src/lib/vendor/fetchers/search-airports-fetcher.ts +0 -29
  646. package/projects/obtservices/base/src/lib/vendor/fetchers/search-cities.fetcher.ts +0 -34
  647. package/projects/obtservices/base/src/lib/vendor/fetchers/search-conferma-cities.fetcher.ts +0 -32
  648. package/projects/obtservices/base/src/lib/vendor/fetchers/search-depots.fetcher.ts +0 -34
  649. package/projects/obtservices/base/src/lib/vendor/fetchers/search-hotel-chains.fetcher.ts +0 -34
  650. package/projects/obtservices/base/src/lib/vendor/fetchers/search-postcodes.fetcher.ts +0 -37
  651. package/projects/obtservices/base/src/lib/vendor/fetchers/search-rail-stations.fetcher.ts +0 -35
  652. package/projects/obtservices/base/src/lib/vendor/fetchers/search-users-can-book-for-fetcher.ts +0 -35
  653. package/projects/obtservices/base/src/lib/vendor/fetchers/user-addresses.fetcher.ts +0 -34
  654. package/projects/obtservices/base/src/lib/vendor/fetchers/user-fetcher.ts +0 -27
  655. package/projects/obtservices/base/src/lib/vendor/fetchers/user-message.fetcher.ts +0 -34
  656. package/projects/obtservices/base/src/lib/vendor/fetchers/user-products-fetcher.ts +0 -35
  657. package/projects/obtservices/base/src/lib/vendor/fetchers/user-ui-configs-fetcher.ts +0 -35
  658. package/projects/obtservices/base/src/lib/vendor/interfaces/Icabhire-enterprise-search.ts +0 -174
  659. package/projects/obtservices/base/src/lib/vendor/interfaces/Icarhire-enterprise-search.ts +0 -143
  660. package/projects/obtservices/base/src/lib/vendor/interfaces/Ienterprise-basket.service.ts +0 -127
  661. package/projects/obtservices/base/src/lib/vendor/interfaces/Ieurostar-enterprise-search.ts +0 -197
  662. package/projects/obtservices/base/src/lib/vendor/interfaces/Iflight-enterprise-search.ts +0 -196
  663. package/projects/obtservices/base/src/lib/vendor/interfaces/Ihotel-enterprise-search.ts +0 -219
  664. package/projects/obtservices/base/src/lib/vendor/interfaces/Iirl-enterprise-search.ts +0 -135
  665. package/projects/obtservices/base/src/lib/vendor/interfaces/Ilounges-enterprise-search.ts +0 -58
  666. package/projects/obtservices/base/src/lib/vendor/interfaces/Imybookings.service.ts +0 -27
  667. package/projects/obtservices/base/src/lib/vendor/interfaces/Iparking-enterprise-search.ts +0 -72
  668. package/projects/obtservices/base/src/lib/vendor/interfaces/Irail-enterprise-search.ts +0 -161
  669. package/projects/obtservices/base/src/lib/vendor/interfaces/Isearch.service.ts +0 -178
  670. package/projects/obtservices/base/src/lib/vendor/interfaces/Isupplementary-booking-info-impl.ts +0 -63
  671. package/projects/obtservices/base/src/lib/vendor/interfaces/Iuser.service.ts +0 -87
  672. package/projects/obtservices/base/src/lib/vendor/interfaces/car-hire-classes.interface.ts +0 -8
  673. package/projects/obtservices/base/src/lib/vendor/interfaces/car-hire-filters.interface.ts +0 -11
  674. package/projects/obtservices/base/src/lib/vendor/interfaces/car-hire-sort.interface.ts +0 -4
  675. package/projects/obtservices/base/src/lib/vendor/interfaces/cheapest-price.ts +0 -4
  676. package/projects/obtservices/base/src/lib/vendor/interfaces/code-name.ts +0 -4
  677. package/projects/obtservices/base/src/lib/vendor/interfaces/flight-filters.interface.ts +0 -41
  678. package/projects/obtservices/base/src/lib/vendor/interfaces/flight-multi-destination.interface.ts +0 -8
  679. package/projects/obtservices/base/src/lib/vendor/interfaces/rail-airport-express-stations.interface.ts +0 -4
  680. package/projects/obtservices/base/src/lib/vendor/interfaces/rail-basket-item.interface.ts +0 -79
  681. package/projects/obtservices/base/src/lib/vendor/interfaces/rail-journey-leg.interface.ts +0 -6
  682. package/projects/obtservices/base/src/lib/vendor/interfaces/rail-recent-search-args.interface.ts +0 -20
  683. package/projects/obtservices/base/src/lib/vendor/interfaces/rail-selected-ticket.interface.ts +0 -11
  684. package/projects/obtservices/base/src/lib/vendor/interfaces/rail-ticket-group.interface.ts +0 -29
  685. package/projects/obtservices/base/src/lib/vendor/interfaces/rail-ticket-groups.interface.ts +0 -5
  686. package/projects/obtservices/base/src/lib/vendor/interfaces/search-objects.interface.ts +0 -17
  687. package/projects/obtservices/base/src/lib/vendor/interfaces/select-filter.interface.ts +0 -5
  688. package/projects/obtservices/base/src/lib/vendor/interfaces/user.data.ts +0 -22
  689. package/projects/obtservices/base/src/lib/vendor/interfaces/value-display.ts +0 -4
  690. package/projects/obtservices/base/src/lib/vendor/models/login.model.ts +0 -97
  691. package/projects/obtservices/base/src/lib/vendor/models/regexp.model.ts +0 -13
  692. package/projects/obtservices/base/src/lib/vendor/models/traveller.object.ts +0 -61
  693. package/projects/obtservices/base/src/lib/vendor/services/enterprise-basket.service.ts +0 -1150
  694. package/projects/obtservices/base/src/lib/vendor/services/hotel-avallibility.service.ts +0 -251
  695. package/projects/obtservices/base/src/lib/vendor/services/http-call.service.ts +0 -57
  696. package/projects/obtservices/base/src/lib/vendor/services/logon.service.ts +0 -245
  697. package/projects/obtservices/base/src/lib/vendor/services/modal-opener.service.ts +0 -30
  698. package/projects/obtservices/base/src/lib/vendor/services/my-bookings.service.ts +0 -184
  699. package/projects/obtservices/base/src/lib/vendor/services/routehappy.service.ts +0 -275
  700. package/projects/obtservices/base/src/lib/vendor/services/search.service.ts +0 -2026
  701. package/projects/obtservices/base/src/lib/vendor/services/storage.service.ts +0 -15
  702. package/projects/obtservices/base/src/lib/vendor/services/url.service.ts +0 -12
  703. package/projects/obtservices/base/src/lib/vendor/services/user.service.ts +0 -354
  704. package/projects/obtservices/base/src/lib/vendor/services/webtoken.service.ts +0 -66
  705. package/projects/obtservices/base/src/lib/vendor/testers/base.tester.ts +0 -18
  706. package/projects/obtservices/base/src/lib/vendor/testers/postcode-validate.tester.ts +0 -24
  707. package/projects/obtservices/base/src/lib/vendor/testers/validate-mi-free-value.tester.ts +0 -23
  708. package/projects/obtservices/base/src/lib/vendor/types/graphql.types.ts +0 -6184
  709. package/projects/obtservices/base/src/lib/vendor/types/types.ts +0 -630
  710. package/projects/obtservices/base/src/lib/vendor/updaters/accept-new-price.updater.ts +0 -31
  711. package/projects/obtservices/base/src/lib/vendor/updaters/add-item-to-basket.updater.ts +0 -29
  712. package/projects/obtservices/base/src/lib/vendor/updaters/addUserToBasketItem.ts +0 -30
  713. package/projects/obtservices/base/src/lib/vendor/updaters/book-basket-updater.ts +0 -28
  714. package/projects/obtservices/base/src/lib/vendor/updaters/create-basket-updater.ts +0 -29
  715. package/projects/obtservices/base/src/lib/vendor/updaters/move-basket-item-to-basket.ts +0 -30
  716. package/projects/obtservices/base/src/lib/vendor/updaters/object-updater-enterprise.ts +0 -20
  717. package/projects/obtservices/base/src/lib/vendor/updaters/remove-basket-updater.ts +0 -29
  718. package/projects/obtservices/base/src/lib/vendor/updaters/remove-item-from-basket.updater.ts +0 -28
  719. package/projects/obtservices/base/src/lib/vendor/updaters/remove-recent-search-updater.ts +0 -29
  720. package/projects/obtservices/base/src/lib/vendor/updaters/remove-user-address-updater.ts +0 -29
  721. package/projects/obtservices/base/src/lib/vendor/updaters/revalidate-basket-updater.ts +0 -29
  722. package/projects/obtservices/base/src/lib/vendor/updaters/save-recent-search-updater.ts +0 -30
  723. package/projects/obtservices/base/src/lib/vendor/updaters/save-user-address.updater.ts +0 -30
  724. package/projects/obtservices/base/src/lib/vendor/updaters/send-basket-for-approval.updater.ts +0 -31
  725. package/projects/obtservices/base/src/lib/vendor/updaters/set-basket-item-lead-passenger.updater.ts +0 -30
  726. package/projects/obtservices/base/src/lib/vendor/updaters/set-basket-item-mi-group.ts +0 -32
  727. package/projects/obtservices/base/src/lib/vendor/updaters/set-basket-item-mi-value-updater.ts +0 -30
  728. package/projects/obtservices/base/src/lib/vendor/updaters/set-basket-item-paymenr-option.updater.ts +0 -28
  729. package/projects/obtservices/base/src/lib/vendor/updaters/update-basket-notes-updater.ts +0 -30
  730. package/projects/obtservices/base/src/lib/vendor/updaters/update-basket-title-updater.ts +0 -30
  731. package/projects/obtservices/base/src/testers.ts +0 -2
  732. package/projects/obtservices/graphQL/autogenerated/index.js +0 -2
  733. package/projects/obtservices/graphQL/autogenerated/mutations/acceptNewPrice.gql +0 -1580
  734. package/projects/obtservices/graphQL/autogenerated/mutations/addItemToBasket.gql +0 -1580
  735. package/projects/obtservices/graphQL/autogenerated/mutations/addUsersToBasketItem.gql +0 -1580
  736. package/projects/obtservices/graphQL/autogenerated/mutations/bookBasket.gql +0 -1580
  737. package/projects/obtservices/graphQL/autogenerated/mutations/cancelBooking.gql +0 -6
  738. package/projects/obtservices/graphQL/autogenerated/mutations/confermaCreateCard.gql +0 -23
  739. package/projects/obtservices/graphQL/autogenerated/mutations/confermaDeleteCard.gql +0 -3
  740. package/projects/obtservices/graphQL/autogenerated/mutations/createBasket.gql +0 -1580
  741. package/projects/obtservices/graphQL/autogenerated/mutations/deleteBasket.gql +0 -3
  742. package/projects/obtservices/graphQL/autogenerated/mutations/deleteFavouriteSearch.gql +0 -3
  743. package/projects/obtservices/graphQL/autogenerated/mutations/deleteRecentSearch.gql +0 -3
  744. package/projects/obtservices/graphQL/autogenerated/mutations/deleteUserAddress.gql +0 -3
  745. package/projects/obtservices/graphQL/autogenerated/mutations/index.js +0 -36
  746. package/projects/obtservices/graphQL/autogenerated/mutations/moveItemToADifferentBasket.gql +0 -1580
  747. package/projects/obtservices/graphQL/autogenerated/mutations/removeItemFromBasket.gql +0 -1580
  748. package/projects/obtservices/graphQL/autogenerated/mutations/removeItemsFromBasket.gql +0 -1580
  749. package/projects/obtservices/graphQL/autogenerated/mutations/removeUserFromBasketItem.gql +0 -1580
  750. package/projects/obtservices/graphQL/autogenerated/mutations/reopenBasket.gql +0 -1580
  751. package/projects/obtservices/graphQL/autogenerated/mutations/revalidateBasket.gql +0 -1580
  752. package/projects/obtservices/graphQL/autogenerated/mutations/revalidateBasketItem.gql +0 -1580
  753. package/projects/obtservices/graphQL/autogenerated/mutations/saveFavouriteSearch.gql +0 -348
  754. package/projects/obtservices/graphQL/autogenerated/mutations/saveRecentSearch.gql +0 -348
  755. package/projects/obtservices/graphQL/autogenerated/mutations/saveUserAddress.gql +0 -14
  756. package/projects/obtservices/graphQL/autogenerated/mutations/sendBasketForApproval.gql +0 -1580
  757. package/projects/obtservices/graphQL/autogenerated/mutations/setAddressAsUserPrimary.gql +0 -14
  758. package/projects/obtservices/graphQL/autogenerated/mutations/setBasketItemLeadPassenger.gql +0 -1580
  759. package/projects/obtservices/graphQL/autogenerated/mutations/setBasketItemMIGroup.gql +0 -1580
  760. package/projects/obtservices/graphQL/autogenerated/mutations/setBasketItemMIValue.gql +0 -1580
  761. package/projects/obtservices/graphQL/autogenerated/mutations/setBasketItemPaymentMethod.gql +0 -1580
  762. package/projects/obtservices/graphQL/autogenerated/mutations/setMIDefaultValue.gql +0 -3
  763. package/projects/obtservices/graphQL/autogenerated/mutations/setUserLanguage.gql +0 -339
  764. package/projects/obtservices/graphQL/autogenerated/mutations/updateBasketNotes.gql +0 -1580
  765. package/projects/obtservices/graphQL/autogenerated/mutations/updateBasketTitle.gql +0 -1580
  766. package/projects/obtservices/graphQL/autogenerated/queries/alive.gql +0 -3
  767. package/projects/obtservices/graphQL/autogenerated/queries/carHireAvailabilityDetailRequest.gql +0 -42
  768. package/projects/obtservices/graphQL/autogenerated/queries/confermaBlockClientHotels.gql +0 -23
  769. package/projects/obtservices/graphQL/autogenerated/queries/confermaBlockConsumerHotels.gql +0 -23
  770. package/projects/obtservices/graphQL/autogenerated/queries/confermaListCards.gql +0 -11
  771. package/projects/obtservices/graphQL/autogenerated/queries/confermaUnblockClientHotels.gql +0 -23
  772. package/projects/obtservices/graphQL/autogenerated/queries/confermaUnblockConsumerHotels.gql +0 -23
  773. package/projects/obtservices/graphQL/autogenerated/queries/getCOVIDMicrositeToken.gql +0 -3
  774. package/projects/obtservices/graphQL/autogenerated/queries/getCancellationInfo.gql +0 -7
  775. package/projects/obtservices/graphQL/autogenerated/queries/getCarHireDepots.gql +0 -13
  776. package/projects/obtservices/graphQL/autogenerated/queries/getConfermaOffice.gql +0 -50
  777. package/projects/obtservices/graphQL/autogenerated/queries/getConfermaOfficeNames.gql +0 -26
  778. package/projects/obtservices/graphQL/autogenerated/queries/getConfermaQuicklist.gql +0 -131
  779. package/projects/obtservices/graphQL/autogenerated/queries/getCountries.gql +0 -8
  780. package/projects/obtservices/graphQL/autogenerated/queries/getHotelAvailability.gql +0 -78
  781. package/projects/obtservices/graphQL/autogenerated/queries/getHotelChains.gql +0 -3
  782. package/projects/obtservices/graphQL/autogenerated/queries/getIRLSupplierStation.gql +0 -28
  783. package/projects/obtservices/graphQL/autogenerated/queries/getMultipleHotelsAvailability.gql +0 -78
  784. package/projects/obtservices/graphQL/autogenerated/queries/getPostcodeDetails.gql +0 -25
  785. package/projects/obtservices/graphQL/autogenerated/queries/getRailStation.gql +0 -27
  786. package/projects/obtservices/graphQL/autogenerated/queries/getRailcards.gql +0 -6
  787. package/projects/obtservices/graphQL/autogenerated/queries/getRiskAlerts.gql +0 -17
  788. package/projects/obtservices/graphQL/autogenerated/queries/getUser.gql +0 -339
  789. package/projects/obtservices/graphQL/autogenerated/queries/getUserAddresses.gql +0 -14
  790. package/projects/obtservices/graphQL/autogenerated/queries/getUserBasket.gql +0 -1580
  791. package/projects/obtservices/graphQL/autogenerated/queries/getUserBaskets.gql +0 -1580
  792. package/projects/obtservices/graphQL/autogenerated/queries/getUserCompanyOffices.gql +0 -88
  793. package/projects/obtservices/graphQL/autogenerated/queries/getUserCurrentCarbonAllowance.gql +0 -524
  794. package/projects/obtservices/graphQL/autogenerated/queries/getUserFavouriteSearches.gql +0 -348
  795. package/projects/obtservices/graphQL/autogenerated/queries/getUserMIAutoSuggestValues.gql +0 -10
  796. package/projects/obtservices/graphQL/autogenerated/queries/getUserMessages.gql +0 -10
  797. package/projects/obtservices/graphQL/autogenerated/queries/getUserPhoneNumbers.gql +0 -13
  798. package/projects/obtservices/graphQL/autogenerated/queries/getUserRecentSearches.gql +0 -348
  799. package/projects/obtservices/graphQL/autogenerated/queries/getUserServices.gql +0 -16
  800. package/projects/obtservices/graphQL/autogenerated/queries/getUserTravelRules.gql +0 -111
  801. package/projects/obtservices/graphQL/autogenerated/queries/getUserUIConfigs.gql +0 -52
  802. package/projects/obtservices/graphQL/autogenerated/queries/index.js +0 -64
  803. package/projects/obtservices/graphQL/autogenerated/queries/isPostcodeValid.gql +0 -3
  804. package/projects/obtservices/graphQL/autogenerated/queries/postcodeAutoSuggest.gql +0 -3
  805. package/projects/obtservices/graphQL/autogenerated/queries/searchAirlines.gql +0 -32
  806. package/projects/obtservices/graphQL/autogenerated/queries/searchAirports.gql +0 -60
  807. package/projects/obtservices/graphQL/autogenerated/queries/searchCabHire.gql +0 -63
  808. package/projects/obtservices/graphQL/autogenerated/queries/searchCarHire.gql +0 -104
  809. package/projects/obtservices/graphQL/autogenerated/queries/searchCities.gql +0 -14
  810. package/projects/obtservices/graphQL/autogenerated/queries/searchConfermaCities.gql +0 -11
  811. package/projects/obtservices/graphQL/autogenerated/queries/searchEurostar.gql +0 -833
  812. package/projects/obtservices/graphQL/autogenerated/queries/searchFastTrack.gql +0 -46
  813. package/projects/obtservices/graphQL/autogenerated/queries/searchFlights.gql +0 -23
  814. package/projects/obtservices/graphQL/autogenerated/queries/searchFlightsV2.gql +0 -833
  815. package/projects/obtservices/graphQL/autogenerated/queries/searchHotelChains.gql +0 -3
  816. package/projects/obtservices/graphQL/autogenerated/queries/searchHotels.gql +0 -131
  817. package/projects/obtservices/graphQL/autogenerated/queries/searchIRL.gql +0 -514
  818. package/projects/obtservices/graphQL/autogenerated/queries/searchIRLSupplierStations.gql +0 -28
  819. package/projects/obtservices/graphQL/autogenerated/queries/searchLounges.gql +0 -89
  820. package/projects/obtservices/graphQL/autogenerated/queries/searchParking.gql +0 -70
  821. package/projects/obtservices/graphQL/autogenerated/queries/searchPostcodes.gql +0 -25
  822. package/projects/obtservices/graphQL/autogenerated/queries/searchRail.gql +0 -840
  823. package/projects/obtservices/graphQL/autogenerated/queries/searchRailStations.gql +0 -27
  824. package/projects/obtservices/graphQL/autogenerated/queries/searchUserCanBookFor.gql +0 -339
  825. package/projects/obtservices/graphQL/autogenerated/queries/validateBasketItemMI.gql +0 -3
  826. package/projects/obtservices/graphQL/autogenerated/queries/validateUserMIFreeValue.gql +0 -3
  827. package/projects/obtservices/graphQL/documents/acceptNewPrice.graphql +0 -5
  828. package/projects/obtservices/graphQL/documents/addUserToBasketItem.graphql +0 -9
  829. package/projects/obtservices/graphQL/documents/basket.fragments.graphql +0 -171
  830. package/projects/obtservices/graphQL/documents/baskets.graphql +0 -111
  831. package/projects/obtservices/graphQL/documents/bookBasket.graphql +0 -9
  832. package/projects/obtservices/graphQL/documents/cabhire.graphql +0 -66
  833. package/projects/obtservices/graphQL/documents/carHireAvailabilityDetailRequest.graphql +0 -44
  834. package/projects/obtservices/graphQL/documents/carhire.graphql +0 -117
  835. package/projects/obtservices/graphQL/documents/deleteRecentSearch.graphql +0 -3
  836. package/projects/obtservices/graphQL/documents/deleteUserAddress.graphql +0 -3
  837. package/projects/obtservices/graphQL/documents/error.fragments.graphql +0 -10
  838. package/projects/obtservices/graphQL/documents/flights.graphql +0 -830
  839. package/projects/obtservices/graphQL/documents/getCarHireDepots.graphql +0 -13
  840. package/projects/obtservices/graphQL/documents/getConfermaOfficeNames.graphql +0 -11
  841. package/projects/obtservices/graphQL/documents/getConfermaQuicklist.graphql +0 -108
  842. package/projects/obtservices/graphQL/documents/getRailStation.graphql +0 -31
  843. package/projects/obtservices/graphQL/documents/getRailcards.graphql +0 -6
  844. package/projects/obtservices/graphQL/documents/getRiskAlerts.graphql +0 -24
  845. package/projects/obtservices/graphQL/documents/getUserAddresses.graphql +0 -14
  846. package/projects/obtservices/graphQL/documents/getUserCompanyOffices.graphql +0 -18
  847. package/projects/obtservices/graphQL/documents/getUserCurrentCarbonAllowance.graphql +0 -29
  848. package/projects/obtservices/graphQL/documents/getUserMIAutoSuggestValues.graphql +0 -10
  849. package/projects/obtservices/graphQL/documents/getUserPhoneNumbers.graphql +0 -13
  850. package/projects/obtservices/graphQL/documents/getUserRecentSearches.graphql +0 -20
  851. package/projects/obtservices/graphQL/documents/hotels.graphql +0 -242
  852. package/projects/obtservices/graphQL/documents/isPostcodeValid.graphql +0 -3
  853. package/projects/obtservices/graphQL/documents/lookups.graphql +0 -54
  854. package/projects/obtservices/graphQL/documents/lounges.graphql +0 -88
  855. package/projects/obtservices/graphQL/documents/moveItemToADifferentBasket.graphql +0 -9
  856. package/projects/obtservices/graphQL/documents/parking.graphql +0 -79
  857. package/projects/obtservices/graphQL/documents/rail.graphql +0 -645
  858. package/projects/obtservices/graphQL/documents/saveRecentSearch.graphql +0 -5
  859. package/projects/obtservices/graphQL/documents/saveUserAddress.graphql +0 -14
  860. package/projects/obtservices/graphQL/documents/searchAirlines.graphql +0 -32
  861. package/projects/obtservices/graphQL/documents/searchCities.graphql +0 -14
  862. package/projects/obtservices/graphQL/documents/searchConfermaCities.graphql +0 -11
  863. package/projects/obtservices/graphQL/documents/searchEurostar.graphql +0 -810
  864. package/projects/obtservices/graphQL/documents/searchHotelChains.graphql +0 -3
  865. package/projects/obtservices/graphQL/documents/searchIRL.graphql +0 -521
  866. package/projects/obtservices/graphQL/documents/searchPostcodes.graphql +0 -7
  867. package/projects/obtservices/graphQL/documents/searchRailStations.graphql +0 -27
  868. package/projects/obtservices/graphQL/documents/searchUserAddresses.graphql +0 -14
  869. package/projects/obtservices/graphQL/documents/set-basker-item-mi-group.graphql +0 -9
  870. package/projects/obtservices/graphQL/documents/setBasketItemLeadPassenger.graphql +0 -5
  871. package/projects/obtservices/graphQL/documents/setBasketItemMIValue.graphql +0 -16
  872. package/projects/obtservices/graphQL/documents/setBasketItemPaymentMethod.graphql +0 -12
  873. package/projects/obtservices/graphQL/documents/updateBasketNotes.graphql +0 -10
  874. package/projects/obtservices/graphQL/documents/updateBasketTitle.graphql +0 -10
  875. package/projects/obtservices/graphQL/documents/user.fragments.graphql +0 -65
  876. package/projects/obtservices/graphQL/documents/user.graphql +0 -95
  877. package/projects/obtservices/graphQL/documents/validateUserMIFreeValue.graphql +0 -3
  878. package/projects/obtservices/graphQL/schema/schema.graphql +0 -2635
  879. package/projects/obtservices/karma.conf.js +0 -32
  880. package/projects/obtservices/ng-package.json +0 -7
  881. package/projects/obtservices/package-lock.json +0 -5
  882. package/projects/obtservices/package.json +0 -12
  883. package/projects/obtservices/src/obtservices.ts +0 -0
  884. package/projects/obtservices/src/public_api.ts +0 -1
  885. package/projects/obtservices/tsconfig.lib.json +0 -30
  886. package/projects/obtservices/tsconfig.spec.json +0 -17
  887. package/projects/obtservices/tslint.json +0 -17
  888. package/tsconfig.json +0 -36
  889. package/tslint.json +0 -62
  890. /package/{projects → dist}/obtservices/README.md +0 -0
  891. /package/{projects/obtservices/angular/src/classes.ts → dist/obtservices/angular/classes.d.ts} +0 -0
  892. /package/{projects/obtservices/angular/src/components.ts → dist/obtservices/angular/components.d.ts} +0 -0
  893. /package/{projects/obtservices/angular/src/public_api.ts → dist/obtservices/angular/public_api.d.ts} +0 -0
  894. /package/{projects/obtservices/angular/src/services.ts → dist/obtservices/angular/services.d.ts} +0 -0
  895. /package/{projects/obtservices/angular/src/types.ts → dist/obtservices/angular/types.d.ts} +0 -0
  896. /package/{projects/obtservices/angular/src/updaters.ts → dist/obtservices/angular/updaters.d.ts} +0 -0
  897. /package/{projects/obtservices/base/src/classes.ts → dist/obtservices/base/classes.d.ts} +0 -0
  898. /package/{projects/obtservices/base/src/interfaces.ts → dist/obtservices/base/interfaces.d.ts} +0 -0
  899. /package/{projects/obtservices/base/src/models.ts → dist/obtservices/base/models.d.ts} +0 -0
  900. /package/{projects/obtservices/base/src/public_api.ts → dist/obtservices/base/public_api.d.ts} +0 -0
  901. /package/{projects/obtservices/base/src/services.ts → dist/obtservices/base/services.d.ts} +0 -0
  902. /package/{projects/obtservices/angular/src/testers.ts → dist/obtservices/base/testers.d.ts} +0 -0
  903. /package/{projects/obtservices/base/src/types.ts → dist/obtservices/base/types.d.ts} +0 -0
  904. /package/{projects/obtservices/base/src/updaters.ts → dist/obtservices/base/updaters.d.ts} +0 -0
@@ -0,0 +1,1462 @@
1
+ import { __awaiter } from "tslib";
2
+ import moment from 'moment';
3
+ import { BaseEnterpriseSearch } from './base-enterprise';
4
+ import { BehaviorSubject } from 'rxjs';
5
+ import { FareType, FlightPassengerType, ServiceType } from '../types/graphql.types';
6
+ import { FlightDirectionEnum, EurostarClassEnum } from '../types/types';
7
+ import { EurostarSearchType } from './eurostar-search-type.enum';
8
+ import { TimeWindow } from './flight-enterprise-search';
9
+ export var SortTypesEurostar;
10
+ (function (SortTypesEurostar) {
11
+ SortTypesEurostar["CheapestFirst"] = "C";
12
+ SortTypesEurostar["EarliestFirst"] = "E";
13
+ })(SortTypesEurostar || (SortTypesEurostar = {}));
14
+ export var SortMethod;
15
+ (function (SortMethod) {
16
+ SortMethod["sortByPrice"] = "sortByPrice";
17
+ SortMethod["sortByDate"] = "sortByDate";
18
+ })(SortMethod || (SortMethod = {}));
19
+ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
20
+ constructor(eurostarFetcher, helpers, userService, basketService, storageService, searchService) {
21
+ super(storageService, (results1) => {
22
+ this.resultQuery = this.getSearchQuery();
23
+ delete this.resultQuery.withGrouped;
24
+ if (results1 && this.searchService.isFlightsGrouped()) {
25
+ const returndata = (results1.journeys || []).reduce((acc, result) => {
26
+ if (result.outboundFlights.length) {
27
+ const euroResult = this.formatEurostarResults(result.outboundFlights, result.total);
28
+ euroResult.co2PerPassenger = result.co2PerPassenger;
29
+ euroResult.co2PerItem = result.co2PerItem;
30
+ euroResult.sourceId = result.sourceId;
31
+ euroResult.total = result.total;
32
+ euroResult.duration = this.minToHour(result.outboundTotalDuration);
33
+ if (!acc.outbound.find((item) => item.dateDeparture === euroResult.dateDeparture)) {
34
+ acc.outbound.push(euroResult);
35
+ }
36
+ }
37
+ if (result.inboundFlights.length) {
38
+ const euroResult = this.formatEurostarResults(result.inboundFlights, result.total);
39
+ euroResult.co2PerPassenger = result.co2PerPassenger;
40
+ euroResult.co2PerItem = result.co2PerItem;
41
+ euroResult.sourceId = result.sourceId;
42
+ euroResult.total = result.total;
43
+ euroResult.duration = this.minToHour(result.inboundTotalDuration);
44
+ if (!acc.inbound.find((item) => item.dateDeparture === euroResult.dateDeparture)) {
45
+ acc.inbound.push(euroResult);
46
+ }
47
+ }
48
+ return acc;
49
+ }, { outbound: [], inbound: [] });
50
+ return [returndata];
51
+ }
52
+ else {
53
+ return results1 ? [results1] : [];
54
+ }
55
+ });
56
+ this.eurostarFetcher = eurostarFetcher;
57
+ this.helpers = helpers;
58
+ this.basketService = basketService;
59
+ this.searchService = searchService;
60
+ this.type = ServiceType.Eurostar;
61
+ this.avaliableClasses = new BehaviorSubject([]);
62
+ this.timeCriteriaOptions = new BehaviorSubject([]);
63
+ this.flightOperators = new BehaviorSubject([]);
64
+ this._negotiated = false;
65
+ this._nearby_airports = false;
66
+ this._sortArray = [
67
+ {
68
+ title: 'Price',
69
+ method: SortMethod.sortByPrice,
70
+ icon: 'ico-dollar',
71
+ dir: true,
72
+ code: SortTypesEurostar.CheapestFirst
73
+ },
74
+ {
75
+ title: 'Time',
76
+ method: SortMethod.sortByDate,
77
+ icon: 'ico-calendar',
78
+ dir: true,
79
+ code: SortTypesEurostar.EarliestFirst
80
+ }
81
+ ];
82
+ this._fareTypeArray = [
83
+ { value: FareType.Flexible, display: 'Flexible' },
84
+ { value: FareType.Leisure, display: 'Leisure' },
85
+ { value: FareType.Lowest, display: 'Lowest' },
86
+ { value: FareType.Negotiated, display: 'Negotiated' },
87
+ { value: FareType.NonNegotiated, display: 'Non-Negotiated' },
88
+ { value: FareType.RequestFareRules, display: 'Request Fare Rules' },
89
+ { value: FareType.SelectAndPro, display: 'Select & Pro' }
90
+ ];
91
+ this.minimumOutBoundDate = {
92
+ year: moment().year(),
93
+ month: moment().month() + 1,
94
+ day: moment().date()
95
+ };
96
+ this.minimumInBoundDate = {
97
+ year: moment().year(),
98
+ month: moment().month() + 1,
99
+ day: moment().date()
100
+ };
101
+ this.searchTypes = [
102
+ { value: EurostarSearchType.return, display: 'Return' },
103
+ { value: EurostarSearchType.oneWay, display: 'One-way' },
104
+ ];
105
+ this.flightsToGroup = {};
106
+ this.grouped = null;
107
+ this.travellers = null;
108
+ this.resultsSessionName = EurostarEnterpriseSearch.STORAGE_SESSION_RESULTS;
109
+ this._displayAddHotel = false;
110
+ this._multiDestination = [];
111
+ this.minToHour = (dur) => `${Math.floor(dur / 60)}h ${dur % 60}m`;
112
+ const data = storageService.getSessionItem(EurostarEnterpriseSearch.STORAGE_SESSION_PARAMS) || {
113
+ tempParams: {},
114
+ originalUserSearch: {}
115
+ };
116
+ // data.tempParams.adults = 1;
117
+ // data.tempParams.cabinClass = [FlightCabinClass.Economy];
118
+ const query = searchService.makeEurostarQuery(data.tempParams);
119
+ this.updateTempParams(query);
120
+ this._originalUserSearch = data.originalUserSearch;
121
+ if (searchService.shouldAddTravellerSubscription()) {
122
+ searchService.travellerInformation.subscribe((travellers) => {
123
+ this.travellers = travellers;
124
+ const splitTravellers = this.helpers.selectedTravellers(travellers, ServiceType.Eurostar);
125
+ this.tempParams.adults = splitTravellers.adults.length;
126
+ this.tempParams.children = splitTravellers.children.length;
127
+ // this.tempParams.infants = splitTravellers.infants.length;
128
+ this.updateTravellers();
129
+ this._isValid();
130
+ });
131
+ }
132
+ userService.changeUser.subscribe((user) => {
133
+ this.timeCriteriaOptions.next([
134
+ TimeWindow.Anytime,
135
+ TimeWindow.Arrive,
136
+ TimeWindow.Depart
137
+ ]); // TODO update with any UFs
138
+ this.updateAvaliableClasses();
139
+ });
140
+ this.updateTravellers();
141
+ const results = storageService.getSessionItem(this.resultsSessionName) || {
142
+ results: [],
143
+ groupData: {},
144
+ grouped: [],
145
+ query: {}
146
+ };
147
+ this.fullResults = this.helpers.clone(results.results);
148
+ this.flightsToGroup = results.groupData || {};
149
+ this.resultQuery = results.query;
150
+ this.results.next(results.results || []);
151
+ this._isValid();
152
+ this.negotiated =
153
+ this.tempParams.fareType === FareType.Negotiated ? true : false;
154
+ }
155
+ get displayAddHotel() {
156
+ return this._displayAddHotel;
157
+ }
158
+ set displayAddHotel(newVal) {
159
+ this._displayAddHotel = newVal;
160
+ }
161
+ get timeArray() {
162
+ this._timeArray =
163
+ this._timeArray ||
164
+ Array(96)
165
+ .fill(0)
166
+ .map((_, index) => {
167
+ return {
168
+ value: Math.floor(index / 4)
169
+ .toString()
170
+ .padStart(2, '0') +
171
+ ':' +
172
+ ((index % 4) * 15).toString().padStart(2, '0'),
173
+ display: Math.floor(index / 4)
174
+ .toString()
175
+ .padStart(2, '0') +
176
+ ':' +
177
+ ((index % 4) * 15).toString().padStart(2, '0')
178
+ };
179
+ });
180
+ return this._timeArray;
181
+ }
182
+ get preferredCarriers() {
183
+ return this.tempParams.preferredCarriers;
184
+ }
185
+ set preferredCarriers(value) {
186
+ this.tempParams.preferredCarriers = value;
187
+ this._isValid();
188
+ }
189
+ get operator1() {
190
+ return this.tempParams.preferredCarriers[0];
191
+ }
192
+ set operator1(value) {
193
+ this.tempParams.preferredCarriers[0] = value;
194
+ this._isValid();
195
+ }
196
+ get operator2() {
197
+ return this.tempParams.preferredCarriers[1];
198
+ }
199
+ set operator2(value) {
200
+ this.tempParams.preferredCarriers[1] = value;
201
+ this._isValid();
202
+ }
203
+ get operator3() {
204
+ return this.tempParams.preferredCarriers[2];
205
+ }
206
+ set operator3(value) {
207
+ this.tempParams.preferredCarriers[2] = value;
208
+ this._isValid();
209
+ }
210
+ get operator4() {
211
+ return this.tempParams.preferredCarriers[3];
212
+ }
213
+ set operator4(value) {
214
+ this.tempParams.preferredCarriers[3] = value;
215
+ this._isValid();
216
+ }
217
+ get minDate() {
218
+ this._minDate = this._minDate || this.helpers.momentToNgDate(moment());
219
+ return this._minDate;
220
+ }
221
+ get adults() {
222
+ return this.tempParams.adults;
223
+ }
224
+ set adults(value) {
225
+ this.tempParams.adults = Number(value);
226
+ this.updateTravellers();
227
+ }
228
+ get children() {
229
+ return this.tempParams.children;
230
+ }
231
+ set children(value) {
232
+ this.tempParams.children = Number(value);
233
+ this.updateTravellers();
234
+ }
235
+ get departLocation() {
236
+ return this.tempParams.departLocation;
237
+ }
238
+ set departLocation(value) {
239
+ this.tempParams.departLocation = value;
240
+ if (typeof value === 'string') {
241
+ this._originAirport = '';
242
+ }
243
+ else if (value && value.gateway) {
244
+ this._originAirport = value.gateway;
245
+ }
246
+ else {
247
+ this._originAirport = null;
248
+ }
249
+ this._isValid();
250
+ }
251
+ get queryOriginAiport() {
252
+ return this._originAirport;
253
+ }
254
+ get queryDestinationAiport() {
255
+ return this._destinationAirport;
256
+ }
257
+ get departDate() {
258
+ return this._outDate;
259
+ }
260
+ set departDate(value) {
261
+ this._outDate = value;
262
+ this.outBoundDate = this.helpers.ngDateToMoment(this._outDate, this._outTime);
263
+ }
264
+ get departTime() {
265
+ return this._outTime;
266
+ }
267
+ set departTime(value) {
268
+ this._outTime = value;
269
+ this.outBoundDate = this.helpers.ngDateToMoment(this._outDate, this._outTime);
270
+ }
271
+ get outBoundDate() {
272
+ return this.tempParams.outBoundDate;
273
+ }
274
+ set outBoundDate(value) {
275
+ value = moment(value);
276
+ this.tempParams.outBoundDate = value.isValid() ? value : null;
277
+ this.minimumInBoundDate = {
278
+ year: value.year(),
279
+ month: value.month() + 1,
280
+ day: value.date()
281
+ };
282
+ if (this.tempParams.outBoundDate &&
283
+ this.tempParams.inboundDate &&
284
+ this.tempParams.outBoundDate.isAfter(this.tempParams.inboundDate)) {
285
+ this.inboundDate = moment(this.tempParams.outBoundDate).add(1, 'day');
286
+ }
287
+ this._outDate = this.helpers.momentToNgDate(value);
288
+ this._outTime = this.helpers.formatTimeColon(value);
289
+ this._isValid();
290
+ }
291
+ get returnDate() {
292
+ return this._inDate;
293
+ }
294
+ set returnDate(value) {
295
+ this._inDate = value;
296
+ this.inboundDate = this.helpers.ngDateToMoment(this._inDate, this._inTime);
297
+ }
298
+ get arriveTime() {
299
+ return this._inTime;
300
+ }
301
+ set arriveTime(value) {
302
+ this._inTime = value;
303
+ this.inboundDate = this.helpers.ngDateToMoment(this._inDate, this._inTime);
304
+ }
305
+ get inboundDate() {
306
+ return this.tempParams.inboundDate;
307
+ }
308
+ set inboundDate(value) {
309
+ value = moment(value);
310
+ this.tempParams.inboundDate = value.isValid() ? value : null;
311
+ this._inDate = this.helpers.momentToNgDate(value);
312
+ this._inTime = this.helpers.formatTimeColon(value);
313
+ this._isValid();
314
+ }
315
+ get arriveLocation() {
316
+ return this.tempParams.arriveLocation;
317
+ }
318
+ set arriveLocation(value) {
319
+ this.tempParams.arriveLocation = value;
320
+ if (typeof value === 'string') {
321
+ this._destinationAirport = '';
322
+ }
323
+ else if (value && value.gateway) {
324
+ this._destinationAirport = value.gateway;
325
+ }
326
+ else {
327
+ this._destinationAirport = null;
328
+ }
329
+ this._isValid();
330
+ }
331
+ get cabinClass() {
332
+ return this.tempParams.cabinClass;
333
+ }
334
+ set cabinClass(value) {
335
+ this.tempParams.cabinClass = value;
336
+ this._isValid();
337
+ }
338
+ get returnCabinClass() {
339
+ return this.tempParams.returnCabinClass;
340
+ }
341
+ set returnCabinClass(value) {
342
+ this.tempParams.returnCabinClass = value;
343
+ this._isValid();
344
+ }
345
+ get chosenSearchType() {
346
+ return this.tempParams.chosenSearchType;
347
+ }
348
+ set chosenSearchType(type) {
349
+ this.tempParams.chosenSearchType = type;
350
+ this._isValid();
351
+ }
352
+ get isReturn() {
353
+ return this.tempParams.chosenSearchType === EurostarSearchType.return;
354
+ }
355
+ get outTimeCriteria() {
356
+ return this.tempParams.outTimeCriteria;
357
+ }
358
+ set outTimeCriteria(value) {
359
+ this.tempParams.outTimeCriteria = value;
360
+ this._isValid();
361
+ }
362
+ get inTimeCriteria() {
363
+ return this.tempParams.inTimeCriteria;
364
+ }
365
+ set inTimeCriteria(value) {
366
+ this.tempParams.inTimeCriteria = value;
367
+ this._isValid();
368
+ }
369
+ get maxConnections() {
370
+ return this.tempParams.maxConnections;
371
+ }
372
+ set maxConnections(value) {
373
+ this.tempParams.maxConnections = value;
374
+ }
375
+ get multiDestination() {
376
+ return this.tempParams.multiDestination;
377
+ }
378
+ set multiDestination(valueArray) {
379
+ this.tempParams.multiDestination = valueArray;
380
+ this._isValid();
381
+ }
382
+ setMultiDestinationQuery(multiDestination) {
383
+ const newMultiDestination = this.helpers.clone(multiDestination);
384
+ return newMultiDestination.reduce((destinationArray, item) => {
385
+ const destinationObject = {};
386
+ destinationObject.orig = item.orig.gateway;
387
+ destinationObject.dest = item.dest.gateway;
388
+ destinationObject.date = this.helpers.formatIsoDate(item.date);
389
+ destinationArray.push(destinationObject);
390
+ return destinationArray;
391
+ }, []);
392
+ }
393
+ // get only
394
+ get sortDropdownValues() {
395
+ return this._sortArray;
396
+ }
397
+ get fareTypesValues() {
398
+ return this._fareTypeArray;
399
+ }
400
+ get fareType() {
401
+ return this.tempParams.fareType;
402
+ }
403
+ set fareType(value) {
404
+ this.tempParams.fareType = value;
405
+ this._isValid();
406
+ }
407
+ get negotiated() {
408
+ return this._negotiated;
409
+ }
410
+ set negotiated(value) {
411
+ this._negotiated = value;
412
+ }
413
+ get includeNearbyAirports() {
414
+ return this.tempParams.includeNearbyAirports;
415
+ }
416
+ set includeNearbyAirports(value) {
417
+ this.tempParams.includeNearbyAirports = value;
418
+ }
419
+ formatEurostarResults(results, total) {
420
+ const returnObject = {
421
+ dateArrival: null,
422
+ dateDeparture: null,
423
+ duration: null,
424
+ timeArrival: null,
425
+ timeDeparture: null,
426
+ co2PerItem: 0,
427
+ co2PerPassenger: 0,
428
+ sourceId: null,
429
+ total: null,
430
+ uid: null,
431
+ businessPremierFare: {
432
+ class: null,
433
+ fare: null,
434
+ isDisabled: true,
435
+ price: NaN,
436
+ currency: 'GBP'
437
+ },
438
+ standardFare: {
439
+ class: null,
440
+ fare: null,
441
+ isDisabled: true,
442
+ price: NaN,
443
+ currency: 'GBP'
444
+ },
445
+ standardPremierFare: {
446
+ class: null,
447
+ fare: null,
448
+ isDisabled: true,
449
+ price: NaN,
450
+ currency: 'GBP'
451
+ }
452
+ };
453
+ // returnObject.duration = results.outboundTotalDuration;
454
+ results.forEach((flight, index) => {
455
+ returnObject.dateArrival = flight.dateTimeArriving;
456
+ returnObject.dateDeparture = flight.dateTimeDeparting;
457
+ returnObject.duration = this.minToHour(flight.totalDuration);
458
+ returnObject.timeArrival = moment(flight.dateTimeArriving).format('HH:mm');
459
+ returnObject.timeDeparture = moment(flight.dateTimeDeparting).format('HH:mm');
460
+ returnObject.uid = index;
461
+ switch (flight.fareInfo.title) {
462
+ case EurostarClassEnum.STANDARD:
463
+ returnObject.standardFare.isDisabled = false;
464
+ returnObject.standardFare.fare = flight;
465
+ returnObject.standardFare.price = total.price;
466
+ returnObject.standardFare.currency = total.currency;
467
+ returnObject.standardFare.class = flight.cabinClass;
468
+ break;
469
+ case EurostarClassEnum.STANDARD_PREMIER:
470
+ returnObject.standardPremierFare.isDisabled = false;
471
+ returnObject.standardPremierFare.fare = flight;
472
+ returnObject.standardPremierFare.price = total.price;
473
+ returnObject.standardPremierFare.currency = total.currency;
474
+ returnObject.standardPremierFare.class = flight.cabinClass;
475
+ break;
476
+ case EurostarClassEnum.BUSINESS_PREMIER:
477
+ returnObject.businessPremierFare.isDisabled = false;
478
+ returnObject.businessPremierFare.fare = flight;
479
+ returnObject.businessPremierFare.price = total.price;
480
+ returnObject.businessPremierFare.currency = total.currency;
481
+ returnObject.businessPremierFare.class = flight.cabinClass;
482
+ break;
483
+ default:
484
+ console.log('new class to be implemented: ', flight.fareInfo.title);
485
+ }
486
+ });
487
+ return returnObject;
488
+ }
489
+ resetQuery(checkIsValid = true) {
490
+ this.updateTempParams(this.searchService.makeEurostarQuery());
491
+ if (checkIsValid) {
492
+ this._isValid();
493
+ }
494
+ }
495
+ resetParams() {
496
+ this.reset();
497
+ this.resetQuery();
498
+ }
499
+ _isValid() {
500
+ if (!this.doChecks) {
501
+ return;
502
+ }
503
+ this.storageService.setSessionItem(EurostarEnterpriseSearch.STORAGE_SESSION_PARAMS, {
504
+ tempParams: this.tempParams,
505
+ originalUserSearch: this.originalUserSearch
506
+ });
507
+ this.validationMessages = [];
508
+ if (!this._originAirport) {
509
+ this.validationMessages.push('Please add in a departutre location');
510
+ }
511
+ if (!this._destinationAirport) {
512
+ this.validationMessages.push('Please add in a arrival destination');
513
+ }
514
+ if (!this.tempParams.outBoundDate.isAfter(moment())) {
515
+ this.validationMessages.push('Departure date can not be in the past');
516
+ }
517
+ if (this._originAirport &&
518
+ this._destinationAirport &&
519
+ this._destinationAirport === this._originAirport) {
520
+ this.validationMessages.push('Origin and destination station cannot be the same');
521
+ }
522
+ if (this.isReturn) {
523
+ // TODO check that return details are set
524
+ if (this.tempParams.outBoundDate.isSameOrAfter(this.tempParams.inTimeCriteria)) {
525
+ this.validationMessages.push('Return date must be after the departure date');
526
+ }
527
+ }
528
+ this.isValid.next(this.validationMessages.length === 0);
529
+ this.messages.next(this.validationMessages);
530
+ }
531
+ startSearch() {
532
+ this.results.next([]);
533
+ this._isValid();
534
+ if (this.isValid.value) {
535
+ this._originalUserSearch = Object.freeze(Object.assign({}, this.tempParams));
536
+ this.storageService.setSessionItem(EurostarEnterpriseSearch.STORAGE_SESSION_PARAMS, {
537
+ tempParams: this.tempParams,
538
+ originalUserSearch: this.originalUserSearch
539
+ });
540
+ return this._startSearch(this.eurostarFetcher.fetchList(this.getSearchQuery()));
541
+ }
542
+ else {
543
+ return Promise.resolve(false);
544
+ }
545
+ }
546
+ startRecentSearch(recentSearch) { }
547
+ makeDepartureTimeWindow(dateTime, window) {
548
+ return window === TimeWindow.Depart
549
+ ? this.helpers.makeTimeWindow(dateTime, -2, 2)
550
+ : null;
551
+ }
552
+ makeArrivalTimeWindow(dateTime, window) {
553
+ if (window !== TimeWindow.Arrive) {
554
+ return null;
555
+ }
556
+ return this.helpers.makeTimeWindow(dateTime, -2, 2);
557
+ }
558
+ getSearchQuery() {
559
+ return this.helpers.removeNulls(Object.assign({}, {
560
+ originAirport: this._originAirport,
561
+ destinationAirport: this._destinationAirport,
562
+ outboundDate: this.helpers.formatIsoDate(this.tempParams.outBoundDate),
563
+ outboundDepartureTimeWindow: this.makeDepartureTimeWindow(this.tempParams.outBoundDate, this.tempParams.outTimeCriteria),
564
+ outboundArrivalTimeWindow: this.makeArrivalTimeWindow(this.tempParams.outBoundDate, this.tempParams.outTimeCriteria)
565
+ }, {
566
+ passengers: this._passengers,
567
+ returnTrip: this.isReturn,
568
+ outboundCabinClass: this.tempParams.cabinClass
569
+ ? [this.tempParams.cabinClass]
570
+ : null,
571
+ requireFreeBag: null,
572
+ maxConnections: this.tempParams.maxConnections,
573
+ includeNearbyAirports: this.tempParams.includeNearbyAirports,
574
+ preferredCarriers: this.tempParams.preferredCarriers.map((carrier) => (carrier === null || carrier === void 0 ? void 0 : carrier.code) ? carrier.code : null),
575
+ fareType: this.tempParams.fareType,
576
+ withGrouped: null
577
+ }, this.isReturn
578
+ ? {
579
+ returnDate: this.helpers.formatIsoDate(this.tempParams.inboundDate),
580
+ returnDepartureTimeWindow: this.makeDepartureTimeWindow(this.tempParams.inboundDate, this.tempParams.inTimeCriteria),
581
+ returnArrivalTimeWindow: this.makeArrivalTimeWindow(this.tempParams.inboundDate, this.tempParams.inTimeCriteria),
582
+ returnCabinClass: this.tempParams.returnCabinClass
583
+ ? [this.tempParams.returnCabinClass]
584
+ : null
585
+ }
586
+ : {}));
587
+ }
588
+ updateTravellers() {
589
+ const travellers = [];
590
+ for (let loop = 0; loop < this.tempParams.adults; loop += 1) {
591
+ travellers.push({ type: FlightPassengerType.Adult });
592
+ }
593
+ for (let loop = 0; loop < this.tempParams.children; loop += 1) {
594
+ travellers.push({ type: FlightPassengerType.Child });
595
+ }
596
+ this._passengers = travellers;
597
+ this._isValid();
598
+ }
599
+ updateAvaliableClasses() {
600
+ this.avaliableClasses.next([
601
+ {
602
+ name: 'Any',
603
+ type: EurostarClassEnum.ANY
604
+ },
605
+ {
606
+ name: 'Standard (semi flexible)',
607
+ type: EurostarClassEnum.STANDARD
608
+ },
609
+ {
610
+ name: 'Standard premier (semi flexible)',
611
+ type: EurostarClassEnum.STANDARD_PREMIER
612
+ },
613
+ {
614
+ name: 'Business premier (fully flexible)',
615
+ type: EurostarClassEnum.BUSINESS_PREMIER
616
+ }
617
+ ]);
618
+ }
619
+ /**
620
+ * @description - sort the flight results
621
+ * @todo - Fill out Preferred and Co2 sorting when we have that data
622
+ */
623
+ sortResults(sortMethodValue, givenResults) {
624
+ let results = this.helpers.clone(givenResults
625
+ ? givenResults
626
+ : this.fullResults);
627
+ switch (sortMethodValue) {
628
+ case SortTypesEurostar.CheapestFirst:
629
+ results = this.sortByPrice(results);
630
+ break;
631
+ case SortTypesEurostar.EarliestFirst:
632
+ results = this.sortByDate(results);
633
+ break;
634
+ default:
635
+ console.error(`+++ Unknown sorting method: ${sortMethodValue} +++`);
636
+ }
637
+ this.results.next(results);
638
+ }
639
+ /**
640
+ * Sort results by departure time
641
+ *
642
+ * @param {EurostarResults[]} results
643
+ * @returns
644
+ * @memberof EurostarInfo
645
+ */
646
+ sortByDate(results) {
647
+ const byDate = (a, b) => {
648
+ return (moment(a.timeDeparture, 'HH:mm').unix() -
649
+ moment(b.timeDeparture, 'HH:mm').unix());
650
+ };
651
+ const sortedResults = {
652
+ outbound: results[0].outbound.sort(byDate),
653
+ inbound: results[0].inbound.sort(byDate)
654
+ };
655
+ return [sortedResults];
656
+ }
657
+ /**
658
+ * Sort results by price
659
+ *
660
+ * @param {EurostarResults[]} results
661
+ * @returns
662
+ * @memberof EurostarInfo
663
+ */
664
+ sortByPrice(results, dir) {
665
+ const byPrice = (a, b) => {
666
+ const aPrice = +a.standardFare.price ||
667
+ +a.standardPremierFare.price ||
668
+ +a.businessPremierFare.price;
669
+ const bPrice = +b.standardFare.price ||
670
+ +b.standardPremierFare.price ||
671
+ +b.businessPremierFare.price;
672
+ if (dir) {
673
+ return bPrice - aPrice;
674
+ }
675
+ return aPrice - bPrice;
676
+ };
677
+ const sortedResults = {
678
+ outbound: results[0].outbound.sort(byPrice),
679
+ inbound: results[0].inbound.sort(byPrice)
680
+ };
681
+ return [sortedResults];
682
+ }
683
+ updateFromPreviousSearches(previousItems) {
684
+ var _a;
685
+ const flightItem = (_a = previousItems[ServiceType.Flight]) === null || _a === void 0 ? void 0 : _a.searchQuery;
686
+ if (flightItem) {
687
+ // TODO flights haven't been done yet.
688
+ }
689
+ }
690
+ getTotalBaggage(result) {
691
+ let total = 0;
692
+ const parsedAdditional = JSON.parse(result.additional);
693
+ if (parsedAdditional && parsedAdditional.outboundFlights) {
694
+ parsedAdditional.outboundFlights.forEach((flight) => {
695
+ flight.baggage.forEach((bag) => {
696
+ if (bag.allowance && bag.allowance > total) {
697
+ total = bag.allowance;
698
+ }
699
+ });
700
+ });
701
+ }
702
+ else if (parsedAdditional && parsedAdditional.baggageAllowance) {
703
+ parsedAdditional.baggageAllowance.forEach((baggageAllow) => {
704
+ if (baggageAllow.baggage.qty &&
705
+ Number(baggageAllow.baggage.qty) > total) {
706
+ total = Number(baggageAllow.baggage.qty);
707
+ }
708
+ });
709
+ }
710
+ return total;
711
+ }
712
+ /**
713
+ * @description - give the correct format for transfering minuetes on the sliders
714
+ * @param min - the min in 100th's to transform onto 60th's
715
+ */
716
+ transformMin(min) {
717
+ let num = (Number(min) * 60) / 100;
718
+ // console.log('+++ Num Copy: ', _.clone(num), ' +++');
719
+ if (num % 1 < 0.5) {
720
+ num = Math.floor(num);
721
+ }
722
+ else {
723
+ num = Math.ceil(num);
724
+ }
725
+ return num.toString().padStart(2, '0');
726
+ }
727
+ filterByDuration(minDuration, maxDuration, results, isReturn = false) {
728
+ results = results.filter((result) => {
729
+ var _a;
730
+ let dur = 0;
731
+ if (!isReturn) {
732
+ result.outboundFlights.forEach((out) => {
733
+ dur += out.totalDuration;
734
+ });
735
+ }
736
+ if (((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) && isReturn) {
737
+ result.inboundFlights.forEach((inb) => {
738
+ dur += inb.totalDuration;
739
+ });
740
+ }
741
+ return dur >= minDuration && dur <= maxDuration;
742
+ });
743
+ return results;
744
+ }
745
+ filterByDepartureTime(minDep, maxDep, results) {
746
+ results = results.filter((result) => {
747
+ const departureTime = Number(moment(result.outboundFlights[0].dateTimeDeparting).format('HHmm'));
748
+ const newNumString1 = Number(Math.floor(Number(minDep / 100)).toString() +
749
+ this.transformMin(Math.ceil(Number(minDep % 100))));
750
+ const newNumString2 = Number(Math.floor(Number(maxDep / 100)).toString() +
751
+ this.transformMin(Math.ceil(Number(maxDep % 100))));
752
+ return departureTime >= newNumString1 && departureTime <= newNumString2;
753
+ });
754
+ return results;
755
+ }
756
+ filterByReturnDepartureTime(minDep, maxDep, results) {
757
+ if (!minDep && !maxDep) {
758
+ return results;
759
+ }
760
+ const newNumString1 = Number(Math.floor(Number(minDep / 100)).toString() +
761
+ this.transformMin(Math.ceil(Number(minDep % 100))));
762
+ const newNumString2 = Number(Math.floor(Number(maxDep / 100)).toString() +
763
+ this.transformMin(Math.ceil(Number(maxDep % 100))));
764
+ results = results.filter((result) => {
765
+ if (!result.inboundFlights || !result.inboundFlights[0]) {
766
+ return true;
767
+ }
768
+ const departureTime = Number(moment(result.inboundFlights[0].dateTimeDeparting).format('HHmm'));
769
+ return departureTime >= newNumString1 && departureTime <= newNumString2;
770
+ });
771
+ return results;
772
+ }
773
+ filterByReturnArrivalTime(minArr, maxArr, results) {
774
+ if (!minArr && !maxArr) {
775
+ return results;
776
+ }
777
+ const newNumString1 = Number(Math.floor(Number(minArr / 100)).toString() +
778
+ this.transformMin(Math.ceil(Number(minArr % 100))));
779
+ const newNumString2 = Number(Math.floor(Number(maxArr / 100)).toString() +
780
+ this.transformMin(Math.ceil(Number(maxArr % 100))));
781
+ results = results.filter((result) => {
782
+ if (!result.inboundFlights || !result.inboundFlights[0]) {
783
+ return true;
784
+ }
785
+ const arrivalTime = Number(moment(result.inboundFlights[result.inboundFlights.length - 1]
786
+ .dateTimeArriving).format('HHmm'));
787
+ const retVal = arrivalTime >= newNumString1 && arrivalTime <= newNumString2;
788
+ // for debugging
789
+ // if (!retVal) {
790
+ // console.warn(`+++ Filtering Out: ${arrivalTime} +++`);
791
+ // }
792
+ return retVal;
793
+ });
794
+ return results;
795
+ }
796
+ filterByArrivalTime(minArr, maxArr, results) {
797
+ const newNumString1 = Number(Math.floor(Number(minArr / 100)).toString() +
798
+ this.transformMin(Math.ceil(Number(minArr % 100))));
799
+ const newNumString2 = Number(Math.floor(Number(maxArr / 100)).toString() +
800
+ this.transformMin(Math.ceil(Number(maxArr % 100))));
801
+ results = results.filter((result) => {
802
+ const arrivalTime = Number(moment(result.outboundFlights[result.outboundFlights.length - 1]
803
+ .dateTimeArriving).format('HHmm'));
804
+ return arrivalTime >= newNumString1 && arrivalTime <= newNumString2;
805
+ });
806
+ return results;
807
+ }
808
+ filterByBaggage(baggageFilters, results) {
809
+ const selected = baggageFilters.filter((x) => x.selected);
810
+ if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== baggageFilters.length) {
811
+ results = results.filter((result) => {
812
+ try {
813
+ const totalBags = this.getTotalBaggage(result);
814
+ return selected.find((x) => x.value === totalBags);
815
+ }
816
+ catch (error) {
817
+ console.error('+++ Error determening baggage: ${error} +++');
818
+ return false;
819
+ }
820
+ });
821
+ }
822
+ return results;
823
+ }
824
+ filterByPrice(minPrice, maxPrice, results) {
825
+ results = results.filter((result) => {
826
+ // console.log(`+++ Price: ${result.total.price} is between: ${minPrice} and ${maxPrice}: ${result.total.price >= minPrice && result.total.price <= maxPrice} +++`)
827
+ return result.total.price >= minPrice && result.total.price <= maxPrice;
828
+ });
829
+ return results;
830
+ }
831
+ /**
832
+ * @description - filter the results by the number of stops
833
+ * @param stopFilters - the selected stops
834
+ * @param fullResults - all of our results so far
835
+ */
836
+ filterResultsByStops(stopFilters, fullResults) {
837
+ const selected = stopFilters.filter((x) => x.selected);
838
+ if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== stopFilters.length) {
839
+ fullResults = fullResults.filter((result) => {
840
+ const totalStops = result.outboundFlights.length - 1;
841
+ const haveStop = selected.find((selected1) => selected1.value === totalStops);
842
+ return haveStop;
843
+ });
844
+ }
845
+ return fullResults;
846
+ }
847
+ filterResultsByAirline(airlineFilters, results) {
848
+ const selected = airlineFilters.filter((x) => x.selected);
849
+ if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== airlineFilters.length) {
850
+ results = results.filter((result) => {
851
+ return selected.find((x) => x.value === result.outboundFlights[0].operatingCarrier);
852
+ });
853
+ }
854
+ return results;
855
+ }
856
+ filterResultsByClass(classFilters, results) {
857
+ const selected = classFilters.filter((x) => x.selected);
858
+ if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== classFilters.length) {
859
+ results = results.filter((result) => {
860
+ return selected.find((x) => x.value === result.outboundFlights[0].cabinClass);
861
+ });
862
+ }
863
+ return results;
864
+ }
865
+ filterByDepartureAirport(departureAirports, results) {
866
+ const selected = departureAirports.filter((x) => x.selected);
867
+ if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== departureAirports.length) {
868
+ results = results.filter((result) => {
869
+ return selected.find((x) => x.value === result.outboundFlights[0].originAirport);
870
+ });
871
+ }
872
+ return results;
873
+ }
874
+ filterByArrivalAirport(arrivalAirports, results) {
875
+ const selected = arrivalAirports.filter((x) => x.selected);
876
+ if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== arrivalAirports.length) {
877
+ results = results.filter((result) => {
878
+ const destinationAirport = result.outboundFlights[result.outboundFlights.length - 1]
879
+ .destinationAirport;
880
+ return selected.find((x) => x.value === destinationAirport);
881
+ });
882
+ }
883
+ return results;
884
+ }
885
+ filterByDepartureReturnAirport(departureAirports, results) {
886
+ const selected = departureAirports.filter((x) => x.selected);
887
+ if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== departureAirports.length) {
888
+ results = results.filter((result) => {
889
+ var _a;
890
+ if (!((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length)) {
891
+ return true;
892
+ }
893
+ return selected.find((x) => x.value === result.inboundFlights[0].originAirport);
894
+ });
895
+ }
896
+ return results;
897
+ }
898
+ filterByArrivalReturnAirport(arrivalAirports, results) {
899
+ const selected = arrivalAirports.filter((x) => x.selected);
900
+ if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== arrivalAirports.length) {
901
+ results = results.filter((result) => {
902
+ var _a;
903
+ if (!((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length)) {
904
+ return true;
905
+ }
906
+ const destinationAirport = result.inboundFlights[result.inboundFlights.length - 1]
907
+ .destinationAirport;
908
+ return selected.find((x) => x.value === destinationAirport);
909
+ });
910
+ }
911
+ return results;
912
+ }
913
+ createFilters(results = []) {
914
+ const minPrice = this.getMinPrice(results);
915
+ const maxPrice = this.getMaxPrice(results);
916
+ const newFilters = {
917
+ stops: this.getAllStops(results),
918
+ mustInclude: [],
919
+ classes: this.getAllClasses(results),
920
+ airlines: this.getAllAirlines(results),
921
+ travelPolicy: [],
922
+ depatureAirport: this.getAllDepartureAirports(results),
923
+ arrivalAirport: this.getAllArrivalAirports(results),
924
+ minPrice,
925
+ maxPrice,
926
+ depatureReturnAirport: this.getAllDepartureAirports(results, true),
927
+ arrivalReturnAirport: this.getAllArrivalAirports(results, true),
928
+ baggage: this.getBaggage(results),
929
+ fareTypes: [],
930
+ minDuration: this.getMinDuration(results),
931
+ maxDuration: this.getMaxDuration(results),
932
+ minReturnDuration: this.getMinDuration(results, true),
933
+ maxReturnDuration: this.getMaxDuration(results, true),
934
+ minDepartureTime: this.getMinDepartureTime(results),
935
+ maxDepartureTime: this.getMaxDepartureTime(results),
936
+ minArrivalTime: this.getMinArrivalTime(results),
937
+ maxArrivalTime: this.getMaxArrivalTime(results),
938
+ minReturnDepartureTime: this.getMinReturnDepartureTime(results),
939
+ maxReturnDepartureTime: this.getMaxReturnDepartureTime(results),
940
+ maxReturnArrivalTime: this.getMaxReturnArrivalTime(results),
941
+ minReturnArrivalTime: this.getMinReturnArrivalTime(results),
942
+ flightNumber: ''
943
+ };
944
+ return newFilters;
945
+ }
946
+ getMinDuration(results, isReturn = false) {
947
+ let min = 0;
948
+ results.forEach((result) => {
949
+ var _a;
950
+ let dur = 0;
951
+ if (!isReturn) {
952
+ result.outboundFlights.forEach((out) => {
953
+ dur += out.totalDuration;
954
+ });
955
+ }
956
+ if (((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) && isReturn) {
957
+ result.inboundFlights.forEach((inb) => {
958
+ dur += inb.totalDuration;
959
+ });
960
+ }
961
+ if (!min || dur < min) {
962
+ min = dur;
963
+ }
964
+ });
965
+ return min;
966
+ }
967
+ getMaxDuration(results, isReturn = false) {
968
+ let max = 0;
969
+ results.forEach((result) => {
970
+ var _a;
971
+ let dur = 0;
972
+ if (!isReturn) {
973
+ result.outboundFlights.forEach((out) => {
974
+ dur += out.totalDuration;
975
+ });
976
+ }
977
+ if (((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) && isReturn) {
978
+ result.inboundFlights.forEach((inb) => {
979
+ dur += inb.totalDuration;
980
+ });
981
+ }
982
+ if (!max || dur > max) {
983
+ max = dur;
984
+ }
985
+ });
986
+ return max;
987
+ }
988
+ getMinArrivalTime(results) {
989
+ let min;
990
+ results.forEach((result) => {
991
+ let minDepTime = Number(moment(result.outboundFlights[result.outboundFlights.length - 1]
992
+ .dateTimeArriving).format('HHmm'));
993
+ minDepTime = Math.floor(minDepTime / 100) * 100;
994
+ if (!min || minDepTime < min) {
995
+ min = minDepTime;
996
+ }
997
+ });
998
+ return min;
999
+ }
1000
+ getMinReturnArrivalTime(results) {
1001
+ let min;
1002
+ results.forEach((result) => {
1003
+ if (result.inboundFlights && result.inboundFlights.length) {
1004
+ let minDepTime = Number(moment(result.inboundFlights[result.inboundFlights.length - 1]
1005
+ .dateTimeArriving).format('HHmm'));
1006
+ minDepTime = Math.floor(minDepTime / 100) * 100;
1007
+ if (!min || minDepTime < min) {
1008
+ min = minDepTime;
1009
+ }
1010
+ }
1011
+ });
1012
+ return min;
1013
+ }
1014
+ getMaxReturnArrivalTime(results) {
1015
+ let max;
1016
+ results.forEach((result) => {
1017
+ if (result.inboundFlights && result.inboundFlights.length) {
1018
+ let maxDepTime = Number(moment(result.inboundFlights[result.inboundFlights.length - 1]
1019
+ .dateTimeArriving).format('HHmm'));
1020
+ maxDepTime = Math.ceil(maxDepTime / 100) * 100;
1021
+ if (!max || maxDepTime > max) {
1022
+ max = maxDepTime;
1023
+ }
1024
+ }
1025
+ });
1026
+ return max;
1027
+ }
1028
+ getMaxArrivalTime(results) {
1029
+ let max;
1030
+ results.forEach((result) => {
1031
+ let maxDepTime = Number(moment(result.outboundFlights[result.outboundFlights.length - 1]
1032
+ .dateTimeArriving).format('HHmm'));
1033
+ maxDepTime = Math.ceil(maxDepTime / 100) * 100;
1034
+ if (!max || maxDepTime > max) {
1035
+ max = maxDepTime;
1036
+ }
1037
+ });
1038
+ return max;
1039
+ }
1040
+ getMinDepartureTime(results) {
1041
+ let min;
1042
+ results.forEach((result) => {
1043
+ let minDepTime = Number(moment(result.outboundFlights[0].dateTimeDeparting).format('HHmm'));
1044
+ minDepTime = Math.floor(minDepTime / 100) * 100;
1045
+ if (!min || minDepTime < min) {
1046
+ min = minDepTime;
1047
+ }
1048
+ });
1049
+ return min;
1050
+ }
1051
+ getMinReturnDepartureTime(results) {
1052
+ let min;
1053
+ results.forEach((result) => {
1054
+ if (result.inboundFlights && result.inboundFlights[0]) {
1055
+ let minDepTime = Number(moment(result.inboundFlights[0].dateTimeDeparting).format('HHmm'));
1056
+ minDepTime = Math.floor(minDepTime / 100) * 100;
1057
+ if (!min || minDepTime < min) {
1058
+ min = minDepTime;
1059
+ }
1060
+ }
1061
+ });
1062
+ return min;
1063
+ }
1064
+ getMaxReturnDepartureTime(results) {
1065
+ let max;
1066
+ results.forEach((result) => {
1067
+ if (result.inboundFlights && result.inboundFlights[0]) {
1068
+ let maxDepTime = Number(moment(result.inboundFlights[0].dateTimeDeparting).format('HHmm'));
1069
+ maxDepTime = Math.ceil(maxDepTime / 100) * 100;
1070
+ if (!max || maxDepTime > max) {
1071
+ max = maxDepTime;
1072
+ }
1073
+ }
1074
+ });
1075
+ return max;
1076
+ }
1077
+ getMaxDepartureTime(results) {
1078
+ let max;
1079
+ results.forEach((result) => {
1080
+ let maxDepTime = Number(moment(result.outboundFlights[0].dateTimeDeparting).format('HHmm'));
1081
+ maxDepTime = Math.ceil(maxDepTime / 100) * 100;
1082
+ if (!max || maxDepTime > max) {
1083
+ max = maxDepTime;
1084
+ }
1085
+ });
1086
+ return max;
1087
+ }
1088
+ getBaggage(results) {
1089
+ const baggage = {};
1090
+ results.forEach((result) => {
1091
+ try {
1092
+ const parsedAdditional = JSON.parse(result.additional);
1093
+ let total = 0;
1094
+ if (parsedAdditional && parsedAdditional.outboundFlights) {
1095
+ parsedAdditional.outboundFlights.forEach((flight) => {
1096
+ flight.baggage.forEach((bag) => {
1097
+ if (bag.allowance && bag.allowance > total) {
1098
+ total = bag.allowance;
1099
+ }
1100
+ });
1101
+ });
1102
+ }
1103
+ else if (parsedAdditional && parsedAdditional.baggageAllowance) {
1104
+ parsedAdditional.baggageAllowance.forEach((baggageAllow) => {
1105
+ if (baggageAllow.baggage.qty &&
1106
+ Number(baggageAllow.baggage.qty) > total) {
1107
+ total = Number(baggageAllow.baggage.qty);
1108
+ }
1109
+ });
1110
+ }
1111
+ baggage[total] = {
1112
+ selected: false,
1113
+ value: total,
1114
+ display: `${total} bag${total !== 1 ? 's' : ''}`
1115
+ };
1116
+ }
1117
+ catch (error) {
1118
+ console.error(`+++ Error parsing additional flight data: ${error} +++`);
1119
+ }
1120
+ });
1121
+ return Object.values(baggage);
1122
+ }
1123
+ getMinPrice(results) {
1124
+ let minPrice;
1125
+ results.forEach((result) => {
1126
+ if (!minPrice || result.total.price < minPrice) {
1127
+ minPrice = result.total.price;
1128
+ }
1129
+ });
1130
+ return minPrice;
1131
+ }
1132
+ getMaxPrice(results) {
1133
+ let maxPrice;
1134
+ results.forEach((result) => {
1135
+ if (!maxPrice || result.total.price > maxPrice) {
1136
+ maxPrice = result.total.price;
1137
+ }
1138
+ });
1139
+ return maxPrice;
1140
+ }
1141
+ getAllStops(results) {
1142
+ const allStops = {};
1143
+ results.forEach((result) => {
1144
+ const totalStops = result.outboundFlights.length - 1; // might have to recalculate this
1145
+ allStops[totalStops] = {
1146
+ value: totalStops,
1147
+ display: `${totalStops} stop` + (totalStops !== 1 ? 's' : ''),
1148
+ selected: false
1149
+ };
1150
+ });
1151
+ return Object.values(allStops);
1152
+ }
1153
+ getAllClasses(results) {
1154
+ const allClasses = [];
1155
+ results.forEach((result) => {
1156
+ result.outboundFlights.forEach((outFlight) => {
1157
+ allClasses[outFlight.cabinClass] = {
1158
+ value: outFlight.cabinClass,
1159
+ display: outFlight.cabinClass,
1160
+ selected: false
1161
+ };
1162
+ });
1163
+ if (result.inboundFlights) {
1164
+ result.inboundFlights.forEach((inFlight) => {
1165
+ allClasses[inFlight.cabinClass] = {
1166
+ value: inFlight.cabinClass,
1167
+ display: inFlight.cabinClass,
1168
+ selected: false
1169
+ };
1170
+ });
1171
+ }
1172
+ });
1173
+ return Object.values(allClasses);
1174
+ }
1175
+ /**
1176
+ * @description - create select filters for all unique departure airports returned in the search
1177
+ * @param results - the flight results
1178
+ */
1179
+ getAllDepartureAirports(results, inbound = false) {
1180
+ const allAirports = {};
1181
+ results.forEach((result) => {
1182
+ var _a;
1183
+ if (result.outboundFlights.length && !inbound) {
1184
+ allAirports[result.outboundFlights[0].originAirport] = {
1185
+ value: result.outboundFlights[0].originAirport,
1186
+ display: result.outboundFlights[0].originAirportName,
1187
+ selected: false
1188
+ };
1189
+ }
1190
+ if (((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) && inbound) {
1191
+ allAirports[result.inboundFlights[0].originAirport] = {
1192
+ value: result.inboundFlights[0].originAirport,
1193
+ display: result.inboundFlights[0].originAirportName,
1194
+ selected: false
1195
+ };
1196
+ }
1197
+ });
1198
+ return Object.values(allAirports);
1199
+ }
1200
+ /**
1201
+ * @description - create select filters for all unique departure airports returned in the search
1202
+ * @param results - the flight results
1203
+ */
1204
+ getAllArrivalAirports(results, inbound = false) {
1205
+ const allAirports = {};
1206
+ results.forEach((result) => {
1207
+ var _a;
1208
+ if (result.outboundFlights.length && !inbound) {
1209
+ allAirports[result.outboundFlights[result.outboundFlights.length - 1].destinationAirport] = {
1210
+ value: result.outboundFlights[result.outboundFlights.length - 1]
1211
+ .destinationAirport,
1212
+ display: result.outboundFlights[result.outboundFlights.length - 1]
1213
+ .destinationAirportName,
1214
+ selected: false
1215
+ };
1216
+ }
1217
+ if (((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) && inbound) {
1218
+ allAirports[result.inboundFlights[result.inboundFlights.length - 1].destinationAirport] = {
1219
+ value: result.inboundFlights[result.inboundFlights.length - 1]
1220
+ .destinationAirport,
1221
+ display: result.inboundFlights[result.inboundFlights.length - 1]
1222
+ .destinationAirportName,
1223
+ selected: false
1224
+ };
1225
+ }
1226
+ });
1227
+ return Object.values(allAirports);
1228
+ }
1229
+ /**
1230
+ * @description - create select filters for all unique airlines returned in the search
1231
+ * @param results - the flight results
1232
+ */
1233
+ getAllAirlines(results) {
1234
+ const allAirlines = {};
1235
+ results.forEach((result) => {
1236
+ result.outboundFlights.forEach((outFlight) => {
1237
+ allAirlines[outFlight.operatingCarrier] = {
1238
+ value: outFlight.operatingCarrier,
1239
+ display: outFlight.operatingCarrierName,
1240
+ selected: false
1241
+ };
1242
+ });
1243
+ if (result.inboundFlights) {
1244
+ result.inboundFlights.forEach((inFlight) => {
1245
+ allAirlines[inFlight.operatingCarrier] = {
1246
+ value: inFlight.operatingCarrier,
1247
+ display: inFlight.operatingCarrierName,
1248
+ selected: false
1249
+ };
1250
+ });
1251
+ }
1252
+ });
1253
+ return Object.values(allAirlines);
1254
+ }
1255
+ selectGroupedEurostar(selectedEurostar, fare, direction) {
1256
+ return __awaiter(this, void 0, void 0, function* () {
1257
+ const intBasket = yield this.basketService.getDefaultBasket();
1258
+ const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
1259
+ if (basket &&
1260
+ this.originalUserSearch.chosenSearchType === EurostarSearchType.oneWay &&
1261
+ direction === FlightDirectionEnum.Outbound) {
1262
+ this.doBooking(intBasket, selectedEurostar, {
1263
+ outboundFlights: [this.makeSchemaFlights(fare.fare, 'outbound', 0)],
1264
+ inboundFlights: [],
1265
+ journeyType: 'single'
1266
+ }, selectedEurostar.dateDeparture);
1267
+ return;
1268
+ }
1269
+ if (basket &&
1270
+ this.originalUserSearch.chosenSearchType === EurostarSearchType.return &&
1271
+ direction === FlightDirectionEnum.Outbound) {
1272
+ this.selectedGroupEurostar = selectedEurostar;
1273
+ this.selectedEurostarFare = fare;
1274
+ const index = selectedEurostar.uid;
1275
+ this.results.next(this.fullResults.map((result) => {
1276
+ const outbound = result.outbound.filter((item, groupIndex) => index === groupIndex);
1277
+ return { inbound: result.inbound, outbound };
1278
+ }));
1279
+ }
1280
+ if (basket &&
1281
+ this.originalUserSearch.chosenSearchType === EurostarSearchType.return &&
1282
+ direction === FlightDirectionEnum.Inbound &&
1283
+ this.selectedGroupEurostar) {
1284
+ this.doBooking(intBasket, selectedEurostar, {
1285
+ outboundFlights: [
1286
+ this.makeSchemaFlights(this.selectedEurostarFare.fare, 'outbound', 0)
1287
+ ],
1288
+ inboundFlights: [
1289
+ this.makeSchemaFlights(fare.fare, 'inbound', 0)
1290
+ ],
1291
+ journeyType: 'roundtrip'
1292
+ }, selectedEurostar.dateDeparture, this.selectedGroupEurostar.dateArrival);
1293
+ this.results.next(this.fullResults);
1294
+ }
1295
+ });
1296
+ }
1297
+ updateLowestPrice(results) {
1298
+ return null;
1299
+ // add in once filght result is updated///
1300
+ // const results = this.storageService.getSessionItemAsList<FlightQuoteResultArray>(this.resultsSessionName) || [] as FlightQuoteResultArray;
1301
+ // if(!results.length) return;
1302
+ // this._cheapestResultPrice.currencyCode = results[0].total.currency;
1303
+ // results.map(result => {
1304
+ // const price = result.total.price;
1305
+ // if( this._cheapestResultPrice.amount > price || this._cheapestResultPrice.amount === null){
1306
+ // this._cheapestResultPrice.amount = price;
1307
+ // }
1308
+ // })
1309
+ }
1310
+ doBooking(intBasket, selectedFlight, schemaDetails, outboundDate, inboundDate) {
1311
+ const { sourceId, co2PerItem, co2PerPassenger, total } = selectedFlight;
1312
+ const booking = {
1313
+ adults: this.adults,
1314
+ basket: intBasket.id,
1315
+ children: this.children,
1316
+ co2PerItem,
1317
+ co2PerPassenger,
1318
+ currency: total.currency,
1319
+ detail: schemaDetails,
1320
+ price: total.price,
1321
+ searchQuery: this.resultQuery,
1322
+ service: sourceId.toString(),
1323
+ outboundDate
1324
+ };
1325
+ if (inboundDate) {
1326
+ booking.inboundDate = inboundDate;
1327
+ }
1328
+ this.basketService.addToBasket(booking, intBasket, this.searchService, this.travellers);
1329
+ }
1330
+ makeSchemaFlights(selectedFlight, flightGroup, groupIndex, segmentIndex) {
1331
+ return {
1332
+ cabinClass: selectedFlight.cabinClass,
1333
+ dateTimeArriving: selectedFlight.dateTimeArriving,
1334
+ dateTimeArrivingUTC: selectedFlight.dateTimeArrivingUTC,
1335
+ dateTimeDeparting: selectedFlight.dateTimeDeparting,
1336
+ dateTimeDepartingUTC: selectedFlight.dateTimeDepartingUTC,
1337
+ destinationAirport: selectedFlight.destinationAirport,
1338
+ journeyInfo: {
1339
+ flightGroup,
1340
+ groupIndex,
1341
+ segmentIndex
1342
+ },
1343
+ marketingCarrier: selectedFlight.marketingCarrier,
1344
+ marketingFlightNumber: selectedFlight.marketingFlightNumber,
1345
+ operatingCarrier: selectedFlight.operatingCarrier,
1346
+ operatingFlightNumber: selectedFlight.operatingFlightNumber,
1347
+ originAirport: selectedFlight.originAirport,
1348
+ totalDuration: selectedFlight.totalDuration,
1349
+ fareType: selectedFlight.fareInfo.title
1350
+ };
1351
+ }
1352
+ createGroupedItem(returnObject, source, outboundFlights, outboundTotalDuration, inboundFlights, inboundTotalDuration) {
1353
+ if ((outboundFlights === null || outboundFlights === void 0 ? void 0 : outboundFlights.length) && !returnObject.departDateTime) {
1354
+ const first = outboundFlights[0];
1355
+ const last = outboundFlights[outboundFlights.length - 1];
1356
+ returnObject.originAirport = first.originAirport;
1357
+ returnObject.originAirportName = first.originAirportName;
1358
+ returnObject.destinationAirport = last.destinationAirport;
1359
+ returnObject.destinationAirportName = last.destinationAirportName;
1360
+ returnObject.departDateTime = first.dateTimeDeparting;
1361
+ returnObject.arrivalDateTime = last.dateTimeArriving;
1362
+ returnObject.outboundTotalDuration = outboundTotalDuration;
1363
+ returnObject.dataSource = source;
1364
+ returnObject.operator = first.operatingCarrier;
1365
+ returnObject.operatorFull = first.operatingCarrierName;
1366
+ returnObject.outlegsCount = outboundFlights.length;
1367
+ returnObject.outlegs = outboundFlights;
1368
+ returnObject.outboundFlightNumber =
1369
+ this.helpers.joinFromAttribute('-', 'operatingFlightNumber', outboundFlights);
1370
+ returnObject.isReturn = false;
1371
+ }
1372
+ if ((inboundFlights === null || inboundFlights === void 0 ? void 0 : inboundFlights.length) && !returnObject.inboundTotalDuration) {
1373
+ returnObject.inboundTotalDuration = inboundTotalDuration;
1374
+ returnObject.inlegsCount = inboundFlights.length;
1375
+ returnObject.inlegs = inboundFlights;
1376
+ returnObject.inboundFlightNumber =
1377
+ this.helpers.joinFromAttribute('-', 'operatingFlightNumber', inboundFlights);
1378
+ returnObject.isReturn = true;
1379
+ }
1380
+ }
1381
+ makeSessionResults(data) {
1382
+ return {
1383
+ results: data,
1384
+ groupData: this.flightsToGroup,
1385
+ grouped: this.grouped,
1386
+ query: this.resultQuery
1387
+ };
1388
+ }
1389
+ getMinFlightPriceForBrand(matchingBrandFlights) {
1390
+ let min = Number.MAX_SAFE_INTEGER;
1391
+ matchingBrandFlights.forEach((flight) => {
1392
+ var _a;
1393
+ if (min > ((_a = flight === null || flight === void 0 ? void 0 : flight.total) === null || _a === void 0 ? void 0 : _a.price)) {
1394
+ min = flight.total.price;
1395
+ }
1396
+ });
1397
+ return min;
1398
+ }
1399
+ getMaxFlightPriceForBrand(matchingBrandFlights) {
1400
+ let max = 0;
1401
+ matchingBrandFlights.forEach((flight) => {
1402
+ var _a;
1403
+ if (max < ((_a = flight === null || flight === void 0 ? void 0 : flight.total) === null || _a === void 0 ? void 0 : _a.price)) {
1404
+ max = flight.total.price;
1405
+ }
1406
+ });
1407
+ return max;
1408
+ }
1409
+ isOverNight() {
1410
+ const outwardDay = this.outBoundDate.date();
1411
+ const returnDay = this.inboundDate.date();
1412
+ if (returnDay - outwardDay >= 1) {
1413
+ return true;
1414
+ }
1415
+ return false;
1416
+ }
1417
+ addEurostarJourneysToBasket(eurostarQuote) {
1418
+ return __awaiter(this, void 0, void 0, function* () {
1419
+ if (eurostarQuote.unavailable) {
1420
+ return Promise.resolve(false);
1421
+ }
1422
+ const intBasket = yield this.basketService.getDefaultBasket();
1423
+ const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
1424
+ if (basket) {
1425
+ const { sourceId, co2PerItem, co2PerPassenger, total } = eurostarQuote;
1426
+ const outboundDate = moment(eurostarQuote.outboundFlights[0].dateTimeDeparting);
1427
+ const inboundDate = eurostarQuote.inboundFlights.length ? moment(eurostarQuote.inboundFlights[0].dateTimeDeparting) : null;
1428
+ const schemaDetails = {
1429
+ outboundFlights: [
1430
+ ...eurostarQuote.outboundFlights.map((flight, segmentIndex) => this.makeSchemaFlights(flight, 'outbound', 0, segmentIndex))
1431
+ ],
1432
+ inboundFlights: [
1433
+ ...eurostarQuote.inboundFlights.map((flight, segmentIndex) => this.makeSchemaFlights(flight, 'inbound', 0, segmentIndex))
1434
+ ],
1435
+ journeyType: 'single'
1436
+ };
1437
+ const booking = {
1438
+ adults: this.adults,
1439
+ basket: intBasket.id,
1440
+ children: this.children,
1441
+ co2PerItem,
1442
+ co2PerPassenger,
1443
+ currency: total.currency,
1444
+ detail: schemaDetails,
1445
+ price: total.price,
1446
+ searchQuery: this.resultQuery,
1447
+ service: sourceId.toString(),
1448
+ outboundDate: outboundDate.format()
1449
+ };
1450
+ if (inboundDate) {
1451
+ booking.inboundDate = inboundDate.format();
1452
+ schemaDetails.journeyType = 'roundtrip';
1453
+ }
1454
+ return this.basketService.addToBasket(booking, intBasket, this.searchService, this.travellers);
1455
+ }
1456
+ return Promise.resolve(false); // TODO should this throw an error?
1457
+ });
1458
+ }
1459
+ }
1460
+ EurostarEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_eurostar';
1461
+ EurostarEnterpriseSearch.STORAGE_SESSION_RESULTS = 'results_eurostar';
1462
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXZDLE9BQU8sRUFLTCxRQUFRLEVBTVIsbUJBQW1CLEVBRW5CLFdBQVcsRUFDWixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFLTCxtQkFBbUIsRUFRbkIsaUJBQWlCLEVBRWxCLE1BQU0sZ0JBQWdCLENBQUM7QUFPeEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFjakUsT0FBTyxFQUdMLFVBQVUsRUFDWCxNQUFNLDRCQUE0QixDQUFDO0FBYXBDLE1BQU0sQ0FBTixJQUFZLGlCQUdYO0FBSEQsV0FBWSxpQkFBaUI7SUFDM0Isd0NBQW1CLENBQUE7SUFDbkIsd0NBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUhXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFHNUI7QUFFRCxNQUFNLENBQU4sSUFBWSxVQUdYO0FBSEQsV0FBWSxVQUFVO0lBQ3BCLHlDQUEyQixDQUFBO0lBQzNCLHVDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFIVyxVQUFVLEtBQVYsVUFBVSxRQUdyQjtBQXdCRCxNQUFNLE9BQU8sd0JBQ1gsU0FBUSxvQkFJUDtJQThaRCxZQUNVLGVBQStDLEVBQy9DLE9BQTJCLEVBQ25DLFdBQWlDLEVBQ3pCLGFBQStDLEVBQ3ZELGNBQWtDLEVBQzFCLGFBQStDO1FBRXZELEtBQUssQ0FDSCxjQUFj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QyxhQUFhLENBQUMsV0FBVyxDQUNuQyxPQUFPLEVBQ1AsU0FBUyxFQUNULElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7YUFDSDtZQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztRQUNwRSxDQUFDO0tBQUE7O0FBeDlEZSwrQ0FBc0IsR0FBRyxpQkFBaUIsQ0FBQztBQUMzQyxnREFBdUIsR0FBRyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQmFzZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuL2Jhc2UtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IEJhc2VTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4vaGVscGVycyc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFZhbHVlRGlzcGxheSB9IGZyb20gJy4uL2ludGVyZmFjZXMvdmFsdWUtZGlzcGxheSc7XHJcbmltcG9ydCB7IEZsaWdodEZpbHRlcnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2ZsaWdodC1maWx0ZXJzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFNlbGVjdEZpbHRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VsZWN0LWZpbHRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIEFkZEl0ZW1Ub0Jhc2tldE11dGF0aW9uVmFyaWFibGVzLFxyXG4gIEJhc2tldEl0ZW0sXHJcbiAgQ3VycmVuY3lDb2RlLFxyXG4gIERlc3RpbmF0aW9uRW50cnksXHJcbiAgRmFyZVR5cGUsXHJcbiAgRmxpZ2h0Q2FiaW5DbGFzcyxcclxuICBGbGlnaHRGYXJlVG90YWwsXHJcbiAgRmxpZ2h0SXRpbmVyYXJ5LFxyXG4gIEZsaWdodEpvdXJuZXksXHJcbiAgRmxpZ2h0UGFzc2VuZ2VyT2JqZWN0LFxyXG4gIEZsaWdodFBhc3NlbmdlclR5cGUsXHJcbiAgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VydmljZVR5cGVcclxufSBmcm9tICcuLi90eXBlcy9ncmFwaHFsLnR5cGVzJztcclxuaW1wb3J0IHtcclxuICBFdXJvc3RhclF1b3RlUmVzdWx0LFxyXG4gIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgT0JUQWlycG9ydERldGFpbHMsXHJcbiAgT0JUQWlybGluZXNEZXRhaWxzLFxyXG4gIEZsaWdodERpcmVjdGlvbkVudW0sXHJcbiAgR3JvdXBlZEZsaWdodHMsXHJcbiAgRmxpZ2h0SXRpbmVyYXJ5V2l0aFNlbGVjdGVkLFxyXG4gIFJlY2VudFNlYXJjaCxcclxuICBFdXJvc3Rhckdyb3VwZWRRdW90ZVJlc3VsdCxcclxuICBFdXJvc3RhclJlc3VsdHMsXHJcbiAgRXVyb3N0YXJJdGVtLFxyXG4gIEV1cm9zdGFyRmFyZSxcclxuICBFdXJvc3RhckNsYXNzRW51bSxcclxuICBFdXJvc3RhclF1b3RlUmVzdWx0QXJyYXlcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgRnVsbFVzZXJEZXRhaWxzLFxyXG4gIFVzZXJTZXJ2aWNlSW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lzZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7IElDaGVhcGVzdFByaWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVhcGVzdC1wcmljZSc7XHJcbmltcG9ydCB7IEV1cm9zdGFyU2VhcmNoVHlwZSB9IGZyb20gJy4vZXVyb3N0YXItc2VhcmNoLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IElNdWx0aURlc3RpbmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9mbGlnaHQtbXVsdGktZGVzdGluYXRpb24uaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICBJbnRlcm5hbEJhc2tldEludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWVudGVycHJpc2UtYmFza2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VFdXJvc3RhclF1b3RlRmV0Y2hlcixcclxuICBFdXJvc3RhclF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9ldXJvc3Rhci1xdW90ZS5mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBFdXJvc3RhckVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgRXVyb3N0YXJUZW1wUGFyYW1zXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQge1xyXG4gIEZsaWdodEdyb3VwcyxcclxuICBGbGlnaHRPcGVyYXRvcixcclxuICBUaW1lV2luZG93XHJcbn0gZnJvbSAnLi9mbGlnaHQtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5leHBvcnQgaW50ZXJmYWNlIEFsbG93ZWRDbGFzc0V1cm9zdGFyIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdHlwZTogRXVyb3N0YXJDbGFzc0VudW0gfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBbGxvd2VkQ2xhc3Nlc0V1cm9zdGFyID0gQWxsb3dlZENsYXNzRXVyb3N0YXJbXTtcclxuXHJcbmV4cG9ydCB0eXBlIEV1cm9zdGFyU3RhdGlvbiA9IHtcclxuICBnYXRld2F5OiBzdHJpbmc7XHJcbiAgZGVzdGluYXRpb246IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCBlbnVtIFNvcnRUeXBlc0V1cm9zdGFyIHtcclxuICBDaGVhcGVzdEZpcnN0ID0gJ0MnLFxyXG4gIEVhcmxpZXN0Rmlyc3QgPSAnRSdcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU29ydE1ldGhvZCB7XHJcbiAgc29ydEJ5UHJpY2UgPSAnc29ydEJ5UHJpY2UnLFxyXG4gIHNvcnRCeURhdGUgPSAnc29ydEJ5RGF0ZSdcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTb3J0VHlwZUV1cm9zdGFyIHtcclxuICAvKiogVGl0bGUgZGlzcGxheWVkIG9uIGRyb3Bkb3duICovXHJcbiAgdGl0bGU6IHN0cmluZztcclxuICAvKiogTWV0aG9kIG5hbWUgdXNlZCBieSBjb21wb25lbnQgdG8gc29ydCByZXN1bHRzICovXHJcbiAgbWV0aG9kOiBTb3J0TWV0aG9kO1xyXG4gIC8qKiBJY29uIGRpc3BsYXllZCBvbiBkcm9wIGRvd24gKi9cclxuICBpY29uOiBzdHJpbmc7XHJcbiAgLyoqIFNvcnRpbmcgZGlyZWN0aW9uIHRydWUgZm9yIGFzYywgZmFsc2UgZm9yIGRzYyAqL1xyXG4gIGRpcjogYm9vbGVhbjtcclxuICAvLyB0aGlzIGlzIHdoYXQgd2Ugd2lsbCB1c2UgdG8gc29ydFxyXG4gIGNvZGU6IFNvcnRUeXBlc0V1cm9zdGFyO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBFdXJvc3Rhckdyb3VwcyA9ICdTdGFuZGFyZCcgfCAnU3RhbmRhcmRQcmVtaWVyJyB8ICdCdXNpbmVzc1ByZW1pZXInO1xyXG5cclxuaW50ZXJmYWNlIEV1cm9zdGFyU2Vzc2lvblR5cGUge1xyXG4gIHJlc3VsdHM6IEV1cm9zdGFyUXVvdGVSZXN1bHRBcnJheTtcclxuICBncm91cERhdGE6IHsgW2tleTogbnVtYmVyXTogbnVtYmVyW10gfTtcclxuICBncm91cGVkOiBHcm91cGVkRmxpZ2h0cztcclxuICBxdWVyeTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXM7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFdXJvc3RhckVudGVycHJpc2VTZWFyY2g8U0VfUSBleHRlbmRzIEV1cm9zdGFyUXVvdGVGZXRjaGVyVHlwZT5cclxuICBleHRlbmRzIEJhc2VFbnRlcnByaXNlU2VhcmNoPFxyXG4gIEV1cm9zdGFyVGVtcFBhcmFtcyxcclxuICBFdXJvc3RhclF1b3RlUmVzdWx0LFxyXG4gIEV1cm9zdGFyUXVvdGVSZXN1bHRBcnJheVxyXG4gID5cclxuICBpbXBsZW1lbnRzIEV1cm9zdGFyRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZSB7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9QQVJBTVMgPSAnc2VhcmNoX2V1cm9zdGFyJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAncmVzdWx0c19ldXJvc3Rhcic7XHJcblxyXG4gIHB1YmxpYyB0eXBlOiBTZXJ2aWNlVHlwZSA9IFNlcnZpY2VUeXBlLkV1cm9zdGFyO1xyXG5cclxuICBhdmFsaWFibGVDbGFzc2VzOiBCZWhhdmlvclN1YmplY3Q8QWxsb3dlZENsYXNzZXNFdXJvc3Rhcj4gPVxyXG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdDxBbGxvd2VkQ2xhc3Nlc0V1cm9zdGFyPihbXSk7XHJcbiAgdGltZUNyaXRlcmlhT3B0aW9uczogQmVoYXZpb3JTdWJqZWN0PFRpbWVXaW5kb3dbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgVGltZVdpbmRvd1tdXHJcbiAgPihbXSk7XHJcbiAgZmxpZ2h0T3BlcmF0b3JzOiBCZWhhdmlvclN1YmplY3Q8RmxpZ2h0T3BlcmF0b3JbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgRmxpZ2h0T3BlcmF0b3JbXVxyXG4gID4oW10pO1xyXG5cclxuICBwcml2YXRlIF9uZWdvdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfbmVhcmJ5X2FpcnBvcnRzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3RpbWVBcnJheTogVmFsdWVEaXNwbGF5W107XHJcbiAgcHJpdmF0ZSBfc29ydEFycmF5OiBTb3J0VHlwZUV1cm9zdGFyW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnUHJpY2UnLFxyXG4gICAgICBtZXRob2Q6IFNvcnRNZXRob2Quc29ydEJ5UHJpY2UsXHJcbiAgICAgIGljb246ICdpY28tZG9sbGFyJyxcclxuICAgICAgZGlyOiB0cnVlLFxyXG4gICAgICBjb2RlOiBTb3J0VHlwZXNFdXJvc3Rhci5DaGVhcGVzdEZpcnN0XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ1RpbWUnLFxyXG4gICAgICBtZXRob2Q6IFNvcnRNZXRob2Quc29ydEJ5RGF0ZSxcclxuICAgICAgaWNvbjogJ2ljby1jYWxlbmRhcicsXHJcbiAgICAgIGRpcjogdHJ1ZSxcclxuICAgICAgY29kZTogU29ydFR5cGVzRXVyb3N0YXIuRWFybGllc3RGaXJzdFxyXG4gICAgfVxyXG4gIF07XHJcblxyXG4gIHByaXZhdGUgX2ZhcmVUeXBlQXJyYXk6IFZhbHVlRGlzcGxheVtdID0gW1xyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuRmxleGlibGUsIGRpc3BsYXk6ICdGbGV4aWJsZScgfSxcclxuICAgIHsgdmFsdWU6IEZhcmVUeXBlLkxlaXN1cmUsIGRpc3BsYXk6ICdMZWlzdXJlJyB9LFxyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuTG93ZXN0LCBkaXNwbGF5OiAnTG93ZXN0JyB9LFxyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuTmVnb3RpYXRlZCwgZGlzcGxheTogJ05lZ290aWF0ZWQnIH0sXHJcbiAgICB7IHZhbHVlOiBGYXJlVHlwZS5Ob25OZWdvdGlhdGVkLCBkaXNwbGF5OiAnTm9uLU5lZ290aWF0ZWQnIH0sXHJcbiAgICB7IHZhbHVlOiBGYXJlVHlwZS5SZXF1ZXN0RmFyZVJ1bGVzLCBkaXNwbGF5OiAnUmVxdWVzdCBGYXJlIFJ1bGVzJyB9LFxyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuU2VsZWN0QW5kUHJvLCBkaXNwbGF5OiAnU2VsZWN0ICYgUHJvJyB9XHJcbiAgXTtcclxuXHJcbiAgcHVibGljIG1pbmltdW1PdXRCb3VuZERhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtaW5pbXVtSW5Cb3VuZERhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBzZWFyY2hUeXBlczogVmFsdWVEaXNwbGF5W10gPSBbXHJcbiAgICB7dmFsdWU6IEV1cm9zdGFyU2VhcmNoVHlwZS5yZXR1cm4sIGRpc3BsYXk6ICdSZXR1cm4nfSxcclxuICAgIHt2YWx1ZTogRXVyb3N0YXJTZWFyY2hUeXBlLm9uZVdheSwgZGlzcGxheTogJ09uZS13YXknfSxcclxuICBdXHJcblxyXG4gIHByaXZhdGUgX291dERhdGU6IE5nYkRhdGVTdHJ1Y3Q7XHJcbiAgcHJpdmF0ZSBfb3V0VGltZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2luRGF0ZTogTmdiRGF0ZVN0cnVjdDtcclxuICBwcml2YXRlIF9pblRpbWU6IHN0cmluZztcclxuICBwcml2YXRlIF9kZXN0aW5hdGlvbkFpcnBvcnQ6IGFueTtcclxuICBwcml2YXRlIF9vcmlnaW5BaXJwb3J0OiBhbnk7XHJcbiAgcHJpdmF0ZSBfcGFzc2VuZ2VyczogYW55O1xyXG4gIHByaXZhdGUgZ3JvdXBlZE9iamVjdDogRmxpZ2h0SXRpbmVyYXJ5V2l0aFNlbGVjdGVkW107XHJcbiAgcHJvdGVjdGVkIGZsaWdodHNUb0dyb3VwOiB7IFtrZXk6IG51bWJlcl06IG51bWJlcltdIH0gPSB7fTtcclxuICBwcm90ZWN0ZWQgcmVzdWx0UXVlcnk6IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzO1xyXG4gIHByb3RlY3RlZCBncm91cGVkOiBHcm91cGVkRmxpZ2h0cyA9IG51bGw7XHJcbiAgdHJhdmVsbGVyczogVHJhdmVsbGVyW10gPSBudWxsO1xyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG4gIHNlbGVjdGVkR3JvdXBGbGlnaHQ6IEZsaWdodEl0aW5lcmFyeVdpdGhTZWxlY3RlZDtcclxuICBwcml2YXRlIF9kaXNwbGF5QWRkSG90ZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGdldCBkaXNwbGF5QWRkSG90ZWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheUFkZEhvdGVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBkaXNwbGF5QWRkSG90ZWwobmV3VmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNwbGF5QWRkSG90ZWwgPSBuZXdWYWw7XHJcbiAgfVxyXG4gIHNlbGVjdGVkR3JvdXBFdXJvc3RhcjogRXVyb3N0YXJJdGVtO1xyXG4gIHNlbGVjdGVkRXVyb3N0YXJGYXJlOiBFdXJvc3RhckZhcmU7XHJcblxyXG4gIHB1YmxpYyBnZXQgdGltZUFycmF5KCkge1xyXG4gICAgdGhpcy5fdGltZUFycmF5ID1cclxuICAgICAgdGhpcy5fdGltZUFycmF5IHx8XHJcbiAgICAgIEFycmF5KDk2KVxyXG4gICAgICAgIC5maWxsKDApXHJcbiAgICAgICAgLm1hcCgoXywgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmFsdWU6XHJcbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihpbmRleCAvIDQpXHJcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDIsICcwJykgK1xyXG4gICAgICAgICAgICAgICc6JyArXHJcbiAgICAgICAgICAgICAgKChpbmRleCAlIDQpICogMTUpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcclxuICAgICAgICAgICAgZGlzcGxheTpcclxuICAgICAgICAgICAgICBNYXRoLmZsb29yKGluZGV4IC8gNClcclxuICAgICAgICAgICAgICAgIC50b1N0cmluZygpXHJcbiAgICAgICAgICAgICAgICAucGFkU3RhcnQoMiwgJzAnKSArXHJcbiAgICAgICAgICAgICAgJzonICtcclxuICAgICAgICAgICAgICAoKGluZGV4ICUgNCkgKiAxNSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuX3RpbWVBcnJheTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgcHJlZmVycmVkQ2FycmllcnMoKTogT0JUQWlybGluZXNEZXRhaWxzW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgcHJlZmVycmVkQ2FycmllcnModmFsdWU6IE9CVEFpcmxpbmVzRGV0YWlsc1tdKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnMgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3IxKCk6IE9CVEFpcmxpbmVzRGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzWzBdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBvcGVyYXRvcjEodmFsdWU6IE9CVEFpcmxpbmVzRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzWzBdID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3IyKCk6IE9CVEFpcmxpbmVzRGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzWzFdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBvcGVyYXRvcjIodmFsdWU6IE9CVEFpcmxpbmVzRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzWzFdID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3IzKCk6IE9CVEFpcmxpbmVzRGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzWzJdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBvcGVyYXRvcjModmFsdWU6IE9CVEFpcmxpbmVzRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzWzJdID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3I0KCk6IE9CVEFpcmxpbmVzRGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzWzNdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBvcGVyYXRvcjQodmFsdWU6IE9CVEFpcmxpbmVzRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzWzNdID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9taW5EYXRlOiBOZ2JEYXRlU3RydWN0O1xyXG4gIHB1YmxpYyBnZXQgbWluRGF0ZSgpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLl9taW5EYXRlIHx8IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShtb21lbnQoKSk7XHJcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYWR1bHRzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFkdWx0cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgYWR1bHRzKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5hZHVsdHMgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNoaWxkcmVuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjaGlsZHJlbih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRlcGFydExvY2F0aW9uKCk6IHN0cmluZyB8IE9CVEFpcnBvcnREZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuZGVwYXJ0TG9jYXRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRlcGFydExvY2F0aW9uKHZhbHVlOiBzdHJpbmcgfCBPQlRBaXJwb3J0RGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmRlcGFydExvY2F0aW9uID0gdmFsdWU7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLl9vcmlnaW5BaXJwb3J0ID0gJyc7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLmdhdGV3YXkpIHtcclxuICAgICAgdGhpcy5fb3JpZ2luQWlycG9ydCA9IHZhbHVlLmdhdGV3YXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9vcmlnaW5BaXJwb3J0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgcXVlcnlPcmlnaW5BaXBvcnQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5BaXJwb3J0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBxdWVyeURlc3RpbmF0aW9uQWlwb3J0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkZXBhcnREYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX291dERhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRlcGFydERhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX291dERhdGUgPSB2YWx1ZTtcclxuICAgIHRoaXMub3V0Qm91bmREYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KFxyXG4gICAgICB0aGlzLl9vdXREYXRlLFxyXG4gICAgICB0aGlzLl9vdXRUaW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkZXBhcnRUaW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0VGltZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZGVwYXJ0VGltZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9vdXRUaW1lID0gdmFsdWU7XHJcbiAgICB0aGlzLm91dEJvdW5kRGF0ZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgdGhpcy5fb3V0RGF0ZSxcclxuICAgICAgdGhpcy5fb3V0VGltZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgb3V0Qm91bmREYXRlKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5vdXRCb3VuZERhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG91dEJvdW5kRGF0ZSh2YWx1ZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgdmFsdWUgPSBtb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZSA9IHZhbHVlLmlzVmFsaWQoKSA/IHZhbHVlIDogbnVsbDtcclxuICAgIHRoaXMubWluaW11bUluQm91bmREYXRlID0ge1xyXG4gICAgICB5ZWFyOiB2YWx1ZS55ZWFyKCksXHJcbiAgICAgIG1vbnRoOiB2YWx1ZS5tb250aCgpICsgMSxcclxuICAgICAgZGF5OiB2YWx1ZS5kYXRlKClcclxuICAgIH07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlICYmXHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5pbmJvdW5kRGF0ZSAmJlxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlLmlzQWZ0ZXIodGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaW5ib3VuZERhdGUgPSBtb21lbnQodGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZSkuYWRkKDEsICdkYXknKTtcclxuICAgIH1cclxuICAgIHRoaXMuX291dERhdGUgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUodmFsdWUpO1xyXG4gICAgdGhpcy5fb3V0VGltZSA9IHRoaXMuaGVscGVycy5mb3JtYXRUaW1lQ29sb24odmFsdWUpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCByZXR1cm5EYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luRGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgcmV0dXJuRGF0ZSh2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5faW5EYXRlID0gdmFsdWU7XHJcbiAgICB0aGlzLmluYm91bmREYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHRoaXMuX2luRGF0ZSwgdGhpcy5faW5UaW1lKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYXJyaXZlVGltZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luVGltZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgYXJyaXZlVGltZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9pblRpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuaW5ib3VuZERhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodGhpcy5faW5EYXRlLCB0aGlzLl9pblRpbWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpbmJvdW5kRGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuaW5ib3VuZERhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGluYm91bmREYXRlKHZhbHVlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICB2YWx1ZSA9IG1vbWVudCh2YWx1ZSk7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaW5ib3VuZERhdGUgPSB2YWx1ZS5pc1ZhbGlkKCkgPyB2YWx1ZSA6IG51bGw7XHJcbiAgICB0aGlzLl9pbkRhdGUgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUodmFsdWUpO1xyXG4gICAgdGhpcy5faW5UaW1lID0gdGhpcy5oZWxwZXJzLmZvcm1hdFRpbWVDb2xvbih2YWx1ZSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFycml2ZUxvY2F0aW9uKCk6IHN0cmluZyB8IE9CVEFpcnBvcnREZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuYXJyaXZlTG9jYXRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGFycml2ZUxvY2F0aW9uKHZhbHVlOiBzdHJpbmcgfCBPQlRBaXJwb3J0RGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmFycml2ZUxvY2F0aW9uID0gdmFsdWU7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbkFpcnBvcnQgPSAnJztcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUuZ2F0ZXdheSkge1xyXG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbkFpcnBvcnQgPSB2YWx1ZS5nYXRld2F5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBjYWJpbkNsYXNzKCk6IEZsaWdodENhYmluQ2xhc3MgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2FiaW5DbGFzcztcclxuICB9XHJcblxyXG4gIHNldCBjYWJpbkNsYXNzKHZhbHVlOiBGbGlnaHRDYWJpbkNsYXNzIHwgbnVsbCkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNhYmluQ2xhc3MgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCByZXR1cm5DYWJpbkNsYXNzKCk6IEZsaWdodENhYmluQ2xhc3MgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucmV0dXJuQ2FiaW5DbGFzcztcclxuICB9XHJcblxyXG4gIHNldCByZXR1cm5DYWJpbkNsYXNzKHZhbHVlOiBGbGlnaHRDYWJpbkNsYXNzIHwgbnVsbCkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnJldHVybkNhYmluQ2xhc3MgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaG9zZW5TZWFyY2hUeXBlKCk6IEV1cm9zdGFyU2VhcmNoVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNob3NlblNlYXJjaFR5cGU7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hvc2VuU2VhcmNoVHlwZSh0eXBlOiBFdXJvc3RhclNlYXJjaFR5cGUpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hUeXBlID0gdHlwZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1JldHVybigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hvc2VuU2VhcmNoVHlwZSA9PT0gRXVyb3N0YXJTZWFyY2hUeXBlLnJldHVybjtcclxuICB9XHJcblxyXG4gIGdldCBvdXRUaW1lQ3JpdGVyaWEoKTogVGltZVdpbmRvdyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm91dFRpbWVDcml0ZXJpYTtcclxuICB9XHJcblxyXG4gIHNldCBvdXRUaW1lQ3JpdGVyaWEodmFsdWU6IFRpbWVXaW5kb3cpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vdXRUaW1lQ3JpdGVyaWEgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBpblRpbWVDcml0ZXJpYSgpOiBUaW1lV2luZG93IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuaW5UaW1lQ3JpdGVyaWE7XHJcbiAgfVxyXG5cclxuICBzZXQgaW5UaW1lQ3JpdGVyaWEodmFsdWU6IFRpbWVXaW5kb3cpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5pblRpbWVDcml0ZXJpYSA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuICBnZXQgbWF4Q29ubmVjdGlvbnMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubWF4Q29ubmVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBzZXQgbWF4Q29ubmVjdGlvbnModmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm1heENvbm5lY3Rpb25zID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9tdWx0aURlc3RpbmF0aW9uOiBEZXN0aW5hdGlvbkVudHJ5W10gPSBbXTtcclxuICBnZXQgbXVsdGlEZXN0aW5hdGlvbigpOiBJTXVsdGlEZXN0aW5hdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubXVsdGlEZXN0aW5hdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBtdWx0aURlc3RpbmF0aW9uKHZhbHVlQXJyYXk6IElNdWx0aURlc3RpbmF0aW9uW10pIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5tdWx0aURlc3RpbmF0aW9uID0gdmFsdWVBcnJheTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHNldE11bHRpRGVzdGluYXRpb25RdWVyeShtdWx0aURlc3RpbmF0aW9uOiBJTXVsdGlEZXN0aW5hdGlvbltdKSB7XHJcbiAgICBjb25zdCBuZXdNdWx0aURlc3RpbmF0aW9uID0gdGhpcy5oZWxwZXJzLmNsb25lKG11bHRpRGVzdGluYXRpb24pO1xyXG4gICAgcmV0dXJuIG5ld011bHRpRGVzdGluYXRpb24ucmVkdWNlKFxyXG4gICAgICAoZGVzdGluYXRpb25BcnJheTogRGVzdGluYXRpb25FbnRyeVtdLCBpdGVtOiBJTXVsdGlEZXN0aW5hdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uT2JqZWN0ID0ge30gYXMgRGVzdGluYXRpb25FbnRyeTtcclxuICAgICAgICBkZXN0aW5hdGlvbk9iamVjdC5vcmlnID0gaXRlbS5vcmlnLmdhdGV3YXk7XHJcbiAgICAgICAgZGVzdGluYXRpb25PYmplY3QuZGVzdCA9IGl0ZW0uZGVzdC5nYXRld2F5O1xyXG4gICAgICAgIGRlc3RpbmF0aW9uT2JqZWN0LmRhdGUgPSB0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZShpdGVtLmRhdGUpO1xyXG4gICAgICAgIGRlc3RpbmF0aW9uQXJyYXkucHVzaChkZXN0aW5hdGlvbk9iamVjdCk7XHJcbiAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uQXJyYXk7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtdIGFzIERlc3RpbmF0aW9uRW50cnlbXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIGdldCBvbmx5XHJcbiAgZ2V0IHNvcnREcm9wZG93blZhbHVlcygpOiBTb3J0VHlwZUV1cm9zdGFyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvcnRBcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBmYXJlVHlwZXNWYWx1ZXMoKTogVmFsdWVEaXNwbGF5W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZhcmVUeXBlQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmFyZVR5cGUoKTogRmFyZVR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5mYXJlVHlwZTtcclxuICB9XHJcblxyXG4gIHNldCBmYXJlVHlwZSh2YWx1ZTogRmFyZVR5cGUpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5mYXJlVHlwZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5lZ290aWF0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbmVnb3RpYXRlZDtcclxuICB9XHJcblxyXG4gIHNldCBuZWdvdGlhdGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9uZWdvdGlhdGVkID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5jbHVkZU5lYXJieUFpcnBvcnRzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5pbmNsdWRlTmVhcmJ5QWlycG9ydHM7XHJcbiAgfVxyXG5cclxuICBzZXQgaW5jbHVkZU5lYXJieUFpcnBvcnRzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaW5jbHVkZU5lYXJieUFpcnBvcnRzID0gdmFsdWU7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBldXJvc3RhckZldGNoZXI6IEJhc2VFdXJvc3RhclF1b3RlRmV0Y2hlcjxTRV9RPixcclxuICAgIHByaXZhdGUgaGVscGVyczogQmFzZUhlbHBlclJvdXRpbmVzLFxyXG4gICAgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRTZXJ2aWNlOiBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICAgIHN0b3JhZ2VTZXJ2aWNlOiBCYXNlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgc3RvcmFnZVNlcnZpY2UsXHJcblxyXG4gICAgICAocmVzdWx0czE6IEV1cm9zdGFyUXVvdGVSZXN1bHQpOiBFdXJvc3RhclF1b3RlUmVzdWx0QXJyYXkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzdWx0UXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucmVzdWx0UXVlcnkud2l0aEdyb3VwZWQ7XHJcbiAgICAgICAgaWYocmVzdWx0czEgJiYgdGhpcy5zZWFyY2hTZXJ2aWNlLmlzRmxpZ2h0c0dyb3VwZWQoKSl7XHJcbiAgICAgICAgICBjb25zdCByZXR1cm5kYXRhID0gKHJlc3VsdHMxLmpvdXJuZXlzIHx8IFtdKS5yZWR1Y2UoXHJcbiAgICAgICAgICAgIChhY2M6IEV1cm9zdGFyUmVzdWx0cywgcmVzdWx0OiBGbGlnaHRJdGluZXJhcnkpOiBFdXJvc3RhclJlc3VsdHMgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQub3V0Ym91bmRGbGlnaHRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXVyb1Jlc3VsdCA9IHRoaXMuZm9ybWF0RXVyb3N0YXJSZXN1bHRzKFxyXG4gICAgICAgICAgICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzLFxyXG4gICAgICAgICAgICAgICAgICByZXN1bHQudG90YWxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBldXJvUmVzdWx0LmNvMlBlclBhc3NlbmdlciA9IHJlc3VsdC5jbzJQZXJQYXNzZW5nZXI7XHJcbiAgICAgICAgICAgICAgICBldXJvUmVzdWx0LmNvMlBlckl0ZW0gPSByZXN1bHQuY28yUGVySXRlbTtcclxuICAgICAgICAgICAgICAgIGV1cm9SZXN1bHQuc291cmNlSWQgPSByZXN1bHQuc291cmNlSWQ7XHJcbiAgICAgICAgICAgICAgICBldXJvUmVzdWx0LnRvdGFsID0gcmVzdWx0LnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgZXVyb1Jlc3VsdC5kdXJhdGlvbiA9IHRoaXMubWluVG9Ib3VyKHJlc3VsdC5vdXRib3VuZFRvdGFsRHVyYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAhYWNjLm91dGJvdW5kLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgKGl0ZW06IEV1cm9zdGFySXRlbSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZGF0ZURlcGFydHVyZSA9PT0gZXVyb1Jlc3VsdC5kYXRlRGVwYXJ0dXJlXHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICBhY2Mub3V0Ym91bmQucHVzaChldXJvUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBldXJvUmVzdWx0ID0gdGhpcy5mb3JtYXRFdXJvc3RhclJlc3VsdHMoXHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0cyxcclxuICAgICAgICAgICAgICAgICAgcmVzdWx0LnRvdGFsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgZXVyb1Jlc3VsdC5jbzJQZXJQYXNzZW5nZXIgPSByZXN1bHQuY28yUGVyUGFzc2VuZ2VyO1xyXG4gICAgICAgICAgICAgICAgZXVyb1Jlc3VsdC5jbzJQZXJJdGVtID0gcmVzdWx0LmNvMlBlckl0ZW07XHJcbiAgICAgICAgICAgICAgICBldXJvUmVzdWx0LnNvdXJjZUlkID0gcmVzdWx0LnNvdXJjZUlkO1xyXG4gICAgICAgICAgICAgICAgZXVyb1Jlc3VsdC50b3RhbCA9IHJlc3VsdC50b3RhbDtcclxuICAgICAgICAgICAgICAgIGV1cm9SZXN1bHQuZHVyYXRpb24gPSB0aGlzLm1pblRvSG91cihyZXN1bHQuaW5ib3VuZFRvdGFsRHVyYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAhYWNjLmluYm91bmQuZmluZChcclxuICAgICAgICAgICAgICAgICAgICAoaXRlbTogRXVyb3N0YXJJdGVtKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5kYXRlRGVwYXJ0dXJlID09PSBldXJvUmVzdWx0LmRhdGVEZXBhcnR1cmVcclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgIGFjYy5pbmJvdW5kLnB1c2goZXVyb1Jlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sIHsgb3V0Ym91bmQ6IFtdLCBpbmJvdW5kOiBbXSB9IGFzIEV1cm9zdGFyUmVzdWx0cyk7XHJcbiAgICAgICAgICByZXR1cm4gW3JldHVybmRhdGFdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0czEgPyBbcmVzdWx0czFdIDogW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IEV1cm9zdGFyVGVtcFBhcmFtcztcclxuICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiBFdXJvc3RhclRlbXBQYXJhbXM7XHJcbiAgICB9ID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEV1cm9zdGFyRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB7fSBhcyBFdXJvc3RhclRlbXBQYXJhbXMsXHJcbiAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB7fSBhcyBFdXJvc3RhclRlbXBQYXJhbXNcclxuICAgICAgfTtcclxuICAgIC8vIGRhdGEudGVtcFBhcmFtcy5hZHVsdHMgPSAxO1xyXG4gICAgLy8gZGF0YS50ZW1wUGFyYW1zLmNhYmluQ2xhc3MgPSBbRmxpZ2h0Q2FiaW5DbGFzcy5FY29ub215XTtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoU2VydmljZS5tYWtlRXVyb3N0YXJRdWVyeShkYXRhLnRlbXBQYXJhbXMpO1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHF1ZXJ5KTtcclxuICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IGRhdGEub3JpZ2luYWxVc2VyU2VhcmNoO1xyXG4gICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkQWRkVHJhdmVsbGVyU3Vic2NyaXB0aW9uKCkpIHtcclxuICAgICAgc2VhcmNoU2VydmljZS50cmF2ZWxsZXJJbmZvcm1hdGlvbi5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgICAgICAgY29uc3Qgc3BsaXRUcmF2ZWxsZXJzID0gdGhpcy5oZWxwZXJzLnNlbGVjdGVkVHJhdmVsbGVycyhcclxuICAgICAgICAgICAgdHJhdmVsbGVycyxcclxuICAgICAgICAgICAgU2VydmljZVR5cGUuRXVyb3N0YXJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzID0gc3BsaXRUcmF2ZWxsZXJzLmFkdWx0cy5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPSBzcGxpdFRyYXZlbGxlcnMuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgICAgICAgLy8gdGhpcy50ZW1wUGFyYW1zLmluZmFudHMgPSBzcGxpdFRyYXZlbGxlcnMuaW5mYW50cy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJzKCk7XHJcbiAgICAgICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHVzZXJTZXJ2aWNlLmNoYW5nZVVzZXIuc3Vic2NyaWJlKCh1c2VyOiBGdWxsVXNlckRldGFpbHMpID0+IHtcclxuICAgICAgdGhpcy50aW1lQ3JpdGVyaWFPcHRpb25zLm5leHQoW1xyXG4gICAgICAgIFRpbWVXaW5kb3cuQW55dGltZSxcclxuICAgICAgICBUaW1lV2luZG93LkFycml2ZSxcclxuICAgICAgICBUaW1lV2luZG93LkRlcGFydFxyXG4gICAgICBdKTsgLy8gVE9ETyB1cGRhdGUgd2l0aCBhbnkgVUZzXHJcbiAgICAgIHRoaXMudXBkYXRlQXZhbGlhYmxlQ2xhc3NlcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJzKCk7XHJcbiAgICBjb25zdCByZXN1bHRzOiBFdXJvc3RhclNlc3Npb25UeXBlID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIHRoaXMucmVzdWx0c1Nlc3Npb25OYW1lXHJcbiAgICApIHx8IHtcclxuICAgICAgcmVzdWx0czogW10sXHJcbiAgICAgIGdyb3VwRGF0YToge30sXHJcbiAgICAgIGdyb3VwZWQ6IFtdLFxyXG4gICAgICBxdWVyeToge30gYXMgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXNcclxuICAgIH07XHJcbiAgICB0aGlzLmZ1bGxSZXN1bHRzID0gdGhpcy5oZWxwZXJzLmNsb25lKHJlc3VsdHMucmVzdWx0cyk7XHJcbiAgICB0aGlzLmZsaWdodHNUb0dyb3VwID0gcmVzdWx0cy5ncm91cERhdGEgfHwge307XHJcbiAgICB0aGlzLnJlc3VsdFF1ZXJ5ID0gcmVzdWx0cy5xdWVyeTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMucmVzdWx0cyB8fCAoW10gYXMgRXVyb3N0YXJRdW90ZVJlc3VsdEFycmF5KSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB0aGlzLm5lZ290aWF0ZWQgPVxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuZmFyZVR5cGUgPT09IEZhcmVUeXBlLk5lZ290aWF0ZWQgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG4gIGZvcm1hdEV1cm9zdGFyUmVzdWx0cyhcclxuICAgIHJlc3VsdHM6IEZsaWdodEpvdXJuZXlbXSxcclxuICAgIHRvdGFsOiBGbGlnaHRGYXJlVG90YWxcclxuICApOiBFdXJvc3Rhckl0ZW0ge1xyXG4gICAgY29uc3QgcmV0dXJuT2JqZWN0OiBFdXJvc3Rhckl0ZW0gPSB7XHJcbiAgICAgIGRhdGVBcnJpdmFsOiBudWxsLFxyXG4gICAgICBkYXRlRGVwYXJ0dXJlOiBudWxsLFxyXG4gICAgICBkdXJhdGlvbjogbnVsbCxcclxuICAgICAgdGltZUFycml2YWw6IG51bGwsXHJcbiAgICAgIHRpbWVEZXBhcnR1cmU6IG51bGwsXHJcbiAgICAgIGNvMlBlckl0ZW06IDAsXHJcbiAgICAgIGNvMlBlclBhc3NlbmdlcjogMCxcclxuICAgICAgc291cmNlSWQ6IG51bGwsXHJcbiAgICAgIHRvdGFsOiBudWxsLFxyXG4gICAgICB1aWQ6IG51bGwsXHJcblxyXG4gICAgICBidXNpbmVzc1ByZW1pZXJGYXJlOiB7XHJcbiAgICAgICAgY2xhc3M6IG51bGwsXHJcbiAgICAgICAgZmFyZTogbnVsbCxcclxuICAgICAgICBpc0Rpc2FibGVkOiB0cnVlLFxyXG4gICAgICAgIHByaWNlOiBOYU4sXHJcbiAgICAgICAgY3VycmVuY3k6ICdHQlAnXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YW5kYXJkRmFyZToge1xyXG4gICAgICAgIGNsYXNzOiBudWxsLFxyXG4gICAgICAgIGZhcmU6IG51bGwsXHJcbiAgICAgICAgaXNEaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgICBwcmljZTogTmFOLFxyXG4gICAgICAgIGN1cnJlbmN5OiAnR0JQJ1xyXG4gICAgICB9LFxyXG4gICAgICBzdGFuZGFyZFByZW1pZXJGYXJlOiB7XHJcbiAgICAgICAgY2xhc3M6IG51bGwsXHJcbiAgICAgICAgZmFyZTogbnVsbCxcclxuICAgICAgICBpc0Rpc2FibGVkOiB0cnVlLFxyXG4gICAgICAgIHByaWNlOiBOYU4sXHJcbiAgICAgICAgY3VycmVuY3k6ICdHQlAnXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAvLyByZXR1cm5PYmplY3QuZHVyYXRpb24gPSByZXN1bHRzLm91dGJvdW5kVG90YWxEdXJhdGlvbjtcclxuICAgIHJlc3VsdHMuZm9yRWFjaCgoZmxpZ2h0LCBpbmRleCkgPT4ge1xyXG4gICAgICByZXR1cm5PYmplY3QuZGF0ZUFycml2YWwgPSBmbGlnaHQuZGF0ZVRpbWVBcnJpdmluZztcclxuICAgICAgcmV0dXJuT2JqZWN0LmRhdGVEZXBhcnR1cmUgPSBmbGlnaHQuZGF0ZVRpbWVEZXBhcnRpbmc7XHJcbiAgICAgIHJldHVybk9iamVjdC5kdXJhdGlvbiA9IHRoaXMubWluVG9Ib3VyKGZsaWdodC50b3RhbER1cmF0aW9uKTtcclxuICAgICAgcmV0dXJuT2JqZWN0LnRpbWVBcnJpdmFsID0gbW9tZW50KGZsaWdodC5kYXRlVGltZUFycml2aW5nKS5mb3JtYXQoXHJcbiAgICAgICAgJ0hIOm1tJ1xyXG4gICAgICApO1xyXG4gICAgICByZXR1cm5PYmplY3QudGltZURlcGFydHVyZSA9IG1vbWVudChmbGlnaHQuZGF0ZVRpbWVEZXBhcnRpbmcpLmZvcm1hdChcclxuICAgICAgICAnSEg6bW0nXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybk9iamVjdC51aWQgPSBpbmRleDtcclxuICAgICAgc3dpdGNoIChmbGlnaHQuZmFyZUluZm8udGl0bGUpIHtcclxuICAgICAgICBjYXNlIEV1cm9zdGFyQ2xhc3NFbnVtLlNUQU5EQVJEOlxyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRGYXJlLmZhcmUgPSBmbGlnaHQ7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRGYXJlLnByaWNlID0gdG90YWwucHJpY2U7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRGYXJlLmN1cnJlbmN5ID0gdG90YWwuY3VycmVuY3k7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRGYXJlLmNsYXNzID0gZmxpZ2h0LmNhYmluQ2xhc3M7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEV1cm9zdGFyQ2xhc3NFbnVtLlNUQU5EQVJEX1BSRU1JRVI6XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRQcmVtaWVyRmFyZS5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRQcmVtaWVyRmFyZS5mYXJlID0gZmxpZ2h0O1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkUHJlbWllckZhcmUucHJpY2UgPSB0b3RhbC5wcmljZTtcclxuICAgICAgICAgIHJldHVybk9iamVjdC5zdGFuZGFyZFByZW1pZXJGYXJlLmN1cnJlbmN5ID0gdG90YWwuY3VycmVuY3k7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRQcmVtaWVyRmFyZS5jbGFzcyA9IGZsaWdodC5jYWJpbkNsYXNzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBFdXJvc3RhckNsYXNzRW51bS5CVVNJTkVTU19QUkVNSUVSOlxyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LmJ1c2luZXNzUHJlbWllckZhcmUuaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LmJ1c2luZXNzUHJlbWllckZhcmUuZmFyZSA9IGZsaWdodDtcclxuICAgICAgICAgIHJldHVybk9iamVjdC5idXNpbmVzc1ByZW1pZXJGYXJlLnByaWNlID0gdG90YWwucHJpY2U7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3QuYnVzaW5lc3NQcmVtaWVyRmFyZS5jdXJyZW5jeSA9IHRvdGFsLmN1cnJlbmN5O1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LmJ1c2luZXNzUHJlbWllckZhcmUuY2xhc3MgPSBmbGlnaHQuY2FiaW5DbGFzcztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnbmV3IGNsYXNzIHRvIGJlIGltcGxlbWVudGVkOiAnLCBmbGlnaHQuZmFyZUluZm8udGl0bGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXR1cm5PYmplY3Q7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVzZXRRdWVyeShjaGVja0lzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXModGhpcy5zZWFyY2hTZXJ2aWNlLm1ha2VFdXJvc3RhclF1ZXJ5KCkpO1xyXG4gICAgaWYgKGNoZWNrSXNWYWxpZCkge1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRQYXJhbXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB0aGlzLnJlc2V0UXVlcnkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzVmFsaWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZG9DaGVja3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB0aGlzLnRlbXBQYXJhbXMsXHJcbiAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaFxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XHJcbiAgICBpZiAoIXRoaXMuX29yaWdpbkFpcnBvcnQpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIGFkZCBpbiBhIGRlcGFydHV0cmUgbG9jYXRpb24nKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0KSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBhZGQgaW4gYSBhcnJpdmFsIGRlc3RpbmF0aW9uJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMudGVtcFBhcmFtcy5vdXRCb3VuZERhdGUuaXNBZnRlcihtb21lbnQoKSkpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnRGVwYXJ0dXJlIGRhdGUgY2FuIG5vdCBiZSBpbiB0aGUgcGFzdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fb3JpZ2luQWlycG9ydCAmJlxyXG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbkFpcnBvcnQgJiZcclxuICAgICAgdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0ID09PSB0aGlzLl9vcmlnaW5BaXJwb3J0XHJcbiAgICApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAnT3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBzdGF0aW9uIGNhbm5vdCBiZSB0aGUgc2FtZSdcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzUmV0dXJuKSB7XHJcbiAgICAgIC8vIFRPRE8gY2hlY2sgdGhhdCByZXR1cm4gZGV0YWlscyBhcmUgc2V0XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlLmlzU2FtZU9yQWZ0ZXIoXHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMuaW5UaW1lQ3JpdGVyaWFcclxuICAgICAgICApXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgICAnUmV0dXJuIGRhdGUgbXVzdCBiZSBhZnRlciB0aGUgZGVwYXJ0dXJlIGRhdGUnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5pc1ZhbGlkLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID09PSAwKTtcclxuICAgIHRoaXMubWVzc2FnZXMubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgfVxyXG5cclxuICBzdGFydFNlYXJjaCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFtdKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IE9iamVjdC5mcmVlemUoeyAuLi50aGlzLnRlbXBQYXJhbXMgfSk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgICAgRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGVtcFBhcmFtczogdGhpcy50ZW1wUGFyYW1zLFxyXG4gICAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0U2VhcmNoKFxyXG4gICAgICAgIHRoaXMuZXVyb3N0YXJGZXRjaGVyLmZldGNoTGlzdCh0aGlzLmdldFNlYXJjaFF1ZXJ5KCkpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydFJlY2VudFNlYXJjaChyZWNlbnRTZWFyY2g6IFJlY2VudFNlYXJjaCk6IHZvaWQgeyB9XHJcblxyXG4gIHByaXZhdGUgbWFrZURlcGFydHVyZVRpbWVXaW5kb3coXHJcbiAgICBkYXRlVGltZTogbW9tZW50Lk1vbWVudCxcclxuICAgIHdpbmRvdzogVGltZVdpbmRvd1xyXG4gICk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gd2luZG93ID09PSBUaW1lV2luZG93LkRlcGFydFxyXG4gICAgICA/IHRoaXMuaGVscGVycy5tYWtlVGltZVdpbmRvdyhkYXRlVGltZSwgLTIsIDIpXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFrZUFycml2YWxUaW1lV2luZG93KFxyXG4gICAgZGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQsXHJcbiAgICB3aW5kb3c6IFRpbWVXaW5kb3dcclxuICApOiBzdHJpbmcge1xyXG4gICAgaWYgKHdpbmRvdyAhPT0gVGltZVdpbmRvdy5BcnJpdmUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5tYWtlVGltZVdpbmRvdyhkYXRlVGltZSwgLTIsIDIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VhcmNoUXVlcnkoKTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMge1xyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5yZW1vdmVOdWxsczxTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcz4oXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAge30sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3JpZ2luQWlycG9ydDogdGhpcy5fb3JpZ2luQWlycG9ydCxcclxuICAgICAgICAgIGRlc3RpbmF0aW9uQWlycG9ydDogdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0LFxyXG4gICAgICAgICAgb3V0Ym91bmREYXRlOiB0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZShcclxuICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZVxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIG91dGJvdW5kRGVwYXJ0dXJlVGltZVdpbmRvdzogdGhpcy5tYWtlRGVwYXJ0dXJlVGltZVdpbmRvdyhcclxuICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZSxcclxuICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm91dFRpbWVDcml0ZXJpYVxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIG91dGJvdW5kQXJyaXZhbFRpbWVXaW5kb3c6IHRoaXMubWFrZUFycml2YWxUaW1lV2luZG93KFxyXG4gICAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlLFxyXG4gICAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMub3V0VGltZUNyaXRlcmlhXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwYXNzZW5nZXJzOiB0aGlzLl9wYXNzZW5nZXJzLFxyXG4gICAgICAgICAgcmV0dXJuVHJpcDogdGhpcy5pc1JldHVybixcclxuICAgICAgICAgIG91dGJvdW5kQ2FiaW5DbGFzczogdGhpcy50ZW1wUGFyYW1zLmNhYmluQ2xhc3NcclxuICAgICAgICAgICAgPyBbdGhpcy50ZW1wUGFyYW1zLmNhYmluQ2xhc3NdXHJcbiAgICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICAgIHJlcXVpcmVGcmVlQmFnOiBudWxsLFxyXG4gICAgICAgICAgbWF4Q29ubmVjdGlvbnM6IHRoaXMudGVtcFBhcmFtcy5tYXhDb25uZWN0aW9ucyxcclxuICAgICAgICAgIGluY2x1ZGVOZWFyYnlBaXJwb3J0czogdGhpcy50ZW1wUGFyYW1zLmluY2x1ZGVOZWFyYnlBaXJwb3J0cyxcclxuICAgICAgICAgIHByZWZlcnJlZENhcnJpZXJzOiB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnMubWFwKFxyXG4gICAgICAgICAgICAoY2FycmllcjogT0JUQWlybGluZXNEZXRhaWxzKSA9PlxyXG4gICAgICAgICAgICAgIGNhcnJpZXI/LmNvZGUgPyBjYXJyaWVyLmNvZGUgOiBudWxsXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgZmFyZVR5cGU6IHRoaXMudGVtcFBhcmFtcy5mYXJlVHlwZSxcclxuICAgICAgICAgIHdpdGhHcm91cGVkOiBudWxsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0aGlzLmlzUmV0dXJuXHJcbiAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgcmV0dXJuRGF0ZTogdGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGUoXHJcbiAgICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHJldHVybkRlcGFydHVyZVRpbWVXaW5kb3c6IHRoaXMubWFrZURlcGFydHVyZVRpbWVXaW5kb3coXHJcbiAgICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlLFxyXG4gICAgICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5pblRpbWVDcml0ZXJpYVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICByZXR1cm5BcnJpdmFsVGltZVdpbmRvdzogdGhpcy5tYWtlQXJyaXZhbFRpbWVXaW5kb3coXHJcbiAgICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlLFxyXG4gICAgICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5pblRpbWVDcml0ZXJpYVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICByZXR1cm5DYWJpbkNsYXNzOiB0aGlzLnRlbXBQYXJhbXMucmV0dXJuQ2FiaW5DbGFzc1xyXG4gICAgICAgICAgICAgID8gW3RoaXMudGVtcFBhcmFtcy5yZXR1cm5DYWJpbkNsYXNzXVxyXG4gICAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgOiB7fVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUcmF2ZWxsZXJzKCkge1xyXG4gICAgY29uc3QgdHJhdmVsbGVyczogRmxpZ2h0UGFzc2VuZ2VyT2JqZWN0W10gPSBbXTtcclxuICAgIGZvciAobGV0IGxvb3AgPSAwOyBsb29wIDwgdGhpcy50ZW1wUGFyYW1zLmFkdWx0czsgbG9vcCArPSAxKSB7XHJcbiAgICAgIHRyYXZlbGxlcnMucHVzaCh7IHR5cGU6IEZsaWdodFBhc3NlbmdlclR5cGUuQWR1bHQgfSk7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBsb29wID0gMDsgbG9vcCA8IHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbjsgbG9vcCArPSAxKSB7XHJcbiAgICAgIHRyYXZlbGxlcnMucHVzaCh7IHR5cGU6IEZsaWdodFBhc3NlbmdlclR5cGUuQ2hpbGQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcGFzc2VuZ2VycyA9IHRyYXZlbGxlcnM7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUF2YWxpYWJsZUNsYXNzZXMoKSB7XHJcbiAgICB0aGlzLmF2YWxpYWJsZUNsYXNzZXMubmV4dChbXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnQW55JyxcclxuICAgICAgICB0eXBlOiBFdXJvc3RhckNsYXNzRW51bS5BTllcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdTdGFuZGFyZCAoc2VtaSBmbGV4aWJsZSknLFxyXG4gICAgICAgIHR5cGU6IEV1cm9zdGFyQ2xhc3NFbnVtLlNUQU5EQVJEXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnU3RhbmRhcmQgcHJlbWllciAoc2VtaSBmbGV4aWJsZSknLFxyXG4gICAgICAgIHR5cGU6IEV1cm9zdGFyQ2xhc3NFbnVtLlNUQU5EQVJEX1BSRU1JRVJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdCdXNpbmVzcyBwcmVtaWVyIChmdWxseSBmbGV4aWJsZSknLFxyXG4gICAgICAgIHR5cGU6IEV1cm9zdGFyQ2xhc3NFbnVtLkJVU0lORVNTX1BSRU1JRVJcclxuICAgICAgfVxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBzb3J0IHRoZSBmbGlnaHQgcmVzdWx0c1xyXG4gICAqIEB0b2RvIC0gRmlsbCBvdXQgUHJlZmVycmVkIGFuZCBDbzIgc29ydGluZyB3aGVuIHdlIGhhdmUgdGhhdCBkYXRhXHJcbiAgICovXHJcbiAgcHVibGljIHNvcnRSZXN1bHRzKFxyXG4gICAgc29ydE1ldGhvZFZhbHVlOiBTb3J0VHlwZXNFdXJvc3RhcixcclxuICAgIGdpdmVuUmVzdWx0cz86IEV1cm9zdGFyUmVzdWx0c1tdXHJcbiAgKTogdm9pZCB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IHRoaXMuaGVscGVycy5jbG9uZShcclxuICAgICAgZ2l2ZW5SZXN1bHRzXHJcbiAgICAgICAgPyBnaXZlblJlc3VsdHNcclxuICAgICAgICA6IDxFdXJvc3RhclJlc3VsdHNbXT4oPHVua25vd24+dGhpcy5mdWxsUmVzdWx0cylcclxuICAgICk7XHJcblxyXG4gICAgc3dpdGNoIChzb3J0TWV0aG9kVmFsdWUpIHtcclxuICAgICAgY2FzZSBTb3J0VHlwZXNFdXJvc3Rhci5DaGVhcGVzdEZpcnN0OlxyXG4gICAgICAgIHJlc3VsdHMgPSB0aGlzLnNvcnRCeVByaWNlKHJlc3VsdHMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNvcnRUeXBlc0V1cm9zdGFyLkVhcmxpZXN0Rmlyc3Q6XHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMuc29ydEJ5RGF0ZShyZXN1bHRzKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zb2xlLmVycm9yKGArKysgVW5rbm93biBzb3J0aW5nIG1ldGhvZDogJHtzb3J0TWV0aG9kVmFsdWV9ICsrK2ApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydCByZXN1bHRzIGJ5IGRlcGFydHVyZSB0aW1lXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0V1cm9zdGFyUmVzdWx0c1tdfSByZXN1bHRzXHJcbiAgICogQHJldHVybnNcclxuICAgKiBAbWVtYmVyb2YgRXVyb3N0YXJJbmZvXHJcbiAgICovXHJcbiAgc29ydEJ5RGF0ZShyZXN1bHRzOiBFdXJvc3RhclJlc3VsdHNbXSk6IEV1cm9zdGFyUmVzdWx0c1tdIHtcclxuICAgIGNvbnN0IGJ5RGF0ZSA9IChhOiBFdXJvc3Rhckl0ZW0sIGI6IEV1cm9zdGFySXRlbSkgPT4ge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIG1vbWVudChhLnRpbWVEZXBhcnR1cmUsICdISDptbScpLnVuaXgoKSAtXHJcbiAgICAgICAgbW9tZW50KGIudGltZURlcGFydHVyZSwgJ0hIOm1tJykudW5peCgpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHNvcnRlZFJlc3VsdHMgPSB7XHJcbiAgICAgIG91dGJvdW5kOiByZXN1bHRzWzBdLm91dGJvdW5kLnNvcnQoYnlEYXRlKSxcclxuICAgICAgaW5ib3VuZDogcmVzdWx0c1swXS5pbmJvdW5kLnNvcnQoYnlEYXRlKVxyXG4gICAgfTtcclxuICAgIHJldHVybiBbc29ydGVkUmVzdWx0c107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTb3J0IHJlc3VsdHMgYnkgcHJpY2VcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RXVyb3N0YXJSZXN1bHRzW119IHJlc3VsdHNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqIEBtZW1iZXJvZiBFdXJvc3RhckluZm9cclxuICAgKi9cclxuICBzb3J0QnlQcmljZShyZXN1bHRzOiBFdXJvc3RhclJlc3VsdHNbXSwgZGlyPzogYm9vbGVhbik6IEV1cm9zdGFyUmVzdWx0c1tdIHtcclxuICAgIGNvbnN0IGJ5UHJpY2UgPSAoYTogRXVyb3N0YXJJdGVtLCBiOiBFdXJvc3Rhckl0ZW0pID0+IHtcclxuICAgICAgY29uc3QgYVByaWNlID1cclxuICAgICAgICArYS5zdGFuZGFyZEZhcmUucHJpY2UgfHxcclxuICAgICAgICArYS5zdGFuZGFyZFByZW1pZXJGYXJlLnByaWNlIHx8XHJcbiAgICAgICAgK2EuYnVzaW5lc3NQcmVtaWVyRmFyZS5wcmljZTtcclxuICAgICAgY29uc3QgYlByaWNlID1cclxuICAgICAgICArYi5zdGFuZGFyZEZhcmUucHJpY2UgfHxcclxuICAgICAgICArYi5zdGFuZGFyZFByZW1pZXJGYXJlLnByaWNlIHx8XHJcbiAgICAgICAgK2IuYnVzaW5lc3NQcmVtaWVyRmFyZS5wcmljZTtcclxuICAgICAgaWYgKGRpcikge1xyXG4gICAgICAgIHJldHVybiBiUHJpY2UgLSBhUHJpY2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFQcmljZSAtIGJQcmljZTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc29ydGVkUmVzdWx0cyA9IHtcclxuICAgICAgb3V0Ym91bmQ6IHJlc3VsdHNbMF0ub3V0Ym91bmQuc29ydChieVByaWNlKSxcclxuICAgICAgaW5ib3VuZDogcmVzdWx0c1swXS5pbmJvdW5kLnNvcnQoYnlQcmljZSlcclxuICAgIH07XHJcbiAgICByZXR1cm4gW3NvcnRlZFJlc3VsdHNdO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRnJvbVByZXZpb3VzU2VhcmNoZXMoXHJcbiAgICBwcmV2aW91c0l0ZW1zOiBSZWNvcmQ8U2VydmljZVR5cGUsIEJhc2tldEl0ZW0+XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBmbGlnaHRJdGVtOiBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyA9XHJcbiAgICAgIHByZXZpb3VzSXRlbXNbU2VydmljZVR5cGUuRmxpZ2h0XT8uc2VhcmNoUXVlcnk7XHJcbiAgICBpZiAoZmxpZ2h0SXRlbSkge1xyXG4gICAgICAvLyBUT0RPIGZsaWdodHMgaGF2ZW4ndCBiZWVuIGRvbmUgeWV0LlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0VG90YWxCYWdnYWdlKHJlc3VsdDogRmxpZ2h0SXRpbmVyYXJ5KTogbnVtYmVyIHtcclxuICAgIGxldCB0b3RhbCA9IDA7XHJcblxyXG4gICAgY29uc3QgcGFyc2VkQWRkaXRpb25hbCA9IEpTT04ucGFyc2UocmVzdWx0LmFkZGl0aW9uYWwpO1xyXG4gICAgaWYgKHBhcnNlZEFkZGl0aW9uYWwgJiYgcGFyc2VkQWRkaXRpb25hbC5vdXRib3VuZEZsaWdodHMpIHtcclxuICAgICAgcGFyc2VkQWRkaXRpb25hbC5vdXRib3VuZEZsaWdodHMuZm9yRWFjaCgoZmxpZ2h0OiBhbnkpID0+IHtcclxuICAgICAgICBmbGlnaHQuYmFnZ2FnZS5mb3JFYWNoKChiYWc6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGJhZy5hbGxvd2FuY2UgJiYgYmFnLmFsbG93YW5jZSA+IHRvdGFsKSB7XHJcbiAgICAgICAgICAgIHRvdGFsID0gYmFnLmFsbG93YW5jZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHBhcnNlZEFkZGl0aW9uYWwgJiYgcGFyc2VkQWRkaXRpb25hbC5iYWdnYWdlQWxsb3dhbmNlKSB7XHJcbiAgICAgIHBhcnNlZEFkZGl0aW9uYWwuYmFnZ2FnZUFsbG93YW5jZS5mb3JFYWNoKChiYWdnYWdlQWxsb3c6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGJhZ2dhZ2VBbGxvdy5iYWdnYWdlLnF0eSAmJlxyXG4gICAgICAgICAgTnVtYmVyKGJhZ2dhZ2VBbGxvdy5iYWdnYWdlLnF0eSkgPiB0b3RhbFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdG90YWwgPSBOdW1iZXIoYmFnZ2FnZUFsbG93LmJhZ2dhZ2UucXR5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0b3RhbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiAtIGdpdmUgdGhlIGNvcnJlY3QgZm9ybWF0IGZvciB0cmFuc2ZlcmluZyBtaW51ZXRlcyBvbiB0aGUgc2xpZGVyc1xyXG4gICAqIEBwYXJhbSBtaW4gLSB0aGUgbWluIGluIDEwMHRoJ3MgdG8gdHJhbnNmb3JtIG9udG8gNjB0aCdzXHJcbiAgICovXHJcbiAgdHJhbnNmb3JtTWluKG1pbjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBudW0gPSAoTnVtYmVyKG1pbikgKiA2MCkgLyAxMDA7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnKysrIE51bSBDb3B5OiAnLCBfLmNsb25lKG51bSksICcgKysrJyk7XHJcbiAgICBpZiAobnVtICUgMSA8IDAuNSkge1xyXG4gICAgICBudW0gPSBNYXRoLmZsb29yKG51bSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBudW0gPSBNYXRoLmNlaWwobnVtKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVtLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICB9XHJcblxyXG4gIGZpbHRlckJ5RHVyYXRpb24oXHJcbiAgICBtaW5EdXJhdGlvbjogbnVtYmVyLFxyXG4gICAgbWF4RHVyYXRpb246IG51bWJlcixcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdLFxyXG4gICAgaXNSZXR1cm4gPSBmYWxzZVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgIGxldCBkdXIgPSAwO1xyXG4gICAgICBpZiAoIWlzUmV0dXJuKSB7XHJcbiAgICAgICAgcmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5mb3JFYWNoKChvdXQ6IEZsaWdodEpvdXJuZXkpID0+IHtcclxuICAgICAgICAgIGR1ciArPSBvdXQudG90YWxEdXJhdGlvbjtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlc3VsdC5pbmJvdW5kRmxpZ2h0cz8ubGVuZ3RoICYmIGlzUmV0dXJuKSB7XHJcbiAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzLmZvckVhY2goKGluYjogRmxpZ2h0Sm91cm5leSkgPT4ge1xyXG4gICAgICAgICAgZHVyICs9IGluYi50b3RhbER1cmF0aW9uO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZHVyID49IG1pbkR1cmF0aW9uICYmIGR1ciA8PSBtYXhEdXJhdGlvbjtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnlEZXBhcnR1cmVUaW1lKFxyXG4gICAgbWluRGVwOiBudW1iZXIsXHJcbiAgICBtYXhEZXA6IG51bWJlcixcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgY29uc3QgZGVwYXJ0dXJlVGltZSA9IE51bWJlcihcclxuICAgICAgICBtb21lbnQocmVzdWx0Lm91dGJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZykuZm9ybWF0KCdISG1tJylcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgbmV3TnVtU3RyaW5nMSA9IE51bWJlcihcclxuICAgICAgICBNYXRoLmZsb29yKE51bWJlcihtaW5EZXAgLyAxMDApKS50b1N0cmluZygpICtcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybU1pbihNYXRoLmNlaWwoTnVtYmVyKG1pbkRlcCAlIDEwMCkpKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBuZXdOdW1TdHJpbmcyID0gTnVtYmVyKFxyXG4gICAgICAgIE1hdGguZmxvb3IoTnVtYmVyKG1heERlcCAvIDEwMCkpLnRvU3RyaW5nKCkgK1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtTWluKE1hdGguY2VpbChOdW1iZXIobWF4RGVwICUgMTAwKSkpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm4gZGVwYXJ0dXJlVGltZSA+PSBuZXdOdW1TdHJpbmcxICYmIGRlcGFydHVyZVRpbWUgPD0gbmV3TnVtU3RyaW5nMjtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnlSZXR1cm5EZXBhcnR1cmVUaW1lKFxyXG4gICAgbWluRGVwOiBudW1iZXIsXHJcbiAgICBtYXhEZXA6IG51bWJlcixcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgaWYgKCFtaW5EZXAgJiYgIW1heERlcCkge1xyXG4gICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdOdW1TdHJpbmcxID0gTnVtYmVyKFxyXG4gICAgICBNYXRoLmZsb29yKE51bWJlcihtaW5EZXAgLyAxMDApKS50b1N0cmluZygpICtcclxuICAgICAgdGhpcy50cmFuc2Zvcm1NaW4oTWF0aC5jZWlsKE51bWJlcihtaW5EZXAgJSAxMDApKSlcclxuICAgICk7XHJcbiAgICBjb25zdCBuZXdOdW1TdHJpbmcyID0gTnVtYmVyKFxyXG4gICAgICBNYXRoLmZsb29yKE51bWJlcihtYXhEZXAgLyAxMDApKS50b1N0cmluZygpICtcclxuICAgICAgdGhpcy50cmFuc2Zvcm1NaW4oTWF0aC5jZWlsKE51bWJlcihtYXhEZXAgJSAxMDApKSlcclxuICAgICk7XHJcblxyXG4gICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKCFyZXN1bHQuaW5ib3VuZEZsaWdodHMgfHwgIXJlc3VsdC5pbmJvdW5kRmxpZ2h0c1swXSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkZXBhcnR1cmVUaW1lID0gTnVtYmVyKFxyXG4gICAgICAgIG1vbWVudChyZXN1bHQuaW5ib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBkZXBhcnR1cmVUaW1lID49IG5ld051bVN0cmluZzEgJiYgZGVwYXJ0dXJlVGltZSA8PSBuZXdOdW1TdHJpbmcyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeVJldHVybkFycml2YWxUaW1lKFxyXG4gICAgbWluQXJyOiBudW1iZXIsXHJcbiAgICBtYXhBcnI6IG51bWJlcixcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgaWYgKCFtaW5BcnIgJiYgIW1heEFycikge1xyXG4gICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdOdW1TdHJpbmcxID0gTnVtYmVyKFxyXG4gICAgICBNYXRoLmZsb29yKE51bWJlcihtaW5BcnIgLyAxMDApKS50b1N0cmluZygpICtcclxuICAgICAgdGhpcy50cmFuc2Zvcm1NaW4oTWF0aC5jZWlsKE51bWJlcihtaW5BcnIgJSAxMDApKSlcclxuICAgICk7XHJcbiAgICBjb25zdCBuZXdOdW1TdHJpbmcyID0gTnVtYmVyKFxyXG4gICAgICBNYXRoLmZsb29yKE51bWJlcihtYXhBcnIgLyAxMDApKS50b1N0cmluZygpICtcclxuICAgICAgdGhpcy50cmFuc2Zvcm1NaW4oTWF0aC5jZWlsKE51bWJlcihtYXhBcnIgJSAxMDApKSlcclxuICAgICk7XHJcblxyXG4gICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKCFyZXN1bHQuaW5ib3VuZEZsaWdodHMgfHwgIXJlc3VsdC5pbmJvdW5kRmxpZ2h0c1swXSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBhcnJpdmFsVGltZSA9IE51bWJlcihcclxuICAgICAgICBtb21lbnQoXHJcbiAgICAgICAgICByZXN1bHQuaW5ib3VuZEZsaWdodHNbcmVzdWx0LmluYm91bmRGbGlnaHRzLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgIC5kYXRlVGltZUFycml2aW5nXHJcbiAgICAgICAgKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCByZXRWYWwgPVxyXG4gICAgICAgIGFycml2YWxUaW1lID49IG5ld051bVN0cmluZzEgJiYgYXJyaXZhbFRpbWUgPD0gbmV3TnVtU3RyaW5nMjtcclxuXHJcbiAgICAgIC8vIGZvciBkZWJ1Z2dpbmdcclxuICAgICAgLy8gaWYgKCFyZXRWYWwpIHtcclxuICAgICAgLy8gICBjb25zb2xlLndhcm4oYCsrKyBGaWx0ZXJpbmcgT3V0OiAke2Fycml2YWxUaW1lfSArKytgKTtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgcmV0dXJuIHJldFZhbDtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnlBcnJpdmFsVGltZShcclxuICAgIG1pbkFycjogbnVtYmVyLFxyXG4gICAgbWF4QXJyOiBudW1iZXIsXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIGNvbnN0IG5ld051bVN0cmluZzEgPSBOdW1iZXIoXHJcbiAgICAgIE1hdGguZmxvb3IoTnVtYmVyKG1pbkFyciAvIDEwMCkpLnRvU3RyaW5nKCkgK1xyXG4gICAgICB0aGlzLnRyYW5zZm9ybU1pbihNYXRoLmNlaWwoTnVtYmVyKG1pbkFyciAlIDEwMCkpKVxyXG4gICAgKTtcclxuICAgIGNvbnN0IG5ld051bVN0cmluZzIgPSBOdW1iZXIoXHJcbiAgICAgIE1hdGguZmxvb3IoTnVtYmVyKG1heEFyciAvIDEwMCkpLnRvU3RyaW5nKCkgK1xyXG4gICAgICB0aGlzLnRyYW5zZm9ybU1pbihNYXRoLmNlaWwoTnVtYmVyKG1heEFyciAlIDEwMCkpKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBjb25zdCBhcnJpdmFsVGltZSA9IE51bWJlcihcclxuICAgICAgICBtb21lbnQoXHJcbiAgICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzW3Jlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgLmRhdGVUaW1lQXJyaXZpbmdcclxuICAgICAgICApLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm4gYXJyaXZhbFRpbWUgPj0gbmV3TnVtU3RyaW5nMSAmJiBhcnJpdmFsVGltZSA8PSBuZXdOdW1TdHJpbmcyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeUJhZ2dhZ2UoXHJcbiAgICBiYWdnYWdlRmlsdGVyczogU2VsZWN0RmlsdGVyW10sXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gYmFnZ2FnZUZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LnNlbGVjdGVkKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWQ/Lmxlbmd0aCA+PSAxICYmIHNlbGVjdGVkLmxlbmd0aCAhPT0gYmFnZ2FnZUZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHRvdGFsQmFncyA9IHRoaXMuZ2V0VG90YWxCYWdnYWdlKHJlc3VsdCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmZpbmQoKHgpID0+IHgudmFsdWUgPT09IHRvdGFsQmFncyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJysrKyBFcnJvciBkZXRlcm1lbmluZyBiYWdnYWdlOiAke2Vycm9yfSArKysnKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnlQcmljZShcclxuICAgIG1pblByaWNlOiBudW1iZXIsXHJcbiAgICBtYXhQcmljZTogbnVtYmVyLFxyXG4gICAgcmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W11cclxuICApOiBGbGlnaHRJdGluZXJhcnlbXSB7XHJcbiAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhgKysrIFByaWNlOiAke3Jlc3VsdC50b3RhbC5wcmljZX0gaXMgYmV0d2VlbjogJHttaW5QcmljZX0gYW5kICR7bWF4UHJpY2V9OiAke3Jlc3VsdC50b3RhbC5wcmljZSA+PSBtaW5QcmljZSAmJiByZXN1bHQudG90YWwucHJpY2UgPD0gbWF4UHJpY2V9ICsrK2ApXHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0LnRvdGFsLnByaWNlID49IG1pblByaWNlICYmIHJlc3VsdC50b3RhbC5wcmljZSA8PSBtYXhQcmljZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gZmlsdGVyIHRoZSByZXN1bHRzIGJ5IHRoZSBudW1iZXIgb2Ygc3RvcHNcclxuICAgKiBAcGFyYW0gc3RvcEZpbHRlcnMgLSB0aGUgc2VsZWN0ZWQgc3RvcHNcclxuICAgKiBAcGFyYW0gZnVsbFJlc3VsdHMgLSBhbGwgb2Ygb3VyIHJlc3VsdHMgc28gZmFyXHJcbiAgICovXHJcbiAgZmlsdGVyUmVzdWx0c0J5U3RvcHMoXHJcbiAgICBzdG9wRmlsdGVyczogU2VsZWN0RmlsdGVyW10sXHJcbiAgICBmdWxsUmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W11cclxuICApOiBGbGlnaHRJdGluZXJhcnlbXSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IHN0b3BGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5zZWxlY3RlZCk7XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkPy5sZW5ndGggPj0gMSAmJiBzZWxlY3RlZC5sZW5ndGggIT09IHN0b3BGaWx0ZXJzLmxlbmd0aCkge1xyXG4gICAgICBmdWxsUmVzdWx0cyA9IGZ1bGxSZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG90YWxTdG9wcyA9IHJlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgICAgY29uc3QgaGF2ZVN0b3AgPSBzZWxlY3RlZC5maW5kKFxyXG4gICAgICAgICAgKHNlbGVjdGVkMTogU2VsZWN0RmlsdGVyKSA9PiBzZWxlY3RlZDEudmFsdWUgPT09IHRvdGFsU3RvcHNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gaGF2ZVN0b3A7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmdWxsUmVzdWx0cztcclxuICB9XHJcblxyXG4gIGZpbHRlclJlc3VsdHNCeUFpcmxpbmUoXHJcbiAgICBhaXJsaW5lRmlsdGVyczogU2VsZWN0RmlsdGVyW10sXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gYWlybGluZUZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LnNlbGVjdGVkKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWQ/Lmxlbmd0aCA+PSAxICYmIHNlbGVjdGVkLmxlbmd0aCAhPT0gYWlybGluZUZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmZpbmQoXHJcbiAgICAgICAgICAoeCkgPT4geC52YWx1ZSA9PT0gcmVzdWx0Lm91dGJvdW5kRmxpZ2h0c1swXS5vcGVyYXRpbmdDYXJyaWVyXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJSZXN1bHRzQnlDbGFzcyhcclxuICAgIGNsYXNzRmlsdGVyczogU2VsZWN0RmlsdGVyW10sXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gY2xhc3NGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5zZWxlY3RlZCk7XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkPy5sZW5ndGggPj0gMSAmJiBzZWxlY3RlZC5sZW5ndGggIT09IGNsYXNzRmlsdGVycy5sZW5ndGgpIHtcclxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQuZmluZChcclxuICAgICAgICAgICh4KSA9PiB4LnZhbHVlID09PSByZXN1bHQub3V0Ym91bmRGbGlnaHRzWzBdLmNhYmluQ2xhc3NcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIGZpbHRlckJ5RGVwYXJ0dXJlQWlycG9ydChcclxuICAgIGRlcGFydHVyZUFpcnBvcnRzOiBTZWxlY3RGaWx0ZXJbXSxcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBkZXBhcnR1cmVBaXJwb3J0cy5maWx0ZXIoKHgpID0+IHguc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZD8ubGVuZ3RoID49IDEgJiYgc2VsZWN0ZWQubGVuZ3RoICE9PSBkZXBhcnR1cmVBaXJwb3J0cy5sZW5ndGgpIHtcclxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQuZmluZChcclxuICAgICAgICAgICh4KSA9PiB4LnZhbHVlID09PSByZXN1bHQub3V0Ym91bmRGbGlnaHRzWzBdLm9yaWdpbkFpcnBvcnRcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIGZpbHRlckJ5QXJyaXZhbEFpcnBvcnQoXHJcbiAgICBhcnJpdmFsQWlycG9ydHM6IFNlbGVjdEZpbHRlcltdLFxyXG4gICAgcmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W11cclxuICApOiBGbGlnaHRJdGluZXJhcnlbXSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IGFycml2YWxBaXJwb3J0cy5maWx0ZXIoKHgpID0+IHguc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZD8ubGVuZ3RoID49IDEgJiYgc2VsZWN0ZWQubGVuZ3RoICE9PSBhcnJpdmFsQWlycG9ydHMubGVuZ3RoKSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25BaXJwb3J0ID1cclxuICAgICAgICAgIHJlc3VsdC5vdXRib3VuZEZsaWdodHNbcmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAuZGVzdGluYXRpb25BaXJwb3J0O1xyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZC5maW5kKCh4KSA9PiB4LnZhbHVlID09PSBkZXN0aW5hdGlvbkFpcnBvcnQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIGZpbHRlckJ5RGVwYXJ0dXJlUmV0dXJuQWlycG9ydChcclxuICAgIGRlcGFydHVyZUFpcnBvcnRzOiBTZWxlY3RGaWx0ZXJbXSxcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBkZXBhcnR1cmVBaXJwb3J0cy5maWx0ZXIoKHgpID0+IHguc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZD8ubGVuZ3RoID49IDEgJiYgc2VsZWN0ZWQubGVuZ3RoICE9PSBkZXBhcnR1cmVBaXJwb3J0cy5sZW5ndGgpIHtcclxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAoIXJlc3VsdC5pbmJvdW5kRmxpZ2h0cz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZC5maW5kKFxyXG4gICAgICAgICAgKHgpID0+IHgudmFsdWUgPT09IHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1swXS5vcmlnaW5BaXJwb3J0XHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeUFycml2YWxSZXR1cm5BaXJwb3J0KFxyXG4gICAgYXJyaXZhbEFpcnBvcnRzOiBTZWxlY3RGaWx0ZXJbXSxcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBhcnJpdmFsQWlycG9ydHMuZmlsdGVyKCh4KSA9PiB4LnNlbGVjdGVkKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWQ/Lmxlbmd0aCA+PSAxICYmIHNlbGVjdGVkLmxlbmd0aCAhPT0gYXJyaXZhbEFpcnBvcnRzLmxlbmd0aCkge1xyXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzdWx0LmluYm91bmRGbGlnaHRzPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25BaXJwb3J0ID1cclxuICAgICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1tyZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgLmRlc3RpbmF0aW9uQWlycG9ydDtcclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQuZmluZCgoeCkgPT4geC52YWx1ZSA9PT0gZGVzdGluYXRpb25BaXJwb3J0KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVGaWx0ZXJzKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdID0gW10pOiBGbGlnaHRGaWx0ZXJzIHtcclxuICAgIGNvbnN0IG1pblByaWNlID0gdGhpcy5nZXRNaW5QcmljZShyZXN1bHRzKTtcclxuICAgIGNvbnN0IG1heFByaWNlID0gdGhpcy5nZXRNYXhQcmljZShyZXN1bHRzKTtcclxuXHJcbiAgICBjb25zdCBuZXdGaWx0ZXJzOiBGbGlnaHRGaWx0ZXJzID0ge1xyXG4gICAgICBzdG9wczogdGhpcy5nZXRBbGxTdG9wcyhyZXN1bHRzKSxcclxuICAgICAgbXVzdEluY2x1ZGU6IFtdLFxyXG4gICAgICBjbGFzc2VzOiB0aGlzLmdldEFsbENsYXNzZXMocmVzdWx0cyksXHJcbiAgICAgIGFpcmxpbmVzOiB0aGlzLmdldEFsbEFpcmxpbmVzKHJlc3VsdHMpLFxyXG4gICAgICB0cmF2ZWxQb2xpY3k6IFtdLFxyXG4gICAgICBkZXBhdHVyZUFpcnBvcnQ6IHRoaXMuZ2V0QWxsRGVwYXJ0dXJlQWlycG9ydHMocmVzdWx0cyksXHJcbiAgICAgIGFycml2YWxBaXJwb3J0OiB0aGlzLmdldEFsbEFycml2YWxBaXJwb3J0cyhyZXN1bHRzKSxcclxuICAgICAgbWluUHJpY2UsXHJcbiAgICAgIG1heFByaWNlLFxyXG4gICAgICBkZXBhdHVyZVJldHVybkFpcnBvcnQ6IHRoaXMuZ2V0QWxsRGVwYXJ0dXJlQWlycG9ydHMocmVzdWx0cywgdHJ1ZSksXHJcbiAgICAgIGFycml2YWxSZXR1cm5BaXJwb3J0OiB0aGlzLmdldEFsbEFycml2YWxBaXJwb3J0cyhyZXN1bHRzLCB0cnVlKSxcclxuICAgICAgYmFnZ2FnZTogdGhpcy5nZXRCYWdnYWdlKHJlc3VsdHMpLFxyXG4gICAgICBmYXJlVHlwZXM6IFtdLFxyXG4gICAgICBtaW5EdXJhdGlvbjogdGhpcy5nZXRNaW5EdXJhdGlvbihyZXN1bHRzKSxcclxuICAgICAgbWF4RHVyYXRpb246IHRoaXMuZ2V0TWF4RHVyYXRpb24ocmVzdWx0cyksXHJcbiAgICAgIG1pblJldHVybkR1cmF0aW9uOiB0aGlzLmdldE1pbkR1cmF0aW9uKHJlc3VsdHMsIHRydWUpLFxyXG4gICAgICBtYXhSZXR1cm5EdXJhdGlvbjogdGhpcy5nZXRNYXhEdXJhdGlvbihyZXN1bHRzLCB0cnVlKSxcclxuICAgICAgbWluRGVwYXJ0dXJlVGltZTogdGhpcy5nZXRNaW5EZXBhcnR1cmVUaW1lKHJlc3VsdHMpLFxyXG4gICAgICBtYXhEZXBhcnR1cmVUaW1lOiB0aGlzLmdldE1heERlcGFydHVyZVRpbWUocmVzdWx0cyksXHJcbiAgICAgIG1pbkFycml2YWxUaW1lOiB0aGlzLmdldE1pbkFycml2YWxUaW1lKHJlc3VsdHMpLFxyXG4gICAgICBtYXhBcnJpdmFsVGltZTogdGhpcy5nZXRNYXhBcnJpdmFsVGltZShyZXN1bHRzKSxcclxuICAgICAgbWluUmV0dXJuRGVwYXJ0dXJlVGltZTogdGhpcy5nZXRNaW5SZXR1cm5EZXBhcnR1cmVUaW1lKHJlc3VsdHMpLFxyXG4gICAgICBtYXhSZXR1cm5EZXBhcnR1cmVUaW1lOiB0aGlzLmdldE1heFJldHVybkRlcGFydHVyZVRpbWUocmVzdWx0cyksXHJcbiAgICAgIG1heFJldHVybkFycml2YWxUaW1lOiB0aGlzLmdldE1heFJldHVybkFycml2YWxUaW1lKHJlc3VsdHMpLFxyXG4gICAgICBtaW5SZXR1cm5BcnJpdmFsVGltZTogdGhpcy5nZXRNaW5SZXR1cm5BcnJpdmFsVGltZShyZXN1bHRzKSxcclxuICAgICAgZmxpZ2h0TnVtYmVyOiAnJ1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3RmlsdGVycztcclxuICB9XHJcblxyXG4gIGdldE1pbkR1cmF0aW9uKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdLCBpc1JldHVybiA9IGZhbHNlKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW4gPSAwO1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGxldCBkdXIgPSAwO1xyXG5cclxuICAgICAgaWYgKCFpc1JldHVybikge1xyXG4gICAgICAgIHJlc3VsdC5vdXRib3VuZEZsaWdodHMuZm9yRWFjaCgob3V0OiBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgICBkdXIgKz0gb3V0LnRvdGFsRHVyYXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXN1bHQuaW5ib3VuZEZsaWdodHM/Lmxlbmd0aCAmJiBpc1JldHVybikge1xyXG4gICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0cy5mb3JFYWNoKChpbmI6IEZsaWdodEpvdXJuZXkpID0+IHtcclxuICAgICAgICAgIGR1ciArPSBpbmIudG90YWxEdXJhdGlvbjtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFtaW4gfHwgZHVyIDwgbWluKSB7XHJcbiAgICAgICAgbWluID0gZHVyO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWluO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4RHVyYXRpb24ocmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10sIGlzUmV0dXJuID0gZmFsc2UpOiBudW1iZXIge1xyXG4gICAgbGV0IG1heCA9IDA7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgbGV0IGR1ciA9IDA7XHJcbiAgICAgIGlmICghaXNSZXR1cm4pIHtcclxuICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzLmZvckVhY2goKG91dDogRmxpZ2h0Sm91cm5leSkgPT4ge1xyXG4gICAgICAgICAgZHVyICs9IG91dC50b3RhbER1cmF0aW9uO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzPy5sZW5ndGggJiYgaXNSZXR1cm4pIHtcclxuICAgICAgICByZXN1bHQuaW5ib3VuZEZsaWdodHMuZm9yRWFjaCgoaW5iOiBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgICBkdXIgKz0gaW5iLnRvdGFsRHVyYXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghbWF4IHx8IGR1ciA+IG1heCkge1xyXG4gICAgICAgIG1heCA9IGR1cjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1heDtcclxuICB9XHJcblxyXG4gIGdldE1pbkFycml2YWxUaW1lKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW46IG51bWJlcjtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgbWluRGVwVGltZSA9IE51bWJlcihcclxuICAgICAgICBtb21lbnQoXHJcbiAgICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzW3Jlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgLmRhdGVUaW1lQXJyaXZpbmdcclxuICAgICAgICApLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICk7XHJcbiAgICAgIG1pbkRlcFRpbWUgPSBNYXRoLmZsb29yKG1pbkRlcFRpbWUgLyAxMDApICogMTAwO1xyXG4gICAgICBpZiAoIW1pbiB8fCBtaW5EZXBUaW1lIDwgbWluKSB7XHJcbiAgICAgICAgbWluID0gbWluRGVwVGltZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1pbjtcclxuICB9XHJcblxyXG4gIGdldE1pblJldHVybkFycml2YWxUaW1lKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW46IG51bWJlcjtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzICYmIHJlc3VsdC5pbmJvdW5kRmxpZ2h0cy5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgbWluRGVwVGltZSA9IE51bWJlcihcclxuICAgICAgICAgIG1vbWVudChcclxuICAgICAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzW3Jlc3VsdC5pbmJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAgIC5kYXRlVGltZUFycml2aW5nXHJcbiAgICAgICAgICApLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBtaW5EZXBUaW1lID0gTWF0aC5mbG9vcihtaW5EZXBUaW1lIC8gMTAwKSAqIDEwMDtcclxuICAgICAgICBpZiAoIW1pbiB8fCBtaW5EZXBUaW1lIDwgbWluKSB7XHJcbiAgICAgICAgICBtaW4gPSBtaW5EZXBUaW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1pbjtcclxuICB9XHJcblxyXG4gIGdldE1heFJldHVybkFycml2YWxUaW1lKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBtYXg6IG51bWJlcjtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzICYmIHJlc3VsdC5pbmJvdW5kRmxpZ2h0cy5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgbWF4RGVwVGltZSA9IE51bWJlcihcclxuICAgICAgICAgIG1vbWVudChcclxuICAgICAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzW3Jlc3VsdC5pbmJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAgIC5kYXRlVGltZUFycml2aW5nXHJcbiAgICAgICAgICApLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBtYXhEZXBUaW1lID0gTWF0aC5jZWlsKG1heERlcFRpbWUgLyAxMDApICogMTAwO1xyXG4gICAgICAgIGlmICghbWF4IHx8IG1heERlcFRpbWUgPiBtYXgpIHtcclxuICAgICAgICAgIG1heCA9IG1heERlcFRpbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4QXJyaXZhbFRpbWUocmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10pOiBudW1iZXIge1xyXG4gICAgbGV0IG1heDogbnVtYmVyO1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGxldCBtYXhEZXBUaW1lID0gTnVtYmVyKFxyXG4gICAgICAgIG1vbWVudChcclxuICAgICAgICAgIHJlc3VsdC5vdXRib3VuZEZsaWdodHNbcmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAuZGF0ZVRpbWVBcnJpdmluZ1xyXG4gICAgICAgICkuZm9ybWF0KCdISG1tJylcclxuICAgICAgKTtcclxuXHJcbiAgICAgIG1heERlcFRpbWUgPSBNYXRoLmNlaWwobWF4RGVwVGltZSAvIDEwMCkgKiAxMDA7XHJcbiAgICAgIGlmICghbWF4IHx8IG1heERlcFRpbWUgPiBtYXgpIHtcclxuICAgICAgICBtYXggPSBtYXhEZXBUaW1lO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBtYXg7XHJcbiAgfVxyXG5cclxuICBnZXRNaW5EZXBhcnR1cmVUaW1lKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW46IG51bWJlcjtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgbWluRGVwVGltZSA9IE51bWJlcihcclxuICAgICAgICBtb21lbnQocmVzdWx0Lm91dGJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZykuZm9ybWF0KCdISG1tJylcclxuICAgICAgKTtcclxuICAgICAgbWluRGVwVGltZSA9IE1hdGguZmxvb3IobWluRGVwVGltZSAvIDEwMCkgKiAxMDA7XHJcbiAgICAgIGlmICghbWluIHx8IG1pbkRlcFRpbWUgPCBtaW4pIHtcclxuICAgICAgICBtaW4gPSBtaW5EZXBUaW1lO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWluO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWluUmV0dXJuRGVwYXJ0dXJlVGltZShyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWluOiBudW1iZXI7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5pbmJvdW5kRmxpZ2h0cyAmJiByZXN1bHQuaW5ib3VuZEZsaWdodHNbMF0pIHtcclxuICAgICAgICBsZXQgbWluRGVwVGltZSA9IE51bWJlcihcclxuICAgICAgICAgIG1vbWVudChyZXN1bHQuaW5ib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBtaW5EZXBUaW1lID0gTWF0aC5mbG9vcihtaW5EZXBUaW1lIC8gMTAwKSAqIDEwMDtcclxuICAgICAgICBpZiAoIW1pbiB8fCBtaW5EZXBUaW1lIDwgbWluKSB7XHJcbiAgICAgICAgICBtaW4gPSBtaW5EZXBUaW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1pbjtcclxuICB9XHJcblxyXG4gIGdldE1heFJldHVybkRlcGFydHVyZVRpbWUocmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10pOiBudW1iZXIge1xyXG4gICAgbGV0IG1heDogbnVtYmVyO1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQuaW5ib3VuZEZsaWdodHMgJiYgcmVzdWx0LmluYm91bmRGbGlnaHRzWzBdKSB7XHJcbiAgICAgICAgbGV0IG1heERlcFRpbWUgPSBOdW1iZXIoXHJcbiAgICAgICAgICBtb21lbnQocmVzdWx0LmluYm91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIG1heERlcFRpbWUgPSBNYXRoLmNlaWwobWF4RGVwVGltZSAvIDEwMCkgKiAxMDA7XHJcblxyXG4gICAgICAgIGlmICghbWF4IHx8IG1heERlcFRpbWUgPiBtYXgpIHtcclxuICAgICAgICAgIG1heCA9IG1heERlcFRpbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4RGVwYXJ0dXJlVGltZShyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWF4OiBudW1iZXI7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgbGV0IG1heERlcFRpbWUgPSBOdW1iZXIoXHJcbiAgICAgICAgbW9tZW50KHJlc3VsdC5vdXRib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBtYXhEZXBUaW1lID0gTWF0aC5jZWlsKG1heERlcFRpbWUgLyAxMDApICogMTAwO1xyXG5cclxuICAgICAgaWYgKCFtYXggfHwgbWF4RGVwVGltZSA+IG1heCkge1xyXG4gICAgICAgIG1heCA9IG1heERlcFRpbWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBtYXg7XHJcbiAgfVxyXG5cclxuICBnZXRCYWdnYWdlKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogU2VsZWN0RmlsdGVyW10ge1xyXG4gICAgY29uc3QgYmFnZ2FnZTogYW55ID0ge307XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYXJzZWRBZGRpdGlvbmFsID0gSlNPTi5wYXJzZShyZXN1bHQuYWRkaXRpb25hbCk7XHJcblxyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcblxyXG4gICAgICAgIGlmIChwYXJzZWRBZGRpdGlvbmFsICYmIHBhcnNlZEFkZGl0aW9uYWwub3V0Ym91bmRGbGlnaHRzKSB7XHJcbiAgICAgICAgICBwYXJzZWRBZGRpdGlvbmFsLm91dGJvdW5kRmxpZ2h0cy5mb3JFYWNoKChmbGlnaHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBmbGlnaHQuYmFnZ2FnZS5mb3JFYWNoKChiYWc6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChiYWcuYWxsb3dhbmNlICYmIGJhZy5hbGxvd2FuY2UgPiB0b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgdG90YWwgPSBiYWcuYWxsb3dhbmNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZEFkZGl0aW9uYWwgJiYgcGFyc2VkQWRkaXRpb25hbC5iYWdnYWdlQWxsb3dhbmNlKSB7XHJcbiAgICAgICAgICBwYXJzZWRBZGRpdGlvbmFsLmJhZ2dhZ2VBbGxvd2FuY2UuZm9yRWFjaCgoYmFnZ2FnZUFsbG93OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIGJhZ2dhZ2VBbGxvdy5iYWdnYWdlLnF0eSAmJlxyXG4gICAgICAgICAgICAgIE51bWJlcihiYWdnYWdlQWxsb3cuYmFnZ2FnZS5xdHkpID4gdG90YWxcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgdG90YWwgPSBOdW1iZXIoYmFnZ2FnZUFsbG93LmJhZ2dhZ2UucXR5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBiYWdnYWdlW3RvdGFsXSA9IHtcclxuICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcclxuICAgICAgICAgIHZhbHVlOiB0b3RhbCxcclxuICAgICAgICAgIGRpc3BsYXk6IGAke3RvdGFsfSBiYWcke3RvdGFsICE9PSAxID8gJ3MnIDogJyd9YFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgKysrIEVycm9yIHBhcnNpbmcgYWRkaXRpb25hbCBmbGlnaHQgZGF0YTogJHtlcnJvcn0gKysrYCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGJhZ2dhZ2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWluUHJpY2UocmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10pOiBudW1iZXIge1xyXG4gICAgbGV0IG1pblByaWNlOiBudW1iZXI7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKCFtaW5QcmljZSB8fCByZXN1bHQudG90YWwucHJpY2UgPCBtaW5QcmljZSkge1xyXG4gICAgICAgIG1pblByaWNlID0gcmVzdWx0LnRvdGFsLnByaWNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWluUHJpY2U7XHJcbiAgfVxyXG5cclxuICBnZXRNYXhQcmljZShyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWF4UHJpY2U6IGFueTtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAoIW1heFByaWNlIHx8IHJlc3VsdC50b3RhbC5wcmljZSA+IG1heFByaWNlKSB7XHJcbiAgICAgICAgbWF4UHJpY2UgPSByZXN1bHQudG90YWwucHJpY2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBtYXhQcmljZTtcclxuICB9XHJcblxyXG4gIGdldEFsbFN0b3BzKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogU2VsZWN0RmlsdGVyW10ge1xyXG4gICAgY29uc3QgYWxsU3RvcHM6IGFueSA9IHt9O1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRvdGFsU3RvcHMgPSByZXN1bHQub3V0Ym91bmRGbGlnaHRzLmxlbmd0aCAtIDE7IC8vIG1pZ2h0IGhhdmUgdG8gcmVjYWxjdWxhdGUgdGhpc1xyXG4gICAgICBhbGxTdG9wc1t0b3RhbFN0b3BzXSA9IHtcclxuICAgICAgICB2YWx1ZTogdG90YWxTdG9wcyxcclxuICAgICAgICBkaXNwbGF5OiBgJHt0b3RhbFN0b3BzfSBzdG9wYCArICh0b3RhbFN0b3BzICE9PSAxID8gJ3MnIDogJycpLFxyXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoYWxsU3RvcHMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWxsQ2xhc3NlcyhyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IFNlbGVjdEZpbHRlcltdIHtcclxuICAgIGNvbnN0IGFsbENsYXNzZXM6IGFueSA9IFtdO1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIHJlc3VsdC5vdXRib3VuZEZsaWdodHMuZm9yRWFjaCgob3V0RmxpZ2h0OiBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgYWxsQ2xhc3Nlc1tvdXRGbGlnaHQuY2FiaW5DbGFzc10gPSB7XHJcbiAgICAgICAgICB2YWx1ZTogb3V0RmxpZ2h0LmNhYmluQ2xhc3MsXHJcbiAgICAgICAgICBkaXNwbGF5OiBvdXRGbGlnaHQuY2FiaW5DbGFzcyxcclxuICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZVxyXG4gICAgICAgIH0gYXMgU2VsZWN0RmlsdGVyO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQuaW5ib3VuZEZsaWdodHMpIHtcclxuICAgICAgICByZXN1bHQuaW5ib3VuZEZsaWdodHMuZm9yRWFjaCgoaW5GbGlnaHQ6IEZsaWdodEpvdXJuZXkpID0+IHtcclxuICAgICAgICAgIGFsbENsYXNzZXNbaW5GbGlnaHQuY2FiaW5DbGFzc10gPSB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBpbkZsaWdodC5jYWJpbkNsYXNzLFxyXG4gICAgICAgICAgICBkaXNwbGF5OiBpbkZsaWdodC5jYWJpbkNsYXNzLFxyXG4gICAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgICAgICAgIH0gYXMgU2VsZWN0RmlsdGVyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhhbGxDbGFzc2VzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiAtIGNyZWF0ZSBzZWxlY3QgZmlsdGVycyBmb3IgYWxsIHVuaXF1ZSBkZXBhcnR1cmUgYWlycG9ydHMgcmV0dXJuZWQgaW4gdGhlIHNlYXJjaFxyXG4gICAqIEBwYXJhbSByZXN1bHRzIC0gdGhlIGZsaWdodCByZXN1bHRzXHJcbiAgICovXHJcbiAgZ2V0QWxsRGVwYXJ0dXJlQWlycG9ydHMoXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSxcclxuICAgIGluYm91bmQgPSBmYWxzZVxyXG4gICk6IFNlbGVjdEZpbHRlcltdIHtcclxuICAgIGNvbnN0IGFsbEFpcnBvcnRzOiBhbnkgPSB7fTtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5sZW5ndGggJiYgIWluYm91bmQpIHtcclxuICAgICAgICBhbGxBaXJwb3J0c1tyZXN1bHQub3V0Ym91bmRGbGlnaHRzWzBdLm9yaWdpbkFpcnBvcnRdID0ge1xyXG4gICAgICAgICAgdmFsdWU6IHJlc3VsdC5vdXRib3VuZEZsaWdodHNbMF0ub3JpZ2luQWlycG9ydCxcclxuICAgICAgICAgIGRpc3BsYXk6IHJlc3VsdC5vdXRib3VuZEZsaWdodHNbMF0ub3JpZ2luQWlycG9ydE5hbWUsXHJcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzPy5sZW5ndGggJiYgaW5ib3VuZCkge1xyXG4gICAgICAgIGFsbEFpcnBvcnRzW3Jlc3VsdC5pbmJvdW5kRmxpZ2h0c1swXS5vcmlnaW5BaXJwb3J0XSA9IHtcclxuICAgICAgICAgIHZhbHVlOiByZXN1bHQuaW5ib3VuZEZsaWdodHNbMF0ub3JpZ2luQWlycG9ydCxcclxuICAgICAgICAgIGRpc3BsYXk6IHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1swXS5vcmlnaW5BaXJwb3J0TmFtZSxcclxuICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGFsbEFpcnBvcnRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiAtIGNyZWF0ZSBzZWxlY3QgZmlsdGVycyBmb3IgYWxsIHVuaXF1ZSBkZXBhcnR1cmUgYWlycG9ydHMgcmV0dXJuZWQgaW4gdGhlIHNlYXJjaFxyXG4gICAqIEBwYXJhbSByZXN1bHRzIC0gdGhlIGZsaWdodCByZXN1bHRzXHJcbiAgICovXHJcbiAgZ2V0QWxsQXJyaXZhbEFpcnBvcnRzKFxyXG4gICAgcmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10sXHJcbiAgICBpbmJvdW5kID0gZmFsc2VcclxuICApOiBTZWxlY3RGaWx0ZXJbXSB7XHJcbiAgICBjb25zdCBhbGxBaXJwb3J0czogYW55ID0ge307XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoICYmICFpbmJvdW5kKSB7XHJcbiAgICAgICAgYWxsQWlycG9ydHNbXHJcbiAgICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzW1xyXG4gICAgICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzLmxlbmd0aCAtIDFcclxuICAgICAgICAgIF0uZGVzdGluYXRpb25BaXJwb3J0XHJcbiAgICAgICAgXSA9IHtcclxuICAgICAgICAgIHZhbHVlOlxyXG4gICAgICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzW3Jlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgICAuZGVzdGluYXRpb25BaXJwb3J0LFxyXG4gICAgICAgICAgZGlzcGxheTpcclxuICAgICAgICAgICAgcmVzdWx0Lm91dGJvdW5kRmxpZ2h0c1tyZXN1bHQub3V0Ym91bmRGbGlnaHRzLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgICAgLmRlc3RpbmF0aW9uQWlycG9ydE5hbWUsXHJcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzPy5sZW5ndGggJiYgaW5ib3VuZCkge1xyXG4gICAgICAgIGFsbEFpcnBvcnRzW1xyXG4gICAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzW1xyXG4gICAgICAgICAgICByZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgXS5kZXN0aW5hdGlvbkFpcnBvcnRcclxuICAgICAgICBdID0ge1xyXG4gICAgICAgICAgdmFsdWU6XHJcbiAgICAgICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1tyZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgICAuZGVzdGluYXRpb25BaXJwb3J0LFxyXG4gICAgICAgICAgZGlzcGxheTpcclxuICAgICAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzW3Jlc3VsdC5pbmJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAgIC5kZXN0aW5hdGlvbkFpcnBvcnROYW1lLFxyXG4gICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoYWxsQWlycG9ydHMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gY3JlYXRlIHNlbGVjdCBmaWx0ZXJzIGZvciBhbGwgdW5pcXVlIGFpcmxpbmVzIHJldHVybmVkIGluIHRoZSBzZWFyY2hcclxuICAgKiBAcGFyYW0gcmVzdWx0cyAtIHRoZSBmbGlnaHQgcmVzdWx0c1xyXG4gICAqL1xyXG4gIGdldEFsbEFpcmxpbmVzKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogU2VsZWN0RmlsdGVyW10ge1xyXG4gICAgY29uc3QgYWxsQWlybGluZXM6IGFueSA9IHt9O1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0OiBGbGlnaHRJdGluZXJhcnkpID0+IHtcclxuICAgICAgcmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5mb3JFYWNoKChvdXRGbGlnaHQ6IEZsaWdodEpvdXJuZXkpID0+IHtcclxuICAgICAgICBhbGxBaXJsaW5lc1tvdXRGbGlnaHQub3BlcmF0aW5nQ2Fycmllcl0gPSB7XHJcbiAgICAgICAgICB2YWx1ZTogb3V0RmxpZ2h0Lm9wZXJhdGluZ0NhcnJpZXIsXHJcbiAgICAgICAgICBkaXNwbGF5OiBvdXRGbGlnaHQub3BlcmF0aW5nQ2Fycmllck5hbWUsXHJcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgICAgICB9IGFzIFNlbGVjdEZpbHRlcjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzKSB7XHJcbiAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzLmZvckVhY2goKGluRmxpZ2h0OiBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgICBhbGxBaXJsaW5lc1tpbkZsaWdodC5vcGVyYXRpbmdDYXJyaWVyXSA9IHtcclxuICAgICAgICAgICAgdmFsdWU6IGluRmxpZ2h0Lm9wZXJhdGluZ0NhcnJpZXIsXHJcbiAgICAgICAgICAgIGRpc3BsYXk6IGluRmxpZ2h0Lm9wZXJhdGluZ0NhcnJpZXJOYW1lLFxyXG4gICAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgICAgICAgIH0gYXMgU2VsZWN0RmlsdGVyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhhbGxBaXJsaW5lcyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzZWxlY3RHcm91cGVkRXVyb3N0YXIoXHJcbiAgICBzZWxlY3RlZEV1cm9zdGFyOiBFdXJvc3Rhckl0ZW0sXHJcbiAgICBmYXJlOiBFdXJvc3RhckZhcmUsXHJcbiAgICBkaXJlY3Rpb246IEZsaWdodERpcmVjdGlvbkVudW1cclxuICApIHtcclxuICAgIGNvbnN0IGludEJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UgPVxyXG4gICAgICBhd2FpdCB0aGlzLmJhc2tldFNlcnZpY2UuZ2V0RGVmYXVsdEJhc2tldCgpO1xyXG4gICAgY29uc3QgYmFza2V0ID0gaW50QmFza2V0Py5zdWJqZWN0LnZhbHVlO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgYmFza2V0ICYmXHJcbiAgICAgIHRoaXMub3JpZ2luYWxVc2VyU2VhcmNoLmNob3NlblNlYXJjaFR5cGUgPT09IEV1cm9zdGFyU2VhcmNoVHlwZS5vbmVXYXkgJiZcclxuICAgICAgZGlyZWN0aW9uID09PSBGbGlnaHREaXJlY3Rpb25FbnVtLk91dGJvdW5kXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5kb0Jvb2tpbmcoXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHNlbGVjdGVkRXVyb3N0YXIsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3V0Ym91bmRGbGlnaHRzOlxyXG4gICAgICAgICAgICBbdGhpcy5tYWtlU2NoZW1hRmxpZ2h0cyhmYXJlLmZhcmUsICdvdXRib3VuZCcsIDApXSxcclxuICAgICAgICAgIGluYm91bmRGbGlnaHRzOiBbXSxcclxuICAgICAgICAgIGpvdXJuZXlUeXBlOiAnc2luZ2xlJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2VsZWN0ZWRFdXJvc3Rhci5kYXRlRGVwYXJ0dXJlXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgYmFza2V0ICYmXHJcbiAgICAgIHRoaXMub3JpZ2luYWxVc2VyU2VhcmNoLmNob3NlblNlYXJjaFR5cGUgPT09IEV1cm9zdGFyU2VhcmNoVHlwZS5yZXR1cm4gJiZcclxuICAgICAgZGlyZWN0aW9uID09PSBGbGlnaHREaXJlY3Rpb25FbnVtLk91dGJvdW5kXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwRXVyb3N0YXIgPSBzZWxlY3RlZEV1cm9zdGFyO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRXVyb3N0YXJGYXJlID0gZmFyZTtcclxuICAgICAgY29uc3QgaW5kZXggPSBzZWxlY3RlZEV1cm9zdGFyLnVpZDtcclxuXHJcbiAgICAgIHRoaXMucmVzdWx0cy5uZXh0KFxyXG4gICAgICAgICh0aGlzLmZ1bGxSZXN1bHRzIGFzIEV1cm9zdGFyUmVzdWx0c1tdKS5tYXAoKHJlc3VsdDpFdXJvc3RhclJlc3VsdHMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG91dGJvdW5kID0gcmVzdWx0Lm91dGJvdW5kLmZpbHRlcigoaXRlbTpFdXJvc3Rhckl0ZW0sIGdyb3VwSW5kZXgpID0+IGluZGV4ID09PSBncm91cEluZGV4KTtcclxuICAgICAgICAgIHJldHVybiB7IGluYm91bmQ6IHJlc3VsdC5pbmJvdW5kLCBvdXRib3VuZCB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgYmFza2V0ICYmXHJcbiAgICAgIHRoaXMub3JpZ2luYWxVc2VyU2VhcmNoLmNob3NlblNlYXJjaFR5cGUgPT09IEV1cm9zdGFyU2VhcmNoVHlwZS5yZXR1cm4gJiZcclxuICAgICAgZGlyZWN0aW9uID09PSBGbGlnaHREaXJlY3Rpb25FbnVtLkluYm91bmQgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwRXVyb3N0YXJcclxuICAgICkge1xyXG4gICAgICB0aGlzLmRvQm9va2luZyhcclxuICAgICAgICBpbnRCYXNrZXQsXHJcbiAgICAgICAgc2VsZWN0ZWRFdXJvc3RhcixcclxuICAgICAgICB7XHJcbiAgICAgICAgICBvdXRib3VuZEZsaWdodHM6IFtcclxuICAgICAgICAgICAgdGhpcy5tYWtlU2NoZW1hRmxpZ2h0cyh0aGlzLnNlbGVjdGVkRXVyb3N0YXJGYXJlLmZhcmUsICdvdXRib3VuZCcsIDApXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgaW5ib3VuZEZsaWdodHM6IFtcclxuICAgICAgICAgICAgdGhpcy5tYWtlU2NoZW1hRmxpZ2h0cyhmYXJlLmZhcmUsICdpbmJvdW5kJywgMClcclxuXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgam91cm5leVR5cGU6ICdyb3VuZHRyaXAnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZWxlY3RlZEV1cm9zdGFyLmRhdGVEZXBhcnR1cmUsXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwRXVyb3N0YXIuZGF0ZUFycml2YWxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5yZXN1bHRzLm5leHQodGhpcy5mdWxsUmVzdWx0cyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHM6IEV1cm9zdGFyUmVzdWx0c1tdKTogSUNoZWFwZXN0UHJpY2Uge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgICAvLyBhZGQgaW4gb25jZSBmaWxnaHQgcmVzdWx0IGlzIHVwZGF0ZWQvLy9cclxuICAgIC8vIGNvbnN0IHJlc3VsdHMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtQXNMaXN0PEZsaWdodFF1b3RlUmVzdWx0QXJyYXk+KHRoaXMucmVzdWx0c1Nlc3Npb25OYW1lKSB8fCBbXSBhcyBGbGlnaHRRdW90ZVJlc3VsdEFycmF5O1xyXG4gICAgLy8gaWYoIXJlc3VsdHMubGVuZ3RoKSByZXR1cm47XHJcbiAgICAvLyB0aGlzLl9jaGVhcGVzdFJlc3VsdFByaWNlLmN1cnJlbmN5Q29kZSA9IHJlc3VsdHNbMF0udG90YWwuY3VycmVuY3k7XHJcbiAgICAvLyByZXN1bHRzLm1hcChyZXN1bHQgPT4ge1xyXG4gICAgLy8gICBjb25zdCBwcmljZSA9IHJlc3VsdC50b3RhbC5wcmljZTtcclxuICAgIC8vICAgaWYoIHRoaXMuX2NoZWFwZXN0UmVzdWx0UHJpY2UuYW1vdW50ID4gcHJpY2UgfHwgIHRoaXMuX2NoZWFwZXN0UmVzdWx0UHJpY2UuYW1vdW50ID09PSBudWxsKXtcclxuICAgIC8vICAgICB0aGlzLl9jaGVhcGVzdFJlc3VsdFByaWNlLmFtb3VudCA9IHByaWNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KVxyXG4gIH1cclxuXHJcbiAgZG9Cb29raW5nKFxyXG4gICAgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldEludGVyZmFjZSxcclxuICAgIHNlbGVjdGVkRmxpZ2h0OiBFdXJvc3Rhckl0ZW0sXHJcbiAgICBzY2hlbWFEZXRhaWxzOiBhbnksXHJcbiAgICBvdXRib3VuZERhdGU6IHN0cmluZyxcclxuICAgIGluYm91bmREYXRlPzogc3RyaW5nXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IHNvdXJjZUlkLCBjbzJQZXJJdGVtLCBjbzJQZXJQYXNzZW5nZXIsIHRvdGFsIH0gPSBzZWxlY3RlZEZsaWdodDtcclxuICAgIGNvbnN0IGJvb2tpbmc6IEFkZEl0ZW1Ub0Jhc2tldE11dGF0aW9uVmFyaWFibGVzID0ge1xyXG4gICAgICBhZHVsdHM6IHRoaXMuYWR1bHRzLFxyXG4gICAgICBiYXNrZXQ6IGludEJhc2tldC5pZCxcclxuICAgICAgY2hpbGRyZW46IHRoaXMuY2hpbGRyZW4sXHJcbiAgICAgIGNvMlBlckl0ZW0sXHJcbiAgICAgIGNvMlBlclBhc3NlbmdlcixcclxuICAgICAgY3VycmVuY3k6IHRvdGFsLmN1cnJlbmN5IGFzIEN1cnJlbmN5Q29kZSxcclxuICAgICAgZGV0YWlsOiBzY2hlbWFEZXRhaWxzLFxyXG4gICAgICBwcmljZTogdG90YWwucHJpY2UsXHJcbiAgICAgIHNlYXJjaFF1ZXJ5OiB0aGlzLnJlc3VsdFF1ZXJ5LFxyXG4gICAgICBzZXJ2aWNlOiBzb3VyY2VJZC50b1N0cmluZygpLFxyXG4gICAgICBvdXRib3VuZERhdGVcclxuICAgIH07XHJcbiAgICBpZiAoaW5ib3VuZERhdGUpIHtcclxuICAgICAgYm9va2luZy5pbmJvdW5kRGF0ZSA9IGluYm91bmREYXRlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICBib29raW5nLFxyXG4gICAgICBpbnRCYXNrZXQsXHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgdGhpcy50cmF2ZWxsZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbWFrZVNjaGVtYUZsaWdodHMoXHJcbiAgICBzZWxlY3RlZEZsaWdodDogRmxpZ2h0Sm91cm5leSxcclxuICAgIGZsaWdodEdyb3VwOiAnb3V0Ym91bmQnIHwgJ2luYm91bmQnLFxyXG4gICAgZ3JvdXBJbmRleDogbnVtYmVyLFxyXG4gICAgc2VnbWVudEluZGV4PzogbnVtYmVyXHJcbiAgKTogYW55IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNhYmluQ2xhc3M6IHNlbGVjdGVkRmxpZ2h0LmNhYmluQ2xhc3MsXHJcbiAgICAgIGRhdGVUaW1lQXJyaXZpbmc6IHNlbGVjdGVkRmxpZ2h0LmRhdGVUaW1lQXJyaXZpbmcsXHJcbiAgICAgIGRhdGVUaW1lQXJyaXZpbmdVVEM6IHNlbGVjdGVkRmxpZ2h0LmRhdGVUaW1lQXJyaXZpbmdVVEMsXHJcbiAgICAgIGRhdGVUaW1lRGVwYXJ0aW5nOiBzZWxlY3RlZEZsaWdodC5kYXRlVGltZURlcGFydGluZyxcclxuICAgICAgZGF0ZVRpbWVEZXBhcnRpbmdVVEM6IHNlbGVjdGVkRmxpZ2h0LmRhdGVUaW1lRGVwYXJ0aW5nVVRDLFxyXG4gICAgICBkZXN0aW5hdGlvbkFpcnBvcnQ6IHNlbGVjdGVkRmxpZ2h0LmRlc3RpbmF0aW9uQWlycG9ydCxcclxuICAgICAgam91cm5leUluZm86IHtcclxuICAgICAgICBmbGlnaHRHcm91cCxcclxuICAgICAgICBncm91cEluZGV4LFxyXG4gICAgICAgIHNlZ21lbnRJbmRleFxyXG4gICAgICB9LFxyXG4gICAgICBtYXJrZXRpbmdDYXJyaWVyOiBzZWxlY3RlZEZsaWdodC5tYXJrZXRpbmdDYXJyaWVyLFxyXG4gICAgICBtYXJrZXRpbmdGbGlnaHROdW1iZXI6IHNlbGVjdGVkRmxpZ2h0Lm1hcmtldGluZ0ZsaWdodE51bWJlcixcclxuICAgICAgb3BlcmF0aW5nQ2Fycmllcjogc2VsZWN0ZWRGbGlnaHQub3BlcmF0aW5nQ2FycmllcixcclxuICAgICAgb3BlcmF0aW5nRmxpZ2h0TnVtYmVyOiBzZWxlY3RlZEZsaWdodC5vcGVyYXRpbmdGbGlnaHROdW1iZXIsXHJcbiAgICAgIG9yaWdpbkFpcnBvcnQ6IHNlbGVjdGVkRmxpZ2h0Lm9yaWdpbkFpcnBvcnQsXHJcbiAgICAgIHRvdGFsRHVyYXRpb246IHNlbGVjdGVkRmxpZ2h0LnRvdGFsRHVyYXRpb24sXHJcbiAgICAgIGZhcmVUeXBlOiBzZWxlY3RlZEZsaWdodC5mYXJlSW5mby50aXRsZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlR3JvdXBlZEl0ZW0oXHJcbiAgICByZXR1cm5PYmplY3Q6IEV1cm9zdGFyR3JvdXBlZFF1b3RlUmVzdWx0LFxyXG4gICAgc291cmNlOiBzdHJpbmcsXHJcbiAgICBvdXRib3VuZEZsaWdodHM6IEZsaWdodEpvdXJuZXlbXSxcclxuICAgIG91dGJvdW5kVG90YWxEdXJhdGlvbjogbnVtYmVyLFxyXG4gICAgaW5ib3VuZEZsaWdodHM6IEZsaWdodEpvdXJuZXlbXSxcclxuICAgIGluYm91bmRUb3RhbER1cmF0aW9uOiBudW1iZXJcclxuICApIHtcclxuICAgIGlmIChvdXRib3VuZEZsaWdodHM/Lmxlbmd0aCAmJiAhcmV0dXJuT2JqZWN0LmRlcGFydERhdGVUaW1lKSB7XHJcbiAgICAgIGNvbnN0IGZpcnN0ID0gb3V0Ym91bmRGbGlnaHRzWzBdO1xyXG4gICAgICBjb25zdCBsYXN0ID0gb3V0Ym91bmRGbGlnaHRzW291dGJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxXTtcclxuICAgICAgcmV0dXJuT2JqZWN0Lm9yaWdpbkFpcnBvcnQgPSBmaXJzdC5vcmlnaW5BaXJwb3J0O1xyXG4gICAgICByZXR1cm5PYmplY3Qub3JpZ2luQWlycG9ydE5hbWUgPSBmaXJzdC5vcmlnaW5BaXJwb3J0TmFtZTtcclxuICAgICAgcmV0dXJuT2JqZWN0LmRlc3RpbmF0aW9uQWlycG9ydCA9IGxhc3QuZGVzdGluYXRpb25BaXJwb3J0O1xyXG4gICAgICByZXR1cm5PYmplY3QuZGVzdGluYXRpb25BaXJwb3J0TmFtZSA9IGxhc3QuZGVzdGluYXRpb25BaXJwb3J0TmFtZTtcclxuICAgICAgcmV0dXJuT2JqZWN0LmRlcGFydERhdGVUaW1lID0gZmlyc3QuZGF0ZVRpbWVEZXBhcnRpbmc7XHJcbiAgICAgIHJldHVybk9iamVjdC5hcnJpdmFsRGF0ZVRpbWUgPSBsYXN0LmRhdGVUaW1lQXJyaXZpbmc7XHJcbiAgICAgIHJldHVybk9iamVjdC5vdXRib3VuZFRvdGFsRHVyYXRpb24gPSBvdXRib3VuZFRvdGFsRHVyYXRpb247XHJcbiAgICAgIHJldHVybk9iamVjdC5kYXRhU291cmNlID0gc291cmNlO1xyXG4gICAgICByZXR1cm5PYmplY3Qub3BlcmF0b3IgPSBmaXJzdC5vcGVyYXRpbmdDYXJyaWVyO1xyXG4gICAgICByZXR1cm5PYmplY3Qub3BlcmF0b3JGdWxsID0gZmlyc3Qub3BlcmF0aW5nQ2Fycmllck5hbWU7XHJcbiAgICAgIHJldHVybk9iamVjdC5vdXRsZWdzQ291bnQgPSBvdXRib3VuZEZsaWdodHMubGVuZ3RoO1xyXG4gICAgICByZXR1cm5PYmplY3Qub3V0bGVncyA9IG91dGJvdW5kRmxpZ2h0cztcclxuICAgICAgcmV0dXJuT2JqZWN0Lm91dGJvdW5kRmxpZ2h0TnVtYmVyID1cclxuICAgICAgICB0aGlzLmhlbHBlcnMuam9pbkZyb21BdHRyaWJ1dGU8RmxpZ2h0Sm91cm5leT4oXHJcbiAgICAgICAgICAnLScsXHJcbiAgICAgICAgICAnb3BlcmF0aW5nRmxpZ2h0TnVtYmVyJyxcclxuICAgICAgICAgIG91dGJvdW5kRmxpZ2h0c1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm5PYmplY3QuaXNSZXR1cm4gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW5ib3VuZEZsaWdodHM/Lmxlbmd0aCAmJiAhcmV0dXJuT2JqZWN0LmluYm91bmRUb3RhbER1cmF0aW9uKSB7XHJcbiAgICAgIHJldHVybk9iamVjdC5pbmJvdW5kVG90YWxEdXJhdGlvbiA9IGluYm91bmRUb3RhbER1cmF0aW9uO1xyXG4gICAgICByZXR1cm5PYmplY3QuaW5sZWdzQ291bnQgPSBpbmJvdW5kRmxpZ2h0cy5sZW5ndGg7XHJcbiAgICAgIHJldHVybk9iamVjdC5pbmxlZ3MgPSBpbmJvdW5kRmxpZ2h0cztcclxuICAgICAgcmV0dXJuT2JqZWN0LmluYm91bmRGbGlnaHROdW1iZXIgPVxyXG4gICAgICAgIHRoaXMuaGVscGVycy5qb2luRnJvbUF0dHJpYnV0ZTxGbGlnaHRKb3VybmV5PihcclxuICAgICAgICAgICctJyxcclxuICAgICAgICAgICdvcGVyYXRpbmdGbGlnaHROdW1iZXInLFxyXG4gICAgICAgICAgaW5ib3VuZEZsaWdodHNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuT2JqZWN0LmlzUmV0dXJuID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtYWtlU2Vzc2lvblJlc3VsdHMoXHJcbiAgICBkYXRhOiBFdXJvc3RhclF1b3RlUmVzdWx0QXJyYXlcclxuICApOiBFdXJvc3RhclNlc3Npb25UeXBlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlc3VsdHM6IGRhdGEsXHJcbiAgICAgIGdyb3VwRGF0YTogdGhpcy5mbGlnaHRzVG9Hcm91cCxcclxuICAgICAgZ3JvdXBlZDogdGhpcy5ncm91cGVkLFxyXG4gICAgICBxdWVyeTogdGhpcy5yZXN1bHRRdWVyeVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldE1pbkZsaWdodFByaWNlRm9yQnJhbmQobWF0Y2hpbmdCcmFuZEZsaWdodHM6IEZsaWdodEl0aW5lcmFyeVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW4gPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcclxuICAgIG1hdGNoaW5nQnJhbmRGbGlnaHRzLmZvckVhY2goKGZsaWdodCkgPT4ge1xyXG4gICAgICBpZiAobWluID4gZmxpZ2h0Py50b3RhbD8ucHJpY2UpIHtcclxuICAgICAgICBtaW4gPSBmbGlnaHQudG90YWwucHJpY2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1pbjtcclxuICB9XHJcblxyXG4gIGdldE1heEZsaWdodFByaWNlRm9yQnJhbmQobWF0Y2hpbmdCcmFuZEZsaWdodHM6IEZsaWdodEl0aW5lcmFyeVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBtYXggPSAwO1xyXG4gICAgbWF0Y2hpbmdCcmFuZEZsaWdodHMuZm9yRWFjaCgoZmxpZ2h0KSA9PiB7XHJcbiAgICAgIGlmIChtYXggPCBmbGlnaHQ/LnRvdGFsPy5wcmljZSkge1xyXG4gICAgICAgIG1heCA9IGZsaWdodC50b3RhbC5wcmljZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxuXHJcbiAgaXNPdmVyTmlnaHQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvdXR3YXJkRGF5ID0gdGhpcy5vdXRCb3VuZERhdGUuZGF0ZSgpO1xyXG4gICAgY29uc3QgcmV0dXJuRGF5ID0gdGhpcy5pbmJvdW5kRGF0ZS5kYXRlKCk7XHJcbiAgICBpZiAocmV0dXJuRGF5IC0gb3V0d2FyZERheSA+PSAxKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbWluVG9Ib3VyID0gKGR1cjogbnVtYmVyKTogc3RyaW5nID0+IGAke01hdGguZmxvb3IoZHVyIC8gNjApfWggJHtkdXIgJSA2MH1tYDtcclxuXHJcbiAgYXN5bmMgYWRkRXVyb3N0YXJKb3VybmV5c1RvQmFza2V0KFxyXG4gICAgZXVyb3N0YXJRdW90ZTogRmxpZ2h0SXRpbmVyYXJ5XHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoZXVyb3N0YXJRdW90ZS51bmF2YWlsYWJsZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGludEJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UgPVxyXG4gICAgICBhd2FpdCB0aGlzLmJhc2tldFNlcnZpY2UuZ2V0RGVmYXVsdEJhc2tldCgpO1xyXG4gICAgY29uc3QgYmFza2V0ID0gaW50QmFza2V0Py5zdWJqZWN0LnZhbHVlO1xyXG4gICAgaWYgKGJhc2tldCkge1xyXG5cclxuICAgICAgY29uc3QgeyBzb3VyY2VJZCwgY28yUGVySXRlbSwgY28yUGVyUGFzc2VuZ2VyLCB0b3RhbCB9ID0gZXVyb3N0YXJRdW90ZTtcclxuICAgICAgY29uc3Qgb3V0Ym91bmREYXRlOiBhbnkgPSBtb21lbnQoZXVyb3N0YXJRdW90ZS5vdXRib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpO1xyXG4gICAgICBjb25zdCBpbmJvdW5kRGF0ZTogYW55ID0gZXVyb3N0YXJRdW90ZS5pbmJvdW5kRmxpZ2h0cy5sZW5ndGggPyBtb21lbnQoZXVyb3N0YXJRdW90ZS5pbmJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZykgOiBudWxsO1xyXG5cclxuICAgICAgY29uc3Qgc2NoZW1hRGV0YWlscyA9IHtcclxuICAgICAgICBvdXRib3VuZEZsaWdodHM6IFtcclxuICAgICAgICAgIC4uLmV1cm9zdGFyUXVvdGUub3V0Ym91bmRGbGlnaHRzLm1hcChcclxuICAgICAgICAgICAgKGZsaWdodDogRmxpZ2h0Sm91cm5leSwgc2VnbWVudEluZGV4OiBudW1iZXIpID0+XHJcbiAgICAgICAgICAgICAgdGhpcy5tYWtlU2NoZW1hRmxpZ2h0cyhmbGlnaHQsICdvdXRib3VuZCcsIDAsIHNlZ21lbnRJbmRleClcclxuICAgICAgICAgICldLFxyXG4gICAgICAgIGluYm91bmRGbGlnaHRzOiBbXHJcbiAgICAgICAgICAuLi5ldXJvc3RhclF1b3RlLmluYm91bmRGbGlnaHRzLm1hcChcclxuICAgICAgICAgICAgKGZsaWdodDogRmxpZ2h0Sm91cm5leSwgc2VnbWVudEluZGV4OiBudW1iZXIpID0+XHJcbiAgICAgICAgICAgICAgdGhpcy5tYWtlU2NoZW1hRmxpZ2h0cyhmbGlnaHQsICdpbmJvdW5kJywgMCwgc2VnbWVudEluZGV4KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgam91cm5leVR5cGU6ICdzaW5nbGUnXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYm9va2luZzogQWRkSXRlbVRvQmFza2V0TXV0YXRpb25WYXJpYWJsZXMgPSB7XHJcbiAgICAgICAgYWR1bHRzOiB0aGlzLmFkdWx0cyxcclxuICAgICAgICBiYXNrZXQ6IGludEJhc2tldC5pZCxcclxuICAgICAgICBjaGlsZHJlbjogdGhpcy5jaGlsZHJlbixcclxuICAgICAgICBjbzJQZXJJdGVtLFxyXG4gICAgICAgIGNvMlBlclBhc3NlbmdlcixcclxuICAgICAgICBjdXJyZW5jeTogdG90YWwuY3VycmVuY3kgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgICAgIGRldGFpbDogc2NoZW1hRGV0YWlscyxcclxuICAgICAgICBwcmljZTogdG90YWwucHJpY2UsXHJcbiAgICAgICAgc2VhcmNoUXVlcnk6IHRoaXMucmVzdWx0UXVlcnksXHJcbiAgICAgICAgc2VydmljZTogc291cmNlSWQudG9TdHJpbmcoKSxcclxuICAgICAgICBvdXRib3VuZERhdGU6IG91dGJvdW5kRGF0ZS5mb3JtYXQoKVxyXG4gICAgICB9O1xyXG4gICAgICBpZiAoaW5ib3VuZERhdGUpIHtcclxuICAgICAgICBib29raW5nLmluYm91bmREYXRlID0gaW5ib3VuZERhdGUuZm9ybWF0KCk7XHJcbiAgICAgICAgc2NoZW1hRGV0YWlscy5qb3VybmV5VHlwZSA9ICdyb3VuZHRyaXAnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICAgIGJvb2tpbmcsXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgICB0aGlzLnRyYXZlbGxlcnNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOyAvLyBUT0RPIHNob3VsZCB0aGlzIHRocm93IGFuIGVycm9yP1xyXG4gIH1cclxufVxyXG4iXX0=