@sabstravtech/obtservices 0.0.19020100 → 0.0.22041208

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 (241) hide show
  1. package/angular/components/with-component.d.ts +2 -1
  2. package/angular/fetchers.d.ts +17 -12
  3. package/angular/lib/vendor/classes/helpers.d.ts +8 -0
  4. package/angular/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.d.ts +7 -0
  5. package/angular/lib/vendor/fetchers/apply-jit-flight-rules.d.ts +7 -0
  6. package/angular/lib/vendor/fetchers/basket-fetcher.d.ts +2 -1
  7. package/angular/lib/vendor/fetchers/conferma-office.fetcher.d.ts +2 -1
  8. package/angular/lib/vendor/fetchers/flight-fare-rules.fetcher.d.ts +7 -0
  9. package/angular/lib/vendor/fetchers/flight-quote.fetcher.d.ts +2 -1
  10. package/angular/lib/vendor/fetchers/get-conferma-room-images.fetcher.d.ts +7 -0
  11. package/angular/lib/vendor/fetchers/get-covid-microsite-token.fetcher.d.ts +7 -0
  12. package/angular/lib/vendor/fetchers/get-flight-seat-map-fetcher.d.ts +7 -0
  13. package/angular/lib/vendor/fetchers/get-rail-live-departures.fetcher.d.ts +7 -0
  14. package/angular/lib/vendor/fetchers/get-user-favourite-searches.fetcher.d.ts +7 -0
  15. package/angular/lib/vendor/fetchers/irl-discount-card-fetcher.d.ts +7 -0
  16. package/angular/lib/vendor/fetchers/search-airlines-fetcher.d.ts +2 -1
  17. package/angular/lib/vendor/fetchers/search-airports-fetcher.d.ts +2 -1
  18. package/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +2 -1
  19. package/angular/lib/vendor/fetchers/user-fetcher.d.ts +2 -1
  20. package/angular/lib/vendor/services/my-bookings.service.d.ts +4 -3
  21. package/angular/lib/vendor/services/search.service.d.ts +15 -3
  22. package/angular/lib/vendor/services/user.service.d.ts +4 -3
  23. package/angular/lib/vendor/types/graphql.angular.types.d.ts +1062 -1062
  24. package/angular/lib/vendor/updaters/cancel-booking-updater.d.ts +6 -0
  25. package/angular/lib/vendor/updaters/confirm-messages-updater.d.ts +6 -0
  26. package/angular/lib/vendor/updaters/remove-favourite-search.updater.d.ts +6 -0
  27. package/angular/lib/vendor/updaters/save-favourite-search.updater.d.ts +6 -0
  28. package/angular/sabstravtech-obtservices-angular.d.ts +14 -9
  29. package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
  30. package/angular/updaters.d.ts +3 -0
  31. package/base/classes.d.ts +1 -0
  32. package/base/fetchers.d.ts +27 -3
  33. package/base/interfaces.d.ts +3 -3
  34. package/base/lib/vendor/classes/base-enterprise.d.ts +5 -2
  35. package/base/lib/vendor/classes/bookable-basket.d.ts +1 -1
  36. package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +8 -7
  37. package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +11 -2
  38. package/base/lib/vendor/classes/enviroment.d.ts +2 -0
  39. package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +26 -69
  40. package/base/lib/vendor/classes/flight-enterprise-search.d.ts +39 -22
  41. package/base/lib/vendor/classes/helpers.d.ts +49 -6
  42. package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +19 -8
  43. package/base/lib/vendor/classes/irl-direction.enum.d.ts +4 -0
  44. package/base/lib/vendor/classes/irl-enterprise-search.d.ts +285 -30
  45. package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +7 -3
  46. package/base/lib/vendor/classes/management-info-and-valid.d.ts +1 -0
  47. package/base/lib/vendor/classes/modal-types.enum.d.ts +4 -0
  48. package/base/lib/vendor/classes/parking-enterprise-search.d.ts +7 -3
  49. package/base/lib/vendor/classes/rail-direction.enum.d.ts +2 -2
  50. package/base/lib/vendor/classes/rail-enterprise-search.d.ts +83 -54
  51. package/base/lib/vendor/classes/rail-index-to-ticket.d.ts +9 -0
  52. package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +1 -0
  53. package/base/lib/vendor/classes/user-favourite.enum.d.ts +3 -0
  54. package/base/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.d.ts +23 -0
  55. package/base/lib/vendor/fetchers/apply-jit-flight-rules.d.ts +21 -0
  56. package/base/lib/vendor/fetchers/basket-fetcher.d.ts +2 -1
  57. package/base/lib/vendor/fetchers/conferma-office.fetcher.d.ts +2 -1
  58. package/base/lib/vendor/fetchers/flight-fare-rules.fetcher.d.ts +21 -0
  59. package/base/lib/vendor/fetchers/flight-quote.fetcher.d.ts +6 -2
  60. package/base/lib/vendor/fetchers/get-conferma-room-images.fetcher.d.ts +21 -0
  61. package/base/lib/vendor/fetchers/get-covid-microsite-token.fetcher.d.ts +21 -0
  62. package/base/lib/vendor/fetchers/get-flight-seat-map-fetcher.d.ts +21 -0
  63. package/base/lib/vendor/fetchers/get-rail-live-departures.fetcher.d.ts +21 -0
  64. package/base/lib/vendor/fetchers/get-user-favourite-searches.fetcher.d.ts +21 -0
  65. package/base/lib/vendor/fetchers/irl-discount-card-fetcher.d.ts +21 -0
  66. package/base/lib/vendor/fetchers/list-fetchable-enterprise.d.ts +1 -1
  67. package/base/lib/vendor/fetchers/object-fetchable-enterprise.d.ts +3 -1
  68. package/base/lib/vendor/fetchers/search-airlines.fetcher.d.ts +2 -1
  69. package/base/lib/vendor/fetchers/search-airports-fetcher.d.ts +2 -1
  70. package/base/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +2 -1
  71. package/base/lib/vendor/fetchers/user-fetcher.d.ts +2 -1
  72. package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +3 -2
  73. package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +4 -1
  74. package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +4 -3
  75. package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +8 -4
  76. package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +15 -4
  77. package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +8 -22
  78. package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +15 -10
  79. package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +4 -2
  80. package/base/lib/vendor/interfaces/Imybookings.service.d.ts +2 -1
  81. package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +3 -2
  82. package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +31 -31
  83. package/base/lib/vendor/interfaces/Isearch.service.d.ts +12 -3
  84. package/base/lib/vendor/interfaces/Iuser.service.d.ts +3 -1
  85. package/base/lib/vendor/interfaces/cab-hire-search-arg.interface.d.ts +10 -0
  86. package/base/lib/vendor/interfaces/car-hire-search-arg.interface.d.ts +42 -0
  87. package/base/lib/vendor/interfaces/enable-fresh-chat-interface.d.ts +7 -0
  88. package/base/lib/vendor/interfaces/eurostar-search-arg.interface.d.ts +6 -0
  89. package/base/lib/vendor/interfaces/flight-filters.interface.d.ts +1 -0
  90. package/base/lib/vendor/interfaces/flight-search-args.interface.d.ts +8 -0
  91. package/base/lib/vendor/interfaces/hotel-recent-search-args.interface.d.ts +4 -0
  92. package/base/lib/vendor/interfaces/irl-search-arg.interface.d.ts +5 -0
  93. package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +11 -5
  94. package/base/lib/vendor/interfaces/rail-recent-search-args.interface.d.ts +16 -11
  95. package/base/lib/vendor/interfaces/rail-selected-ticket.interface.d.ts +4 -9
  96. package/base/lib/vendor/interfaces/summary-interface.d.ts +23 -0
  97. package/base/lib/vendor/interfaces/terms-and-conditions.interface.d.ts +4 -0
  98. package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
  99. package/base/lib/vendor/services/enterprise-basket.service.d.ts +5 -3
  100. package/base/lib/vendor/services/hotel-avallibility.service.d.ts +5 -3
  101. package/base/lib/vendor/services/my-bookings.service.d.ts +6 -3
  102. package/base/lib/vendor/services/search.service.d.ts +46 -10
  103. package/base/lib/vendor/services/user.service.d.ts +9 -4
  104. package/base/lib/vendor/types/graphql.types.d.ts +982 -1051
  105. package/base/lib/vendor/types/types.d.ts +187 -14
  106. package/base/lib/vendor/updaters/cancel-booking-updater.d.ts +20 -0
  107. package/base/lib/vendor/updaters/confirm-messages-updater.d.ts +19 -0
  108. package/base/lib/vendor/updaters/remove-favourite-search-updater.d.ts +19 -0
  109. package/base/lib/vendor/updaters/save-favourite-search-updater.d.ts +20 -0
  110. package/base/sabstravtech-obtservices-base.metadata.json +1 -1
  111. package/base/updaters.d.ts +4 -0
  112. package/bundles/sabstravtech-obtservices-angular.umd.js +763 -158
  113. package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
  114. package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
  115. package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
  116. package/bundles/sabstravtech-obtservices-base.umd.js +8805 -7342
  117. package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
  118. package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
  119. package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
  120. package/esm2015/angular/components/basket-panel.js +9 -5
  121. package/esm2015/angular/components/with-component.js +7 -4
  122. package/esm2015/angular/fetchers.js +18 -13
  123. package/esm2015/angular/lib/vendor/classes/helpers.js +21 -4
  124. package/esm2015/angular/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.js +25 -0
  125. package/esm2015/angular/lib/vendor/fetchers/apply-jit-flight-rules.js +25 -0
  126. package/esm2015/angular/lib/vendor/fetchers/basket-fetcher.js +8 -5
  127. package/esm2015/angular/lib/vendor/fetchers/conferma-office.fetcher.js +8 -5
  128. package/esm2015/angular/lib/vendor/fetchers/flight-fare-rules.fetcher.js +25 -0
  129. package/esm2015/angular/lib/vendor/fetchers/flight-quote.fetcher.js +8 -5
  130. package/esm2015/angular/lib/vendor/fetchers/get-conferma-room-images.fetcher.js +25 -0
  131. package/esm2015/angular/lib/vendor/fetchers/get-covid-microsite-token.fetcher.js +25 -0
  132. package/esm2015/angular/lib/vendor/fetchers/get-flight-seat-map-fetcher.js +25 -0
  133. package/esm2015/angular/lib/vendor/fetchers/get-rail-live-departures.fetcher.js +25 -0
  134. package/esm2015/angular/lib/vendor/fetchers/get-user-favourite-searches.fetcher.js +25 -0
  135. package/esm2015/angular/lib/vendor/fetchers/irl-discount-card-fetcher.js +25 -0
  136. package/esm2015/angular/lib/vendor/fetchers/search-airlines-fetcher.js +8 -5
  137. package/esm2015/angular/lib/vendor/fetchers/search-airports-fetcher.js +8 -5
  138. package/esm2015/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.js +8 -5
  139. package/esm2015/angular/lib/vendor/fetchers/user-fetcher.js +8 -5
  140. package/esm2015/angular/lib/vendor/services/my-bookings.service.js +8 -5
  141. package/esm2015/angular/lib/vendor/services/search.service.js +69 -33
  142. package/esm2015/angular/lib/vendor/services/user.service.js +9 -6
  143. package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +1467 -2520
  144. package/esm2015/angular/lib/vendor/updaters/cancel-booking-updater.js +22 -0
  145. package/esm2015/angular/lib/vendor/updaters/confirm-messages-updater.js +22 -0
  146. package/esm2015/angular/lib/vendor/updaters/remove-favourite-search.updater.js +22 -0
  147. package/esm2015/angular/lib/vendor/updaters/save-favourite-search.updater.js +22 -0
  148. package/esm2015/angular/obtservices.module.js +17 -1
  149. package/esm2015/angular/sabstravtech-obtservices-angular.js +15 -10
  150. package/esm2015/angular/updaters.js +4 -1
  151. package/esm2015/base/classes.js +2 -1
  152. package/esm2015/base/fetchers.js +28 -4
  153. package/esm2015/base/interfaces.js +4 -4
  154. package/esm2015/base/lib/vendor/classes/base-enterprise.js +14 -14
  155. package/esm2015/base/lib/vendor/classes/bookable-basket.js +11 -6
  156. package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +76 -103
  157. package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +121 -18
  158. package/esm2015/base/lib/vendor/classes/enviroment.js +3 -1
  159. package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +540 -677
  160. package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +676 -298
  161. package/esm2015/base/lib/vendor/classes/helpers.js +260 -70
  162. package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +289 -123
  163. package/esm2015/base/lib/vendor/classes/irl-direction.enum.js +6 -0
  164. package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +412 -694
  165. package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +98 -5
  166. package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +49 -30
  167. package/esm2015/base/lib/vendor/classes/modal-types.enum.js +5 -1
  168. package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +61 -5
  169. package/esm2015/base/lib/vendor/classes/rail-direction.enum.js +3 -3
  170. package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +1024 -682
  171. package/esm2015/base/lib/vendor/classes/rail-index-to-ticket.js +48 -0
  172. package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +16 -4
  173. package/esm2015/base/lib/vendor/classes/user-favourite.enum.js +4 -1
  174. package/esm2015/base/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.js +22 -0
  175. package/esm2015/base/lib/vendor/fetchers/apply-jit-flight-rules.js +10 -0
  176. package/esm2015/base/lib/vendor/fetchers/basket-fetcher.js +3 -3
  177. package/esm2015/base/lib/vendor/fetchers/conferma-office.fetcher.js +3 -3
  178. package/esm2015/base/lib/vendor/fetchers/flight-fare-rules.fetcher.js +11 -0
  179. package/esm2015/base/lib/vendor/fetchers/flight-quote.fetcher.js +12 -4
  180. package/esm2015/base/lib/vendor/fetchers/get-conferma-room-images.fetcher.js +11 -0
  181. package/esm2015/base/lib/vendor/fetchers/get-covid-microsite-token.fetcher.js +11 -0
  182. package/esm2015/base/lib/vendor/fetchers/get-flight-seat-map-fetcher.js +11 -0
  183. package/esm2015/base/lib/vendor/fetchers/get-rail-live-departures.fetcher.js +11 -0
  184. package/esm2015/base/lib/vendor/fetchers/get-user-favourite-searches.fetcher.js +10 -0
  185. package/esm2015/base/lib/vendor/fetchers/irl-discount-card-fetcher.js +11 -0
  186. package/esm2015/base/lib/vendor/fetchers/list-fetchable-enterprise.js +5 -3
  187. package/esm2015/base/lib/vendor/fetchers/object-fetchable-enterprise.js +4 -3
  188. package/esm2015/base/lib/vendor/fetchers/search-airlines.fetcher.js +3 -3
  189. package/esm2015/base/lib/vendor/fetchers/search-airports-fetcher.js +3 -3
  190. package/esm2015/base/lib/vendor/fetchers/search-conferma-cities.fetcher.js +3 -3
  191. package/esm2015/base/lib/vendor/fetchers/user-fetcher.js +3 -3
  192. package/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +1 -1
  193. package/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +1 -1
  194. package/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +1 -1
  195. package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
  196. package/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +7 -1
  197. package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +1 -1
  198. package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
  199. package/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +1 -1
  200. package/esm2015/base/lib/vendor/interfaces/Imybookings.service.js +1 -1
  201. package/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +1 -1
  202. package/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +1 -1
  203. package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
  204. package/esm2015/base/lib/vendor/interfaces/Iuser.service.js +1 -1
  205. package/esm2015/base/lib/vendor/interfaces/cab-hire-search-arg.interface.js +2 -0
  206. package/esm2015/base/lib/vendor/interfaces/car-hire-search-arg.interface.js +3 -0
  207. package/esm2015/base/lib/vendor/interfaces/enable-fresh-chat-interface.js +3 -0
  208. package/esm2015/base/lib/vendor/interfaces/eurostar-search-arg.interface.js +2 -0
  209. package/esm2015/base/lib/vendor/interfaces/flight-filters.interface.js +1 -1
  210. package/esm2015/base/lib/vendor/interfaces/flight-search-args.interface.js +2 -0
  211. package/esm2015/base/lib/vendor/interfaces/hotel-recent-search-args.interface.js +1 -1
  212. package/esm2015/base/lib/vendor/interfaces/irl-search-arg.interface.js +2 -0
  213. package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
  214. package/esm2015/base/lib/vendor/interfaces/rail-recent-search-args.interface.js +1 -1
  215. package/esm2015/base/lib/vendor/interfaces/rail-selected-ticket.interface.js +1 -1
  216. package/esm2015/base/lib/vendor/interfaces/summary-interface.js +2 -0
  217. package/esm2015/base/lib/vendor/interfaces/terms-and-conditions.interface.js +2 -0
  218. package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
  219. package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +107 -57
  220. package/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +43 -5
  221. package/esm2015/base/lib/vendor/services/my-bookings.service.js +6 -2
  222. package/esm2015/base/lib/vendor/services/search.service.js +110 -46
  223. package/esm2015/base/lib/vendor/services/user.service.js +13 -2
  224. package/esm2015/base/lib/vendor/types/graphql.types.js +35 -28
  225. package/esm2015/base/lib/vendor/types/types.js +35 -2
  226. package/esm2015/base/lib/vendor/updaters/cancel-booking-updater.js +11 -0
  227. package/esm2015/base/lib/vendor/updaters/confirm-messages-updater.js +11 -0
  228. package/esm2015/base/lib/vendor/updaters/remove-favourite-search-updater.js +11 -0
  229. package/esm2015/base/lib/vendor/updaters/save-favourite-search-updater.js +11 -0
  230. package/esm2015/base/updaters.js +5 -1
  231. package/fesm2015/sabstravtech-obtservices-angular.js +1554 -2350
  232. package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
  233. package/fesm2015/sabstravtech-obtservices-base.js +8088 -6752
  234. package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
  235. package/package.json +1 -1
  236. package/base/lib/vendor/interfaces/rail-journey-leg.interface.d.ts +0 -6
  237. package/base/lib/vendor/interfaces/rail-ticket-group.interface.d.ts +0 -26
  238. package/base/lib/vendor/interfaces/rail-ticket-groups.interface.d.ts +0 -4
  239. package/esm2015/base/lib/vendor/interfaces/rail-journey-leg.interface.js +0 -2
  240. package/esm2015/base/lib/vendor/interfaces/rail-ticket-group.interface.js +0 -2
  241. package/esm2015/base/lib/vendor/interfaces/rail-ticket-groups.interface.js +0 -2
@@ -4,34 +4,60 @@ import { map } from 'rxjs/operators';
4
4
  import { BaseEnterpriseSearch } from './base-enterprise';
5
5
  import { IrlClass, ServiceType, IrlJourneyType } from '../types/graphql.types';
6
6
  import { ages } from '../models/traveller.object';
7
- export var IrlSearchCriteria;
8
- (function (IrlSearchCriteria) {
9
- IrlSearchCriteria["Depart"] = "Depart After";
10
- IrlSearchCriteria["Arrive"] = "Arrive Before";
11
- })(IrlSearchCriteria || (IrlSearchCriteria = {}));
7
+ import { SortMethod } from './eurostar-enterprise-search';
8
+ export var SortTypesIrl;
9
+ (function (SortTypesIrl) {
10
+ SortTypesIrl["CheapestFirst"] = "C";
11
+ SortTypesIrl["EarliestFirst"] = "E";
12
+ SortTypesIrl["LatestFirst"] = "L";
13
+ })(SortTypesIrl || (SortTypesIrl = {}));
14
+ export var ClassType;
15
+ (function (ClassType) {
16
+ ClassType["Class_1"] = "1";
17
+ ClassType["Class_2"] = "2";
18
+ // ! these 2 shopuld be removed later
19
+ ClassType["Second_Class"] = "2nd Class";
20
+ ClassType["First_Class"] = "1st Class";
21
+ })(ClassType || (ClassType = {}));
12
22
  export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
13
- constructor(Irlfetcher, searchIrlStationsFetcher, helpers, basketService, storageService, searchService) {
14
- super(storageService);
23
+ constructor(Irlfetcher, irlDiscountCardsFetcher, helpers, basketService, storageService, searchService) {
24
+ super(storageService, helpers);
15
25
  this.Irlfetcher = Irlfetcher;
16
- this.searchIrlStationsFetcher = searchIrlStationsFetcher;
17
- this.helpers = helpers;
26
+ this.irlDiscountCardsFetcher = irlDiscountCardsFetcher;
18
27
  this.basketService = basketService;
19
28
  this.searchService = searchService;
20
29
  this.resultsSessionName = IRLEnterpriseSearch.STORAGE_SESSION_RESULTS;
21
30
  this.multiResultsSessionName = IRLEnterpriseSearch.STORAGE_SESSION_RESULTS;
31
+ this._sortArray = [
32
+ {
33
+ title: 'Price',
34
+ methodRef: SortMethod.sortByPrice,
35
+ icon: 'ico-dollar'
36
+ },
37
+ {
38
+ title: 'Time',
39
+ methodRef: SortMethod.sortByDate,
40
+ icon: 'ico-calendar'
41
+ }
42
+ ];
22
43
  this.searchTypes = [
23
44
  { display: 'Return', value: IrlJourneyType.ReturnJourney },
24
45
  { display: 'One-Way', value: IrlJourneyType.SingleJourney }
25
- // { display: 'Open Return', value: IrlJourneyType.OpenReturnJourney },
26
- // { display: 'Dual Singles', value: IrlJourneyType.DualSingleJourney },
27
46
  ];
28
47
  this.classTypes = [
29
48
  { display: 'Any', value: IrlClass.All },
30
49
  { display: 'Standard', value: IrlClass.Standard },
31
50
  { display: 'First', value: IrlClass.First }
32
51
  ];
33
- this.ageRanges = [{ key: ages.Child, value: 'Child (0-3)' }, { key: ages.Child, value: 'Child (4-5)' }, { key: ages.Child, value: 'Child (6-11)' }, { key: ages.Youth, value: 'Youth (12-14)' }, { key: ages.Youth, value: 'Youth (15-25)' }, { key: ages.Adult, value: 'Adult (26-59)' }, { key: ages.Youth, value: 'Senior (60+)' }];
34
- this.irlCriteria = [IrlSearchCriteria.Depart, IrlSearchCriteria.Arrive];
52
+ this.ageRanges = [
53
+ { key: ages.Child, value: 'Child (0-3)' },
54
+ { key: ages.Child, value: 'Child (4-5)' },
55
+ { key: ages.Child, value: 'Child (6-11)' },
56
+ { key: ages.Youth, value: 'Youth (12-14)' },
57
+ { key: ages.Youth, value: 'Youth (15-25)' },
58
+ { key: ages.Adult, value: 'Adult (26-59)' },
59
+ { key: ages.Youth, value: 'Senior (60+)' }
60
+ ];
35
61
  this.travelCards = [
36
62
  { display: 'Young persons railcard', value: 'YNG' },
37
63
  { display: 'Disability railcard', value: 'DIS' },
@@ -58,16 +84,20 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
58
84
  this._arrivalLocationId = null;
59
85
  this._adults = 0;
60
86
  this._children = 0;
87
+ this._cheapestStandard = null;
88
+ this._cheapestFirst = null;
61
89
  this._returnDepartureDateTime = null;
62
90
  this._ageRange = null;
91
+ this._priceDir = false;
92
+ this._dateDir = false;
93
+ this._irlDiscountCardsArray = [];
63
94
  // !date and time is handled differently for LU
64
95
  this._outbound_date = null;
65
96
  this._outbound_time = null;
66
97
  this._return_date = null;
67
98
  this._return_time = null;
68
- this._cheapestStandard = null;
69
- this._cheapestFirst = null;
70
- this._irlClass = null;
99
+ this._offline = false;
100
+ this._irlClass = IrlClass.All;
71
101
  this._journeytype = IrlJourneyType.SingleJourney;
72
102
  const data = storageService.getSessionItem(IRLEnterpriseSearch.STORAGE_SESSION_PARAMS) || {
73
103
  query: {},
@@ -97,54 +127,18 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
97
127
  this._cheapestResultPrice = this.updateLowestPrice(results);
98
128
  this.results.next(results || []);
99
129
  }
100
- // get chosenTotalPrice(): number {
101
- // if (this._chosenOutboundTicket) {
102
- // if (this._chosenInboundTicket) {
103
- // // now check if they are returns or dual
104
- // if (
105
- // this._chosenOutboundTicket.singleOrReturn === 'Return' &&
106
- // this._chosenInboundTicket.singleOrReturn === 'Return'
107
- // ) {
108
- // // they should both have the same price
109
- // return this._chosenOutboundTicket.price;
110
- // }
111
- // return (
112
- // this._chosenOutboundTicket.price + this._chosenInboundTicket.price
113
- // );
114
- // }
115
- // return this._chosenOutboundTicket.price;
116
- // }
117
- // return 0;
118
- // }
119
- // get chosenTickets(): any {
120
- // return {
121
- // Outbound: this._chosenOutboundTicket,
122
- // Inbound: this._chosenInboundTicket
123
- // };
124
- // }
125
- // get chosenOutboundJourney(): RecursivePartial<RailJourneyOption> {
126
- // return this._chosenOutboundJourney;
127
- // }
128
- // get chosenInboundJourney(): RecursivePartial<RailJourneyOption> {
129
- // return this._chosenInboundJourney;
130
- // }
131
- // get openReturn(): boolean {
132
- // return this.tempParams.openReturn;
133
- // }
134
- // set openReturn(newVal: boolean) {
135
- // this.tempParams.openReturn = newVal;
136
- // if (newVal) {
137
- // this.tempParams.chosenSearchType = IrlJourneyType.OpenReturnJourney;
138
- // }
139
- // this._isValid();
140
- // }
141
- // get chosenSearchType(): IrlJourneyType {
142
- // return this.tempParams.chosenSearchType;
143
- // }
144
- // set chosenSearchType(newType: IrlJourneyType) {
145
- // this.tempParams.chosenSearchType = newType;
146
- // this._isValid();
147
- // }
130
+ get outboundJourneyOptions() {
131
+ return this._outboundJourneyOptions;
132
+ }
133
+ set outboundJourneyOptions(data) {
134
+ this._outboundJourneyOptions = data;
135
+ }
136
+ get outboundTicket() {
137
+ return this._outboundTicket;
138
+ }
139
+ set outboundTicket(data) {
140
+ this._outboundTicket = data;
141
+ }
148
142
  get noOfAdults() {
149
143
  return this.tempParams.adults;
150
144
  }
@@ -181,6 +175,9 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
181
175
  if ((_a = tt === null || tt === void 0 ? void 0 : tt.railstation) === null || _a === void 0 ? void 0 : _a.id) {
182
176
  this._travellingFrom = tt.railstation.id;
183
177
  this.supplier = tt.railstation.supplier;
178
+ this.getIrlDiscountCards().subscribe((data) => {
179
+ this.irlDiscountCardsArray = data;
180
+ });
184
181
  }
185
182
  this._isValid();
186
183
  }
@@ -206,11 +203,14 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
206
203
  return this._outboundDepartureDateTime;
207
204
  }
208
205
  set outboundDepartureDateTime(newDateTime) {
209
- this._outboundDepartureDateTime = newDateTime;
210
- this._outbound_date = this.helpers.momentToNgDate(newDateTime);
211
- this._outbound_time = moment(newDateTime).format('HHmm')
212
- ? moment(newDateTime).format('HHmm')
213
- : '0700';
206
+ this.tempParams.outboundDepartureDateTime = newDateTime;
207
+ if (newDateTime && newDateTime.isValid()) {
208
+ this._outboundDepartureDateTime = newDateTime;
209
+ this._outbound_date = this.helpers.momentToNgDate(newDateTime);
210
+ this._outbound_time = moment(newDateTime).format('HHmm')
211
+ ? moment(newDateTime).format('HHmm')
212
+ : '0700';
213
+ }
214
214
  this._updateOutboundDateTime();
215
215
  }
216
216
  get departureLocationId() {
@@ -237,15 +237,24 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
237
237
  set children(data) {
238
238
  this._children = data;
239
239
  }
240
+ get cheapestStandard() {
241
+ return this._cheapestStandard;
242
+ }
243
+ get cheapestFirst() {
244
+ return this._cheapestFirst;
245
+ }
240
246
  get returnDepartureDateTime() {
241
247
  return this._returnDepartureDateTime;
242
248
  }
243
249
  set returnDepartureDateTime(newDateTime) {
244
- this._returnDepartureDateTime = newDateTime;
245
- this._return_date = this.helpers.momentToNgDate(newDateTime);
246
- this._return_time = moment(newDateTime).format('HHmm')
247
- ? moment(newDateTime).format('HHmm')
248
- : '0700';
250
+ this.tempParams.returnDepartureDateTime = newDateTime;
251
+ if (newDateTime && newDateTime.isValid()) {
252
+ this._returnDepartureDateTime = newDateTime;
253
+ this._return_date = this.helpers.momentToNgDate(newDateTime);
254
+ this._return_time = moment(newDateTime).format('HHmm')
255
+ ? moment(newDateTime).format('HHmm')
256
+ : '1600';
257
+ }
249
258
  this._updateReturnDateTime();
250
259
  }
251
260
  get ageRange() {
@@ -254,9 +263,18 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
254
263
  set ageRange(data) {
255
264
  this._ageRange = data;
256
265
  }
257
- // get chosenRailClass(): RailClass {
258
- // return this.tempParams.chosenSearchClass;
259
- // }
266
+ get priceDir() {
267
+ return this._priceDir;
268
+ }
269
+ set priceDir(data) {
270
+ this._priceDir = data;
271
+ }
272
+ get dateDir() {
273
+ return this._dateDir;
274
+ }
275
+ set dateDir(data) {
276
+ this._dateDir = data;
277
+ }
260
278
  get chosenSearchClass() {
261
279
  return this.tempParams.class;
262
280
  }
@@ -264,6 +282,19 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
264
282
  this.tempParams.class = classR;
265
283
  this._isValid();
266
284
  }
285
+ get discountCard() {
286
+ return this.tempParams.irlDiscountCards;
287
+ }
288
+ set discountCard(data) {
289
+ this.tempParams.irlDiscountCards = data;
290
+ this._isValid();
291
+ }
292
+ get irlDiscountCardsArray() {
293
+ return this._irlDiscountCardsArray;
294
+ }
295
+ set irlDiscountCardsArray(array) {
296
+ this._irlDiscountCardsArray = array;
297
+ }
267
298
  get outBoundDateTime() {
268
299
  return this.tempParams.outboundDepartureDateTime;
269
300
  }
@@ -287,14 +318,6 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
287
318
  }
288
319
  this._isValid();
289
320
  }
290
- get outboundCriteria() {
291
- return this.tempParams.outboundCriteria;
292
- }
293
- set outboundCriteria(newCrit) {
294
- // console.warn(`+++ Setting New Criteria: ${newCrit} +++`);
295
- this.tempParams.outboundCriteria = newCrit;
296
- this._isValid();
297
- }
298
321
  get inBoundDateTime() {
299
322
  return this.tempParams.returnDepartureDateTime;
300
323
  }
@@ -336,38 +359,6 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
336
359
  this._return_time = value;
337
360
  this._updateReturnDateTime();
338
361
  }
339
- get returnCriteria() {
340
- return this.tempParams.returnCriteria;
341
- }
342
- set returnCriteria(newCrit) {
343
- this.tempParams.returnCriteria = newCrit;
344
- this._isValid();
345
- }
346
- // set railCards(newRailCards: string[]) {
347
- // this.tempParams.railCards = newRailCards;
348
- // this._isValid();
349
- // }
350
- // get carnetTicket(): boolean {
351
- // return this.tempParams.carnetTicket;
352
- // }
353
- // set carnetTicket(newCarnet: boolean) {
354
- // this.tempParams.carnetTicket = newCarnet;
355
- // this._isValid();
356
- // }
357
- // get disableAutoDiscounts(): boolean {
358
- // return this.tempParams.disableAutoDiscounts;
359
- // }
360
- // set disableAutoDiscounts(newDis: boolean) {
361
- // this.tempParams.disableAutoDiscounts = newDis;
362
- // this._isValid();
363
- // }
364
- // get prioritiseByPrice(): boolean {
365
- // return this.tempParams.prioritiseByPrice;
366
- // }
367
- // set prioritiseByPrice(newPriority: boolean) {
368
- // this.tempParams.prioritiseByPrice = newPriority;
369
- // this._isValid();
370
- // }
371
362
  get timeArray() {
372
363
  this._timeArray =
373
364
  this._timeArray ||
@@ -388,11 +379,11 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
388
379
  });
389
380
  return this._timeArray;
390
381
  }
391
- get cheapestStandard() {
392
- return this._cheapestStandard;
382
+ get offline() {
383
+ return this._offline;
393
384
  }
394
- get cheapestFirst() {
395
- return this._cheapestFirst;
385
+ set offline(data) {
386
+ this._offline = data;
396
387
  }
397
388
  get irlClass() {
398
389
  return this._irlClass;
@@ -406,6 +397,22 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
406
397
  set journeyType(data) {
407
398
  this._journeytype = data;
408
399
  }
400
+ get sortDropdownValues() {
401
+ return this._sortArray;
402
+ }
403
+ processResults(results) {
404
+ var _a;
405
+ (_a = results[0]) === null || _a === void 0 ? void 0 : _a.outbound.forEach((item) => {
406
+ item.providers[0].ticketOptions.map((ticket, index) => {
407
+ ticket.selected = false;
408
+ ticket.ShowDetail = false;
409
+ ticket.uid = `${ticket.identifiers.journeyIdentifier}_${index + 1}`;
410
+ return ticket;
411
+ });
412
+ });
413
+ Object.freeze(results);
414
+ return results;
415
+ }
409
416
  resetQuery() {
410
417
  this.updateTempParams(this.searchService.makeIrlQuery());
411
418
  this._isValid();
@@ -451,19 +458,49 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
451
458
  startSearch() {
452
459
  this.results.next([]);
453
460
  if (this.isValid.value) {
461
+ const query = this.getSearchQuery();
454
462
  this._originalUserSearch = Object.freeze(Object.assign({}, this.tempParams));
455
463
  this.storageService.setSessionItem(IRLEnterpriseSearch.STORAGE_SESSION_PARAMS, {
456
464
  tempParams: this.tempParams,
457
465
  originalUserSearch: this.originalUserSearch
458
466
  });
459
- return this._startSearch(this.Irlfetcher.fetchList(this.getSearchQuery()).pipe(map(result => result)));
467
+ this.searchService.saveRecentSearch(this.getRecentSearchQuery(query));
468
+ return this._startSearch(this.Irlfetcher.fetchList(query).pipe(map((result) => result)));
460
469
  }
461
470
  else {
462
471
  return Promise.resolve(false);
463
472
  }
464
473
  }
474
+ getRecentSearchQuery(query) {
475
+ const recentSearchQuery = this.updateSerchQuery(query);
476
+ return {
477
+ serviceType: ServiceType.InternationalRail,
478
+ searchArgs: recentSearchQuery,
479
+ travelDate: this.outBoundDateTime.format(),
480
+ travellers: this.helpers.getTravellersId(this.travellers)
481
+ };
482
+ }
483
+ updateSerchQuery(query) {
484
+ const searchQuery = query;
485
+ if (this.travellingFrom) {
486
+ searchQuery.travellingFrom = this.travellingFrom;
487
+ }
488
+ if (this.travellingTo) {
489
+ searchQuery.travellingTo = this.travellingTo;
490
+ }
491
+ return searchQuery;
492
+ }
465
493
  startRecentSearch(recentSearch) {
466
- this.startSearch();
494
+ this.journeyType = recentSearch.searchArgs.journeyType;
495
+ this.irlClass = recentSearch.searchArgs.class;
496
+ this.travellingTo = recentSearch.searchArgs.travellingTo;
497
+ this.travellingFrom = recentSearch.searchArgs.travellingFrom;
498
+ // get outBoundDateTime, inBoundDateTime
499
+ this.outBoundDateTime = moment(recentSearch.searchArgs.outboundDepartureDateTime);
500
+ if (recentSearch.searchArgs.journeyType === IrlJourneyType.ReturnJourney) {
501
+ this.inBoundDateTime = moment(recentSearch.searchArgs.returnDepartureDateTime);
502
+ }
503
+ this.searchService.startSearches();
467
504
  }
468
505
  _updateOutboundDateTime() {
469
506
  if (this._outbound_date && this._outbound_time) {
@@ -481,12 +518,20 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
481
518
  }
482
519
  getSearchQuery() {
483
520
  // this.travellers = travellers;
484
- this.noOfAdults = this.travellers.filter((traveller) => traveller.ageType === ages.Adult || traveller.ageType === ages.Youth || traveller.ageType === ages.Senior).length;
521
+ this.noOfAdults = this.travellers.filter((traveller) => traveller.ageType === ages.Adult ||
522
+ traveller.ageType === ages.Youth ||
523
+ traveller.ageType === ages.Senior).length;
485
524
  this.noOfChildren = this.travellers.filter((traveller) => traveller.ageType === ages.Child).length;
525
+ if (!this.supplier && this.travellingFrom.name) {
526
+ this.supplier = this.travellingFrom.railstation.supplier;
527
+ this.getIrlDiscountCards().subscribe((data) => {
528
+ this.irlDiscountCardsArray = data;
529
+ });
530
+ }
486
531
  const query = {
487
532
  supplier: this.supplier,
488
533
  countryCode: 'GB',
489
- // journeyType: this.journeyType, // IRLJourneyType!
534
+ irlDiscountCards: this.discountCard ? this.discountCard.id : null,
490
535
  class: this.irlClass,
491
536
  outboundDepartureDateTime: this.tempParams.outboundDepartureDateTime,
492
537
  departureLocationId: this._travellingFrom,
@@ -494,35 +539,11 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
494
539
  adults: this.tempParams.adults,
495
540
  children: this.tempParams.children,
496
541
  returnDepartureDateTime: this.tempParams.returnDepartureDateTime,
497
- journeyType: this.journeyType,
542
+ journeyType: this.journeyType
498
543
  };
499
544
  if (this.tempParams.children === 0) {
500
545
  query.children = null;
501
546
  }
502
- // switch (this.tempParams.outboundCriteria) {
503
- // case IrlSearchCriteria.Depart:
504
- // query.outboundDepartureDateTime = null;
505
- // break;
506
- // case IrlSearchCriteria.Arrive:
507
- // query.outboundDepartureDateTime = null;
508
- // break;
509
- // default:
510
- // console.warn(
511
- // `+++ Unknown Criteria: ${this.tempParams.outboundCriteria} +++`
512
- // );
513
- // }
514
- // switch (this.tempParams.returnCriteria) {
515
- // case IrlSearchCriteria.Depart:
516
- // query.returnDepartureDateTime = null;
517
- // break;
518
- // case IrlSearchCriteria.Arrive:
519
- // query.returnDepartureDateTime = null;
520
- // break;
521
- // default:
522
- // console.warn(
523
- // `+++ Unknown Criteria: ${this.tempParams.returnCriteria} +++`
524
- // );
525
- // }
526
547
  switch (this.tempParams.journeyType) {
527
548
  case IrlJourneyType.SingleJourney:
528
549
  query.returnDepartureDateTime = null;
@@ -530,163 +551,6 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
530
551
  }
531
552
  return this.helpers.removeNulls(query);
532
553
  }
533
- // createTicketGroups(results: IRLJourneyOptions[]): RailTicketGroups {
534
- // let tickets: RailTicketGroups = {};
535
- // let ticketId = '';
536
- // this._canCombine = {};
537
- // let ticketGroupsOutbound = this.setTicketsGroups(results[0].outbound);
538
- // let ticketGroupsReturn = this.setTicketsGroups(results[0].return);
539
- // ticketGroupsOutbound = this.sortTicketPrices(ticketGroupsOutbound);
540
- // ticketGroupsReturn = this.sortTicketPrices(ticketGroupsReturn);
541
- // Object.keys(ticketGroupsOutbound).map((key) => {
542
- // ticketGroupsOutbound[key].map((tkt: RailTicketOption) => {
543
- // ticketId = `${tkt.type}${tkt.singleOrReturn}`;
544
- // const identifier = tkt.identifiers.journeyIdentifier;
545
- // const identifierObj: RailResultIndifiers = {};
546
- // identifierObj[identifier] = {
547
- // price: tkt.price,
548
- // isChild: false,
549
- // fareIdentifier: tkt.identifiers.fareIdentifier
550
- // };
551
- // if (tickets[key]) {
552
- // this.updateCanCombine(tkt);
553
- // identifierObj[tkt.identifiers.journeyIdentifier].isChild = false;
554
- // if (tickets[tkt.type].header.price === tkt.price) {
555
- // tickets[tkt.type].resultIndifiers.push(identifier);
556
- // tickets[tkt.type].resultIndifiersPrices = {
557
- // ...tickets[tkt.type].resultIndifiersPrices,
558
- // ...identifierObj
559
- // };
560
- // } else if (tkt.price) {
561
- // identifierObj[identifier].isChild = true;
562
- // const childTicket = {
563
- // header: tkt,
564
- // children: [],
565
- // open: false,
566
- // direction: RailDirection.Outbound,
567
- // resultIndifiers: [identifier],
568
- // resultIndifiersPrices: identifierObj,
569
- // child: true,
570
- // ticketId,
571
- // selectedIndicies: [],
572
- // disabledIndicies: []
573
- // } as RailTicketGroup;
574
- // tickets[tkt.type].children.push(childTicket);
575
- // }
576
- // } else {
577
- // this._canCombine[tkt.type] = {};
578
- // this.updateCanCombine(tkt);
579
- // tickets[tkt.type] = {
580
- // header: tkt,
581
- // children: [],
582
- // open: false,
583
- // direction: RailDirection.Outbound,
584
- // resultIndifiers: [identifier],
585
- // resultIndifiersPrices: identifierObj,
586
- // child: false,
587
- // ticketId,
588
- // selectedIndicies: [],
589
- // disabledIndicies: []
590
- // } as RailTicketGroup;
591
- // }
592
- // });
593
- // });
594
- // Object.keys(ticketGroupsReturn).map((key) => {
595
- // ticketGroupsReturn[key].map((tkt: RailTicketOption) => {
596
- // ticketId = `${tkt.type}${tkt.singleOrReturn}`;
597
- // const identifier = tkt.identifiers.journeyIdentifier;
598
- // const identifierObj: RailResultIndifiers = {};
599
- // identifierObj[identifier] = {
600
- // price: tkt.price,
601
- // isChild: true,
602
- // fareIdentifier: tkt.identifiers.fareIdentifier
603
- // };
604
- // if (
605
- // tickets[tkt.type] &&
606
- // tkt.price &&
607
- // tkt.price !== tickets[tkt.type].header.price
608
- // ) {
609
- // this.updateCanCombine(tkt);
610
- // identifierObj[identifier].isChild = true;
611
- // const childTicket = {
612
- // header: tkt,
613
- // children: [],
614
- // open: false,
615
- // direction: RailDirection.Inbound,
616
- // resultIndifiers: [identifier],
617
- // resultIndifiersPrices: identifierObj,
618
- // child: true,
619
- // ticketId,
620
- // selectedIndicies: [],
621
- // disabledIndicies: []
622
- // } as any;
623
- // tickets[tkt.type].children.push(childTicket);
624
- // } else if (!tickets[tkt.type]) {
625
- // this.updateCanCombine(tkt);
626
- // tickets[tkt.type] = {
627
- // header: tkt,
628
- // children: [],
629
- // open: false,
630
- // direction: RailDirection.Inbound,
631
- // resultIndifiers: [identifier],
632
- // resultIndifiersPrices: identifierObj,
633
- // child: false,
634
- // ticketId,
635
- // selectedIndicies: [],
636
- // disabledIndicies: []
637
- // } as any;
638
- // } else if (!tkt.price || tkt.price === tickets[tkt.type].header.price) {
639
- // this.updateCanCombine(tkt);
640
- // tickets[tkt.type].resultIndifiers.push(identifier);
641
- // identifierObj[identifier].isChild = false;
642
- // tickets[tkt.type].resultIndifiersPrices = {
643
- // ...tickets[tkt.type].resultIndifiersPrices,
644
- // ...identifierObj
645
- // };
646
- // }
647
- // });
648
- // });
649
- // let combineTickets = { ...tickets };
650
- // tickets = this.combineChildTickets(combineTickets);
651
- // // console.log('groups: ', tickets);
652
- // // console.log('Can Combine: ', this._canCombine);
653
- // return tickets;
654
- // }
655
- combineChildTickets(tickets) {
656
- const values = Object.values(tickets);
657
- for (let i = 0; i < values.length; i++) {
658
- const childObject = {};
659
- for (let j = 0; j < values[i].children.length; j++) {
660
- const child = values[i].children[j];
661
- const fareIdentifier = child.header.identifiers.fareIdentifier;
662
- if (childObject[fareIdentifier]) {
663
- childObject[fareIdentifier].resultIndifiers.push(child.resultIndifiers[0]);
664
- childObject[fareIdentifier].resultIndifiersPrices = Object.assign(Object.assign({}, childObject[fareIdentifier].resultIndifiersPrices), child.resultIndifiersPrices);
665
- }
666
- else {
667
- childObject[fareIdentifier] = child;
668
- }
669
- }
670
- // console.log(childObject);
671
- // console.log(values[i]['header']['type']);
672
- tickets[values[i].header.type].children = Object.values(childObject);
673
- }
674
- // tickets = this.sortTicketChildrenPrices(tickets);
675
- return tickets;
676
- }
677
- setTicketsGroups(results) {
678
- let ticketGroups = {};
679
- results.forEach((out) => {
680
- out.providers.forEach((prov) => {
681
- prov.ticketOptions.forEach((tkt) => {
682
- ticketGroups[tkt.type]
683
- ? ticketGroups[tkt.type].push(tkt)
684
- : (ticketGroups[tkt.type] = [tkt]);
685
- });
686
- });
687
- });
688
- return ticketGroups;
689
- }
690
554
  updateFromPreviousSearches(previousItems) { }
691
555
  updateCanCombine(tkt) {
692
556
  (tkt.identifiers.allowedWith || []).forEach((allowed) => {
@@ -700,211 +564,12 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
700
564
  }
701
565
  });
702
566
  }
703
- // toggleTicketSelect(
704
- // ticket: IrlTicketGroup,
705
- // way: 'departs' | 'returns',
706
- // timeSlotId: string,
707
- // ticketId: string,
708
- // fareIdentifier: string,
709
- // ticketsGroups: IrlTicketGroups
710
- // ): IrlTicketGroups {
711
- // if (!ticket) {
712
- // return;
713
- // }
714
- // const keys = Object.keys(ticketsGroups);
715
- // let selectedTicket = null;
716
- // let departsTicket: IrlTicketOption[] = [];
717
- // let returnTicket: IrlTicketOption[] = [];
718
- // let isUnselected = false;
719
- // keys.forEach((key) => {
720
- // let group = ticketsGroups[key] as RailTicketGroup;
721
- // if (
722
- // group.ticketId === ticketId &&
723
- // group.selectedIndicies.includes(timeSlotId)
724
- // ) {
725
- // if (way === 'departs') {
726
- // group.selectedIndicies = [];
727
- // departsTicket = [];
728
- // returnTicket = [];
729
- // this._chosenInboundTicket = null;
730
- // this._chosenInboundJourney = null;
731
- // group.children.forEach((child) => {
732
- // child.selectedIndicies = [];
733
- // });
734
- // } else {
735
- // group.selectedIndicies = group.selectedIndicies.filter(
736
- // (Indicies) => Indicies !== timeSlotId
737
- // );
738
- // returnTicket = returnTicket.filter(
739
- // (Indicies) => Indicies !== group.header
740
- // );
741
- // }
742
- // } else {
743
- // if (
744
- // group.ticketId === ticketId &&
745
- // group.header.identifiers.fareIdentifier === fareIdentifier &&
746
- // way === 'departs'
747
- // ) {
748
- // group = this.clearUnneededTickets(way, group, timeSlotId);
749
- // group.selectedIndicies.push(timeSlotId);
750
- // way === 'departs'
751
- // ? departsTicket.push(group.header)
752
- // : returnTicket.push(group.header);
753
- // selectedTicket = group.header;
754
- // } else {
755
- // // may have to modify this for dual singles
756
- // if (way === 'departs') {
757
- // group.selectedIndicies = [];
758
- // } else {
759
- // selectedTicket = group.header;
760
- // }
761
- // }
762
- // group.children.forEach((child) => {
763
- // if (child.selectedIndicies.includes(timeSlotId)) {
764
- // if (way === 'departs') {
765
- // child.selectedIndicies = [];
766
- // departsTicket = [];
767
- // returnTicket = [];
768
- // this._chosenInboundTicket = null;
769
- // this._chosenInboundJourney = null;
770
- // isUnselected = true;
771
- // } else {
772
- // child.selectedIndicies = child.selectedIndicies.filter(
773
- // (Indicies) => Indicies !== timeSlotId
774
- // );
775
- // returnTicket = returnTicket.filter(
776
- // (Indicies) => Indicies !== group.header
777
- // );
778
- // }
779
- // } else {
780
- // if (
781
- // child.ticketId === ticketId &&
782
- // child.header.identifiers.fareIdentifier === fareIdentifier
783
- // ) {
784
- // if (
785
- // (way === 'departs' &&
786
- // child.direction !== RailDirection.Inbound) ||
787
- // (way !== 'departs' && child.direction === RailDirection.Inbound)
788
- // ) {
789
- // child = this.clearUnneededTickets(way, child, timeSlotId);
790
- // child.selectedIndicies.push(timeSlotId);
791
- // way === 'departs'
792
- // ? departsTicket.push(child.header)
793
- // : returnTicket.push(child.header);
794
- // selectedTicket = child.header;
795
- // } else if (isUnselected) {
796
- // child.selectedIndicies = [];
797
- // }
798
- // } else {
799
- // child.selectedIndicies = [];
800
- // }
801
- // }
802
- // });
803
- // }
804
- // });
805
- // // now we need to mark tickets as disabled if they are returns that do not match the selected return
806
- // // or on overlapping times
807
- // if (way === 'departs') {
808
- // this._chosenOutboundTicket = this.helpers.clone(selectedTicket);
809
- // // now go over the full results and find the matching timeslot
810
- // departsTicket.length
811
- // ? (this._chosenOutboundJourney = this.results.value[0].outbound.find(
812
- // (out: RailJourneyOption) => {
813
- // return out.identifiers.journeyIdentifier === timeSlotId;
814
- // }
815
- // ))
816
- // : (this._chosenOutboundJourney = null);
817
- // if (
818
- // this._chosenInboundTicket &&
819
- // this._chosenOutboundTicket.singleOrReturn === 'Return' &&
820
- // this._chosenOutboundTicket.identifiers.fareIdentifier !==
821
- // this._chosenInboundTicket.identifiers.fareIdentifier
822
- // ) {
823
- // console.warn('+++ Cannot combine fares, clearing inbound... +++');
824
- // this._chosenInboundTicket = null;
825
- // this._chosenInboundJourney = null;
826
- // }
827
- // } else if (way === 'returns') {
828
- // this._chosenInboundTicket = this.helpers.clone(selectedTicket);
829
- // this._chosenInboundTicket
830
- // ? (this._chosenInboundJourney = this.results.value[0].return.find(
831
- // (inT: RailJourneyOption) => {
832
- // return inT.identifiers.journeyIdentifier === timeSlotId;
833
- // }
834
- // ))
835
- // : (this._chosenInboundJourney = null);
836
- // }
837
- // console.log(this.chosenOutboundJourney);
838
- // console.log(this._chosenInboundJourney);
839
- // return ticketsGroups;
840
- // }
841
- /**
842
- * @description - determine if a fare can be combined with what we currently have selected
843
- */
844
- // canCombine(journeyIdentifier: string, fareIdentifier: string): boolean {
845
- // // may have to modify this for dual singles later on
846
- // if (
847
- // this._chosenOutboundTicket &&
848
- // this._chosenOutboundTicket.singleOrReturn === 'Return' &&
849
- // Number(journeyIdentifier) > 5
850
- // ) {
851
- // // greater than 5 only as we are not going to restrict outbounds
852
- // if (
853
- // this._canCombine[this._chosenOutboundTicket.type][
854
- // Number(journeyIdentifier)
855
- // ]?.includes(fareIdentifier) &&
856
- // this._chosenOutboundTicket.identifiers.fareIdentifier === fareIdentifier
857
- // ) {
858
- // return true;
859
- // }
860
- // return false;
861
- // }
862
- // return false;
863
- // }
864
- clearUnneededTickets(way, group, timeSlotId) {
865
- if (way === 'returns') {
866
- group.selectedIndicies = group.selectedIndicies.filter((indicie) => {
867
- return Number(indicie) <= 5 || indicie === timeSlotId;
868
- });
869
- }
870
- else {
871
- group.selectedIndicies = group.selectedIndicies.filter((indicie) => {
872
- return Number(indicie) > 5 || indicie === timeSlotId;
873
- });
874
- }
875
- return group;
876
- }
877
- // getRailStation(
878
- // code: string,
879
- // isLoading: BehaviorSubject<boolean>
880
- // ): Observable<IrlStation> {
881
- // if (code.length === 3) {
882
- // isLoading?.next(true);
883
- // return this.getRailStationFetcher.fetchList({ code }).pipe(
884
- // tap(() => isLoading?.next(false)),
885
- // take(1)
886
- // );
887
- // } else {
888
- // return of();
889
- // }
890
- // }
891
- // getSelectedirlTicketOption(
892
- // irlJourneyOption: IrlJourneyOption,
893
- // irlTicketGroup: IrlTicketGroup,
894
- // providerIndex: number
895
- // ): IrlTicketOption {
896
- // return irlJourneyOption.providers[providerIndex].ticketOptions.find(
897
- // (ticketOption) =>
898
- // ticketOption.type === irlTicketGroup.header.type &&
899
- // ticketOption.price === irlTicketGroup.header.price
900
- // );
901
- // }
902
- getLegsFromRailJourneyOption(railJourneyOption) {
567
+ getLegsFromIrlJourneyOption(railJourneyOption) {
903
568
  let legs = [];
904
569
  if (railJourneyOption === null || railJourneyOption === void 0 ? void 0 : railJourneyOption.segments.length) {
905
570
  legs = railJourneyOption.segments.map((segment) => {
906
571
  return {
907
- operator: segment.operator,
572
+ operator: segment.operator || railJourneyOption.providers[0].providerId,
908
573
  departureDateTime: segment.departDateTime,
909
574
  departureStationName: segment.depart,
910
575
  arrivalDateTime: segment.arriveDateTime,
@@ -914,195 +579,138 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
914
579
  }
915
580
  return legs;
916
581
  }
917
- addSingleJourneyToBasket(serviceId, railQuery, irlJourneyOption) {
582
+ getSelectedIrlTicketOption(irlJourneyOption, irlTicketOption, providerIndex) {
583
+ return irlJourneyOption.providers[providerIndex].ticketOptions.find((ticketOption) => ticketOption.type === irlTicketOption.type &&
584
+ (ticketOption.price === irlTicketOption.price ||
585
+ ticketOption.identifiers.fareIdentifier ===
586
+ irlTicketOption.identifiers.fareIdentifier));
587
+ }
588
+ addSingleJourneyToBasket(serviceId, irlQuery, outbound, irlJourneyOption) {
589
+ return __awaiter(this, void 0, void 0, function* () {
590
+ // console.log(serviceId,railQuery,irlJourneyOption)
591
+ // // if (irlJourneyOption.unsellable) {
592
+ // // return Promise.resolve(false);
593
+ // // }
594
+ const intBasket = yield this.basketService.getDefaultBasket();
595
+ const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
596
+ if (basket) {
597
+ const selectedIrlTicketOption = this.getSelectedIrlTicketOption(irlJourneyOption, outbound, 0);
598
+ const legs = this.getLegsFromIrlJourneyOption(irlJourneyOption);
599
+ const termsAndConditions = this.getTermsAndCond(irlJourneyOption);
600
+ // selectedIrlTicketOption.identifiers.provider;
601
+ const basketItem = {
602
+ basket: basket.id,
603
+ service: serviceId,
604
+ detail: {
605
+ outwardDetail: {
606
+ arrivalDateTime: irlJourneyOption.arriveDateTime,
607
+ arrivalStationName: irlJourneyOption.to,
608
+ arrivalStationCode: irlJourneyOption.toCode,
609
+ departureDateTime: irlJourneyOption.departDateTime,
610
+ departureStationName: irlJourneyOption.from,
611
+ departureStationCode: irlJourneyOption.fromCode,
612
+ supplierTickets: [
613
+ {
614
+ supplierName: irlJourneyOption.providers[0].name,
615
+ ticketDescription: selectedIrlTicketOption.type,
616
+ price: selectedIrlTicketOption.price,
617
+ legs
618
+ }
619
+ ]
620
+ },
621
+ transactionIdentifier: irlJourneyOption.identifiers.transactionIdentifier,
622
+ outbound: {
623
+ fareIdentifiers: [
624
+ selectedIrlTicketOption.identifiers.fareIdentifier
625
+ ],
626
+ journeyIdentifier: selectedIrlTicketOption.identifiers.journeyIdentifier
627
+ },
628
+ supplier: irlJourneyOption.providers[0].providerId,
629
+ termsAndCond: termsAndConditions
630
+ },
631
+ adults: irlQuery.adults,
632
+ price: selectedIrlTicketOption.price,
633
+ currency: selectedIrlTicketOption.currency,
634
+ searchQuery: irlQuery,
635
+ // co2PerItem: irlJourneyOption.co2PerItem,
636
+ // co2PerPassenger: irlJourneyOption.co2PerPassenger,
637
+ outboundDate: irlJourneyOption.departDateTime
638
+ };
639
+ return this.basketService.addToBasket(basketItem, intBasket, this.searchService, this.travellers);
640
+ }
641
+ return Promise.resolve(false);
642
+ });
643
+ }
644
+ addReturnJourneyToBasket(serviceId, irlQuery, inbound, inJourneyOption) {
918
645
  return __awaiter(this, void 0, void 0, function* () {
919
- console.log(serviceId, railQuery, irlJourneyOption);
920
- // if (irlJourneyOption.unsellable) {
921
- // return Promise.resolve(false);
922
- // }
646
+ const outbound = this.outboundTicket;
647
+ const outJourneyOption = this.outboundJourneyOptions;
923
648
  const intBasket = yield this.basketService.getDefaultBasket();
924
649
  const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
925
650
  if (basket) {
926
- // const selectedIrlTicketOption = this.getSelectedIrlTicketOption(
927
- // irlJourneyOption,
928
- // railTicketGroup,
929
- // 0
930
- // );
931
- // const legs = this.getLegsFromRailJourneyOption(railJourneyOption);
932
- // const ticketQueueList = selectedIrlTicketOption.ticketQueueList.map(
933
- // (ticketQueueList) => {
934
- // return {
935
- // id: ticketQueueList.id,
936
- // name: ticketQueueList.name,
937
- // type: ticketQueueList.type
938
- // };
939
- // }
940
- // );
941
- // const basketItem = {
942
- // basket: basket.id,
943
- // service: serviceId,
944
- // detail: {
945
- // // accountsList: irlJourneyOption.accountsList.map(
946
- // // (account: RailAccount) => {
947
- // // return { id: account.id, description: account.description };
948
- // // }
949
- // // ),
950
- // outwardDetail: {
951
- // arrivalDateTime: railJourneyOption.arriveDateTime,
952
- // arrivalStationName: railJourneyOption.to,
953
- // departureDateTime: railJourneyOption.departDateTime,
954
- // departureStationName: railJourneyOption.from,
955
- // supplierTickets: [
956
- // {
957
- // supplierName: railJourneyOption.providers[0].name,
958
- // ticketDescription: selectedRailTicketOption.type,
959
- // price: selectedRailTicketOption.price,
960
- // legs
961
- // }
962
- // ]
963
- // },
964
- // transactionIdentifier:
965
- // railJourneyOption.identifiers.transactionIdentifier,
966
- // outbound: {
967
- // fareIdentifiers: [
968
- // selectedRailTicketOption.identifiers.fareIdentifier
969
- // ],
970
- // journeyIdentifier: selectedRailTicketOption.identifiers.journeyIdentifier
971
- // },
972
- // ticketQueueList
973
- // },
974
- // adults: railQuery.adults,
975
- // price: selectedRailTicketOption.price,
976
- // currency: selectedRailTicketOption.currency as CurrencyCode,
977
- // searchQuery: railQuery,
978
- // // co2PerItem: irlJourneyOption.co2PerItem,
979
- // // co2PerPassenger: irlJourneyOption.co2PerPassenger,
980
- // outboundDate: irlJourneyOption.
981
- // }
982
- // // if outTicketExtras exists add the object to basketItem
983
- // if (outTicketExtras) {
984
- // basketItem.detail.outbound.ticketExtras = outTicketExtras;
985
- // }
986
- // return this.basketService.addToBasket(
987
- // basketItem,
988
- // intBasket,
989
- // this.searchService,
990
- // this.travellers
991
- // );
651
+ const selectedIrlTicketOption = this.getSelectedIrlTicketOption(outJourneyOption, outbound, 0);
652
+ const outboundLegs = this.getLegsFromIrlJourneyOption(outJourneyOption);
653
+ const inboundLegs = this.getLegsFromIrlJourneyOption(inJourneyOption);
654
+ const termsAndConditions = this.getTermsAndCond(outJourneyOption);
655
+ const basketItem = {
656
+ basket: basket.id,
657
+ service: serviceId,
658
+ detail: {
659
+ outwardDetail: {
660
+ arrivalDateTime: outJourneyOption.arriveDateTime,
661
+ arrivalStationName: outJourneyOption.to,
662
+ arrivalStationCode: outJourneyOption.toCode,
663
+ departureStationCode: outJourneyOption.fromCode,
664
+ departureDateTime: outJourneyOption.departDateTime,
665
+ departureStationName: outJourneyOption.from,
666
+ supplierTickets: [
667
+ {
668
+ supplierName: outJourneyOption.providers[0].name,
669
+ ticketDescription: selectedIrlTicketOption.type,
670
+ price: selectedIrlTicketOption.price,
671
+ legs: outboundLegs
672
+ }
673
+ ]
674
+ },
675
+ inwardDetail: {
676
+ arrivalDateTime: inJourneyOption.arriveDateTime,
677
+ arrivalStationName: inJourneyOption.to,
678
+ arrivalStationCode: inJourneyOption.toCode,
679
+ departureStationCode: inJourneyOption.fromCode,
680
+ departureDateTime: inJourneyOption.departDateTime,
681
+ departureStationName: inJourneyOption.from,
682
+ supplierTickets: [
683
+ {
684
+ supplierName: inJourneyOption.providers[0].name,
685
+ ticketDescription: selectedIrlTicketOption.type,
686
+ legs: inboundLegs
687
+ }
688
+ ]
689
+ },
690
+ transactionIdentifier: outbound.identifiers.transactionIdentifier,
691
+ outbound: {
692
+ fareIdentifiers: [
693
+ selectedIrlTicketOption.identifiers.fareIdentifier
694
+ ],
695
+ journeyIdentifier: selectedIrlTicketOption.identifiers.journeyIdentifier
696
+ },
697
+ supplier: outJourneyOption.providers[0].providerId,
698
+ termsAndCond: termsAndConditions
699
+ },
700
+ adults: irlQuery.adults,
701
+ price: selectedIrlTicketOption.price,
702
+ currency: selectedIrlTicketOption.currency,
703
+ searchQuery: irlQuery,
704
+ outboundDate: outJourneyOption.departDateTime
705
+ // co2PerItem: outbound.co2PerItem,
706
+ // co2PerPassenger: outbound.co2PerPassenger
707
+ };
708
+ this.filterSelected();
709
+ return this.basketService.addToBasket(basketItem, intBasket, this.searchService, this.travellers);
992
710
  }
993
711
  return Promise.resolve(false);
994
712
  });
995
713
  }
996
- // async addReturnJourneyToBasket(
997
- // serviceId: string,
998
- // railQuery: SearchRailQueryVariables,
999
- // outbound: RailJourneyOption,
1000
- // inbound: RailJourneyOption,
1001
- // railTicketGroup: RailTicketGroup
1002
- // ): Promise<boolean> {
1003
- // if (outbound.unsellable) {
1004
- // return Promise.resolve(false);
1005
- // }
1006
- // const intBasket: InternalBasketInterface =
1007
- // await this.basketService.getDefaultBasket();
1008
- // const basket = intBasket?.subject.value;
1009
- // if (basket) {
1010
- // const selectedRailTicketOption = this.getSelectedRailTicketOption(
1011
- // outbound,
1012
- // railTicketGroup,
1013
- // 0
1014
- // );
1015
- // const outboundLegs = this.getLegsFromRailJourneyOption(outbound);
1016
- // const inboundLegs = this.getLegsFromRailJourneyOption(inbound);
1017
- // const ticketQueueList = selectedRailTicketOption.ticketQueueList.map(
1018
- // (ticketQueueList1: RailTicketQueue) => {
1019
- // return {
1020
- // id: ticketQueueList1.id,
1021
- // name: ticketQueueList1.name,
1022
- // type: ticketQueueList1.type
1023
- // };
1024
- // }
1025
- // );
1026
- // return this.basketService.addToBasket(
1027
- // {
1028
- // basket: basket.id,
1029
- // service: serviceId,
1030
- // detail: {
1031
- // outwardDetail: {
1032
- // arrivalDateTime: outbound.arriveDateTime,
1033
- // arrivalStationName: outbound.to,
1034
- // departureDateTime: outbound.departDateTime,
1035
- // departureStationName: outbound.from,
1036
- // supplierTickets: [
1037
- // {
1038
- // supplierName: outbound.providers[0].name,
1039
- // ticketDescription: selectedRailTicketOption.type,
1040
- // price: selectedRailTicketOption.price,
1041
- // legs: outboundLegs
1042
- // }
1043
- // ]
1044
- // },
1045
- // inwardDetail: {
1046
- // arrivalDateTime: inbound.arriveDateTime,
1047
- // arrivalStationName: inbound.to,
1048
- // departureDateTime: inbound.departDateTime,
1049
- // departureStationName: inbound.from,
1050
- // supplierTickets: [
1051
- // {
1052
- // supplierName: inbound.providers[0].name,
1053
- // ticketDescription: selectedRailTicketOption.type,
1054
- // legs: inboundLegs
1055
- // }
1056
- // ]
1057
- // },
1058
- // transactionIdentifier: outbound.identifiers.transactionIdentifier,
1059
- // outbound: {
1060
- // fareIdentifiers: [
1061
- // selectedRailTicketOption.identifiers.fareIdentifier
1062
- // ],
1063
- // journeyIdentifier:
1064
- // selectedRailTicketOption.identifiers.journeyIdentifier
1065
- // },
1066
- // ticketQueueList
1067
- // },
1068
- // adults: railQuery.adults,
1069
- // price: railTicketGroup.header.price,
1070
- // currency: selectedRailTicketOption.currency as CurrencyCode,
1071
- // searchQuery: railQuery,
1072
- // co2PerItem: outbound.co2PerItem,
1073
- // co2PerPassenger: outbound.co2PerPassenger
1074
- // },
1075
- // intBasket,
1076
- // this.searchService,
1077
- // this.travellers
1078
- // );
1079
- // }
1080
- // return Promise.resolve(false);
1081
- // }
1082
- // sortTicketPrices(tickets: TicketGroups): TicketGroups {
1083
- // const sortTicketPrices = { ...tickets };
1084
- // Object.keys(sortTicketPrices).map((key) => {
1085
- // sortTicketPrices[key].sort((a: IrlTicketOption, b: IrlTicketOption) => {
1086
- // const priceA = a.price,
1087
- // priceB = b.price;
1088
- // return priceA < priceB ? -1 : priceA > priceB ? 1 : 0;
1089
- // });
1090
- // });
1091
- // return sortTicketPrices;
1092
- // // }
1093
- // sortTicketChildrenPrices(tickets: RailTicketGroups): RailTicketGroups {
1094
- // const sortTicketPrices = { ...tickets };
1095
- // Object.keys(sortTicketPrices).map((key) => {
1096
- // sortTicketPrices[key].children.sort(
1097
- // (a: RailTicketGroup, b: RailTicketGroup) => {
1098
- // const priceA = a.header.price,
1099
- // priceB = b.header.price;
1100
- // return priceA < priceB ? -1 : priceA > priceB ? 1 : 0;
1101
- // }
1102
- // );
1103
- // });
1104
- // return sortTicketPrices;
1105
- // }
1106
714
  updateLowestPrice(results) {
1107
715
  if (!results.length)
1108
716
  return null;
@@ -1118,15 +726,15 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
1118
726
  this._cheapestStandard = null;
1119
727
  if (!results.length)
1120
728
  return null;
1121
- let cheapestArr = [];
729
+ const cheapestArr = [];
1122
730
  results.map((result) => {
1123
731
  result.outbound.map((out) => {
1124
732
  out.providers.map((tkt) => {
1125
- let cheapestTicket = tkt.cheapestTicket.price;
733
+ const cheapestTicket = tkt.cheapestTicket.price;
1126
734
  tkt.ticketOptions.map((tktOption) => {
1127
735
  var _a, _b;
1128
- let tktPrice = tktOption.price;
1129
- let tktClass = tktOption.class;
736
+ const tktPrice = tktOption.price;
737
+ const tktClass = tktOption.class;
1130
738
  if (tktClass === 'First' &&
1131
739
  (((_a = this._cheapestFirst) === null || _a === void 0 ? void 0 : _a.price) > tktPrice || !this._cheapestFirst)) {
1132
740
  this._cheapestFirst = tktOption;
@@ -1145,8 +753,118 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
1145
753
  });
1146
754
  return Math.min(...cheapestArr);
1147
755
  }
756
+ /**
757
+ * Sort results by price
758
+ *
759
+ * @returns
760
+ * @memberof irl-enterprise-search
761
+ */
762
+ sortByPrice() {
763
+ this.priceDir = !this.priceDir;
764
+ const results = this.filterSelected(this._isFiltered);
765
+ const byPrice = (a, b) => {
766
+ return this.priceDir
767
+ ? a.providers[0].cheapestTicket.price -
768
+ b.providers[0].cheapestTicket.price
769
+ : b.providers[0].cheapestTicket.price -
770
+ a.providers[0].cheapestTicket.price;
771
+ };
772
+ results[0].outbound = results[0].outbound.sort(byPrice);
773
+ results[0].return = results[0].return.sort(byPrice);
774
+ this.results.next(results);
775
+ }
776
+ /**
777
+ * Sort results by departure time
778
+ *
779
+ * @returns
780
+ * @memberof irl-enterprise-search
781
+ */
782
+ sortByDate() {
783
+ this.dateDir = !this.dateDir;
784
+ const results = this.filterSelected(this._isFiltered);
785
+ const byDate = (a, b) => {
786
+ return this.dateDir
787
+ ? moment(a.departDateTime).unix() - moment(b.departDateTime).unix()
788
+ : moment(b.departDateTime).unix() - moment(a.departDateTime).unix();
789
+ };
790
+ results[0].outbound = results[0].outbound.sort(byDate);
791
+ results[0].return = results[0].return.sort(byDate);
792
+ this.results.next(results);
793
+ }
794
+ addOutboundAndFilter(ticket, fullTicket) {
795
+ this.outboundJourneyOptions = fullTicket;
796
+ this.outboundTicket = ticket;
797
+ this.filterSelected(true);
798
+ }
799
+ filterSelected(filterOutbound = false) {
800
+ const results = this.helpers.clone(this.fullResults);
801
+ if (filterOutbound) {
802
+ this._isFiltered = true;
803
+ results[0].outbound = [
804
+ results[0].outbound.find((item) => {
805
+ return (item.departDateTime ===
806
+ this._outboundJourneyOptions.departDateTime &&
807
+ item.arriveDateTime === this._outboundJourneyOptions.arriveDateTime);
808
+ })
809
+ ];
810
+ results[0].outbound[0].providers[0].ticketOptions =
811
+ results[0].outbound[0].providers[0].ticketOptions.reduce((acc, ticket) => {
812
+ if (ticket.uid === this._outboundTicket.uid) {
813
+ ticket.selected = true;
814
+ acc.push(ticket);
815
+ }
816
+ return acc;
817
+ }, []);
818
+ }
819
+ else {
820
+ this._isFiltered = false;
821
+ this.outboundJourneyOptions = null;
822
+ this.outboundTicket = null;
823
+ results[0].outbound.forEach((item) => {
824
+ item.providers[0].ticketOptions.map((ticket) => {
825
+ ticket.selected = false;
826
+ ticket.ShowDetail = false;
827
+ return ticket;
828
+ });
829
+ });
830
+ }
831
+ this.results.next(results);
832
+ return results;
833
+ }
834
+ /**
835
+ * @description - get irl station locations
836
+ * @param term - the term to search
837
+ * @param isLoading - BehaviorSubject so we know something is happening
838
+ */
839
+ getIrlDiscountCards() {
840
+ const supplier = this.supplier;
841
+ return this.irlDiscountCardsFetcher.fetchList({
842
+ supplier
843
+ });
844
+ }
845
+ getTermsAndCond(inJourneyOption) {
846
+ var _a, _b;
847
+ return [
848
+ {
849
+ name: 'Fare Rules',
850
+ value: (_b = (_a = inJourneyOption === null || inJourneyOption === void 0 ? void 0 : inJourneyOption.providers[0]) === null || _a === void 0 ? void 0 : _a.ticketOptions[0]) === null || _b === void 0 ? void 0 : _b.fareRules
851
+ }
852
+ ];
853
+ }
854
+ saveSearch() {
855
+ if (this.isValid.value) {
856
+ const query = this.getSearchQuery();
857
+ const favouriteSearchQuery = this.updateSerchQuery(query);
858
+ const searchInfo = {
859
+ name: `${moment()}`,
860
+ serviceType: ServiceType.InternationalRail,
861
+ searchArgs: favouriteSearchQuery
862
+ };
863
+ return this.searchService.saveFavouriteSearch(searchInfo);
864
+ }
865
+ }
1148
866
  }
1149
867
  IRLEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_irl';
1150
868
  IRLEnterpriseSearch.STORAGE_SESSION_RESULTS = 'irl_results';
1151
869
  IRLEnterpriseSearch.PASSING_POINT = 'Passing';
1152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXJsLWVudGVycHJpc2Utc2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2J0c2VydmljZXMvYmFzZS9zcmMvbGliL3ZlbmRvci9jbGFzc2VzL2lybC1lbnRlcnByaXNlLXNlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxNQUFrQixNQUFNLFFBQVEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsR0FBRyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFpQnpELE9BQU8sRUFHTCxRQUFRLEVBTVIsV0FBVyxFQUNYLGNBQWMsRUFDZixNQUFNLHdCQUF3QixDQUFDO0FBa0JoQyxPQUFPLEVBQWEsSUFBSSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHN0QsTUFBTSxDQUFOLElBQVksaUJBR1g7QUFIRCxXQUFZLGlCQUFpQjtJQUMzQiw0Q0FBdUIsQ0FBQTtJQUN2Qiw2Q0FBd0IsQ0FBQTtBQUMxQixDQUFDLEVBSFcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUc1QjtBQUVELE1BQU0sT0FBTyxtQkFJWCxTQUFRLG9CQUlQO0lBc2RELFlBQ1UsVUFBa0MsRUFDbEMsd0JBQTZELEVBQzdELE9BQTJCLEVBQzNCLGFBQStDLEVBQ3ZELGNBQWtDLEVBQzFCLGFBQStDO1FBRXZELEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQVBkLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQ2xDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBcUM7UUFDN0QsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0Isa0JBQWEsR0FBYixhQUFhLENBQWtDO1FBRS9DLGtCQUFhLEdBQWIsYUFBYSxDQUFrQztRQXJkL0MsdUJBQWtCLEdBQUcsbUJBQW1CLENBQUMsdUJBQXVCLENBQUM7UUFDakUsNEJBQXVCLEdBQUcsbUJBQW1CLENBQUMs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QUFFO29CQUN4QixJQUFJLGNBQWMsR0FBVyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztvQkFDdEQsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7d0JBQ2xDLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7d0JBQy9CLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7d0JBQy9CLElBQ0UsUUFBUSxLQUFLLE9BQU87NEJBQ3BCLENBQUMsT0FBQSxJQUFJLENBQUMsY0FBYywwQ0FBRSxLQUFLLElBQUcsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUMvRDs0QkFDQSxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQzt5QkFDakM7NkJBQU0sSUFDTCxRQUFRLEtBQUssVUFBVTs0QkFDdkIsQ0FBQyxPQUFBLElBQUksQ0FBQyxpQkFBaUIsMENBQUUsS0FBSyxJQUFHLFFBQVE7Z0NBQ3ZDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQzFCOzRCQUNBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7eUJBQ3BDO3dCQUNELElBQUksUUFBUSxLQUFLLGNBQWMsRUFBRTs0QkFDL0IsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzt5QkFDbEM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7QUE5MENlLDBDQUFzQixHQUFHLFlBQVksQ0FBQztBQUN0QywyQ0FBdUIsR0FBRyxhQUFhLENBQUM7QUFDeEMsaUNBQWEsR0FBRyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50LCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IG9mLCBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJhc2VFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi9iYXNlLWVudGVycHJpc2UnO1xyXG5pbXBvcnQgeyBCYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlSGVscGVyUm91dGluZXMgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBSYWlsVGlja2V0R3JvdXBzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yYWlsLXRpY2tldC1ncm91cHMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBSYWlsUmVzdWx0SW5kaWZpZXJzLFxyXG4gIFJhaWxUaWNrZXRHcm91cCxcclxuICBUaWNrZXRHcm91cHNcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JhaWwtdGlja2V0LWdyb3VwLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFJhaWxEaXJlY3Rpb24gfSBmcm9tICcuL3JhaWwtZGlyZWN0aW9uLmVudW0nO1xyXG5pbXBvcnQgeyBWYWx1ZURpc3BsYXkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ZhbHVlLWRpc3BsYXknO1xyXG5pbXBvcnQge1xyXG4gIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgSXJsUXVvdGVSZXN1bHRBcnJheSxcclxuICBSZWN1cnNpdmVQYXJ0aWFsLFxyXG4gIFJlY2VudFNlYXJjaFxyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICBCYXNrZXRJdGVtLFxyXG4gIEN1cnJlbmN5Q29kZSxcclxuICBJcmxDbGFzcyxcclxuICBJcmxKb3VybmV5T3B0aW9uLFxyXG4gIElybEpvdXJuZXlPcHRpb25zLFxyXG4gIElybFByb3ZpZGVyLFxyXG4gIElybFRpY2tldE9wdGlvbixcclxuICBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyxcclxuICBTZXJ2aWNlVHlwZSxcclxuICBJcmxKb3VybmV5VHlwZSwgSXJsU3VwcGxpZXIsIElybFRpY2tldFxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VJcmxRdW90ZUZldGNoZXIsXHJcbiAgSXJsUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2lybC1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoSXJsU3RhdGlvbnNGZXRjaGVyLFxyXG4gIFNlYXJjaElybFN0YXRpb25zRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtaXJsLXN0YXRpb25zLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIElSTEVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgSXJsVGVtcFBhcmFtc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWlybC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciwgYWdlcyB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgSUNoZWFwZXN0UHJpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NoZWFwZXN0LXByaWNlJztcclxuXHJcbmV4cG9ydCBlbnVtIElybFNlYXJjaENyaXRlcmlhIHtcclxuICBEZXBhcnQgPSAnRGVwYXJ0IEFmdGVyJyxcclxuICBBcnJpdmUgPSAnQXJyaXZlIEJlZm9yZSdcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIElSTEVudGVycHJpc2VTZWFyY2g8XHJcbiAgUSBleHRlbmRzIElybFF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU0lTX1EgZXh0ZW5kcyBTZWFyY2hJcmxTdGF0aW9uc0ZldGNoZXJUeXBlXHJcbiAgPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgSXJsVGVtcFBhcmFtcyxcclxuICBJcmxRdW90ZVJlc3VsdEFycmF5LFxyXG4gIElybFF1b3RlUmVzdWx0QXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBJUkxFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlIHtcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyA9ICdzZWFyY2hfaXJsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAnaXJsX3Jlc3VsdHMnO1xyXG4gIHN0YXRpYyByZWFkb25seSBQQVNTSU5HX1BPSU5UID0gJ1Bhc3NpbmcnO1xyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcblxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPSBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG4gIHByb3RlY3RlZCBtdWx0aVJlc3VsdHNTZXNzaW9uTmFtZSA9IElSTEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcblxyXG5cclxuICBwdWJsaWMgc2VhcmNoVHlwZXMgPSBbXHJcbiAgICB7IGRpc3BsYXk6ICdSZXR1cm4nLCB2YWx1ZTogSXJsSm91cm5leVR5cGUuUmV0dXJuSm91cm5leSB9LFxyXG4gICAgeyBkaXNwbGF5OiAnT25lLVdheScsIHZhbHVlOiBJcmxKb3VybmV5VHlwZS5TaW5nbGVKb3VybmV5IH1cclxuICAgIC8vIHsgZGlzcGxheTogJ09wZW4gUmV0dXJuJywgdmFsdWU6IElybEpvdXJuZXlUeXBlLk9wZW5SZXR1cm5Kb3VybmV5IH0sXHJcbiAgICAvLyB7IGRpc3BsYXk6ICdEdWFsIFNpbmdsZXMnLCB2YWx1ZTogSXJsSm91cm5leVR5cGUuRHVhbFNpbmdsZUpvdXJuZXkgfSxcclxuICBdO1xyXG5cclxuICBwdWJsaWMgY2xhc3NUeXBlcyA9IFtcclxuICAgIHsgZGlzcGxheTogJ0FueScsIHZhbHVlOiBJcmxDbGFzcy5BbGwgfSxcclxuICAgIHsgZGlzcGxheTogJ1N0YW5kYXJkJywgdmFsdWU6IElybENsYXNzLlN0YW5kYXJkIH0sXHJcbiAgICB7IGRpc3BsYXk6ICdGaXJzdCcsIHZhbHVlOiBJcmxDbGFzcy5GaXJzdCB9XHJcbiAgXTtcclxuXHJcbiAgcHVibGljIGFnZVJhbmdlczoge1xyXG4gICAga2V5OiBhZ2VzO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICB9W10gPSBbeyBrZXk6IGFnZXMuQ2hpbGQsIHZhbHVlOiAnQ2hpbGQgKDAtMyknIH0sIHsga2V5OiBhZ2VzLkNoaWxkLCB2YWx1ZTogJ0NoaWxkICg0LTUpJyB9LCB7IGtleTogYWdlcy5DaGlsZCwgdmFsdWU6ICdDaGlsZCAoNi0xMSknIH0sIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1lvdXRoICgxMi0xNCknIH0sIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1lvdXRoICgxNS0yNSknIH0sIHsga2V5OiBhZ2VzLkFkdWx0LCB2YWx1ZTogJ0FkdWx0ICgyNi01OSknIH0sIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1NlbmlvciAoNjArKScgfV07XHJcblxyXG5cclxuXHJcbiAgcHVibGljIGlybENyaXRlcmlhID0gW0lybFNlYXJjaENyaXRlcmlhLkRlcGFydCwgSXJsU2VhcmNoQ3JpdGVyaWEuQXJyaXZlXTtcclxuXHJcbiAgcHVibGljIHRyYXZlbENhcmRzID0gW1xyXG4gICAgeyBkaXNwbGF5OiAnWW91bmcgcGVyc29ucyByYWlsY2FyZCcsIHZhbHVlOiAnWU5HJyB9LFxyXG4gICAgeyBkaXNwbGF5OiAnRGlzYWJpbGl0eSByYWlsY2FyZCcsIHZhbHVlOiAnRElTJyB9LFxyXG4gICAgeyBkaXNwbGF5OiAnRmFtaWx5IHJhaWxjYXJkJywgdmFsdWU6ICdGQU0nIH0sXHJcbiAgICB7IGRpc3BsYXk6ICdGb3JjZXMgcmFpbGNhcmQnLCB2YWx1ZTogJ0hNRicgfSxcclxuICAgIHsgZGlzcGxheTogJ1RyYXZlbCBhZ2VuY3kgZGlzY291bnQnLCB2YWx1ZTogJ1RBRCcgfVxyXG4gIF07XHJcblxyXG5cclxuICBwdWJsaWMgdHlwZTogU2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5JbnRlcm5hdGlvbmFsUmFpbDtcclxuICBwdWJsaWMgbWluT3V0Ym91bmREYXRlOiBOZ2JEYXRlU3RydWN0ID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKClcclxuICB9O1xyXG4gIHB1YmxpYyBtaW5JbmJvdW5kRGF0ZTogTmdiRGF0ZVN0cnVjdCA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSxcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpXHJcbiAgfTtcclxuICBwcml2YXRlIF90aW1lQXJyYXk6IFZhbHVlRGlzcGxheVtdO1xyXG4gIHByaXZhdGUgX2NhbkNvbWJpbmU6IGFueTtcclxuICAvLyBwcml2YXRlIF9jaG9zZW5PdXRib3VuZFRpY2tldDogUmVjdXJzaXZlUGFydGlhbDxJcmxUaWNrZXRPcHRpb24+O1xyXG4gIC8vIHByaXZhdGUgX2Nob3NlbkluYm91bmRUaWNrZXQ6IFJlY3Vyc2l2ZVBhcnRpYWw8SXJsVGlja2V0T3B0aW9uPjtcclxuICAvLyBwcml2YXRlIF9jaG9zZW5PdXRib3VuZEpvdXJuZXk6IFJlY3Vyc2l2ZVBhcnRpYWw8SXJsSm91cm5leU9wdGlvbj47XHJcbiAgLy8gcHJpdmF0ZSBfY2hvc2VuSW5ib3VuZEpvdXJuZXk6IFJlY3Vyc2l2ZVBhcnRpYWw8SXJsSm91cm5leU9wdGlvbj47XHJcbiAgcHJpdmF0ZSBfdmlhTG9jYXRpb246IGFueTtcclxuICBwcml2YXRlIF90cmF2ZWxsaW5nRnJvbTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3RyYXZlbGxpbmdUbzogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfb3JpZ2luYWxVc2VyU2VhcmNoOiBJcmxUZW1wUGFyYW1zO1xyXG5cclxuICAvLyBnZXQgY2hvc2VuVG90YWxQcmljZSgpOiBudW1iZXIge1xyXG4gIC8vICAgaWYgKHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0KSB7XHJcbiAgLy8gICAgIGlmICh0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0KSB7XHJcbiAgLy8gICAgICAgLy8gbm93IGNoZWNrIGlmIHRoZXkgYXJlIHJldHVybnMgb3IgZHVhbFxyXG4gIC8vICAgICAgIGlmIChcclxuICAvLyAgICAgICAgIHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0LnNpbmdsZU9yUmV0dXJuID09PSAnUmV0dXJuJyAmJlxyXG4gIC8vICAgICAgICAgdGhpcy5fY2hvc2VuSW5ib3VuZFRpY2tldC5zaW5nbGVPclJldHVybiA9PT0gJ1JldHVybidcclxuICAvLyAgICAgICApIHtcclxuICAvLyAgICAgICAgIC8vIHRoZXkgc2hvdWxkIGJvdGggaGF2ZSB0aGUgc2FtZSBwcmljZVxyXG4gIC8vICAgICAgICAgcmV0dXJuIHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0LnByaWNlO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICByZXR1cm4gKFxyXG4gIC8vICAgICAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQucHJpY2UgKyB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0LnByaWNlXHJcbiAgLy8gICAgICAgKTtcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgcmV0dXJuIHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0LnByaWNlO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIHJldHVybiAwO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGNob3NlblRpY2tldHMoKTogYW55IHtcclxuICAvLyAgIHJldHVybiB7XHJcbiAgLy8gICAgIE91dGJvdW5kOiB0aGlzLl9jaG9zZW5PdXRib3VuZFRpY2tldCxcclxuICAvLyAgICAgSW5ib3VuZDogdGhpcy5fY2hvc2VuSW5ib3VuZFRpY2tldFxyXG4gIC8vICAgfTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBjaG9zZW5PdXRib3VuZEpvdXJuZXkoKTogUmVjdXJzaXZlUGFydGlhbDxSYWlsSm91cm5leU9wdGlvbj4ge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2Nob3Nlbk91dGJvdW5kSm91cm5leTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBjaG9zZW5JbmJvdW5kSm91cm5leSgpOiBSZWN1cnNpdmVQYXJ0aWFsPFJhaWxKb3VybmV5T3B0aW9uPiB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5fY2hvc2VuSW5ib3VuZEpvdXJuZXk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgb3BlblJldHVybigpOiBib29sZWFuIHtcclxuICAvLyAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMub3BlblJldHVybjtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBvcGVuUmV0dXJuKG5ld1ZhbDogYm9vbGVhbikge1xyXG4gIC8vICAgdGhpcy50ZW1wUGFyYW1zLm9wZW5SZXR1cm4gPSBuZXdWYWw7XHJcblxyXG4gIC8vICAgaWYgKG5ld1ZhbCkge1xyXG4gIC8vICAgICB0aGlzLnRlbXBQYXJhbXMuY2hvc2VuU2VhcmNoVHlwZSA9IElybEpvdXJuZXlUeXBlLk9wZW5SZXR1cm5Kb3VybmV5O1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGNob3NlblNlYXJjaFR5cGUoKTogSXJsSm91cm5leVR5cGUge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hUeXBlO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGNob3NlblNlYXJjaFR5cGUobmV3VHlwZTogSXJsSm91cm5leVR5cGUpIHtcclxuICAvLyAgIHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hUeXBlID0gbmV3VHlwZTtcclxuICAvLyAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAvLyB9XHJcblxyXG4gIGdldCBub09mQWR1bHRzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFkdWx0cztcclxuICB9XHJcblxyXG4gIHNldCBub09mQWR1bHRzKGFkdWx0czogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzID0gYWR1bHRzO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vT2ZDaGlsZHJlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIHNldCBub09mQ2hpbGRyZW4oY2hpbGRyZW46IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID0gY2hpbGRyZW47XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdHJhdmVsbGluZ1RvKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFycml2YWxMb2NhdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgc2V0IHRyYXZlbGxpbmdUbyh0dDogYW55KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbExvY2F0aW9uSWQgPSB0dDtcclxuXHJcbiAgICB0aGlzLl90cmF2ZWxsaW5nVG8gPSAnJztcclxuICAgIGlmICh0dD8ucmFpbHN0YXRpb24/LmlkKSB7XHJcbiAgICAgIHRoaXMuX3RyYXZlbGxpbmdUbyA9IHR0LnJhaWxzdGF0aW9uLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCB0cmF2ZWxsaW5nRnJvbSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5kZXBhcnR1cmVMb2NhdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgc2V0IHRyYXZlbGxpbmdGcm9tKHR0OiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5kZXBhcnR1cmVMb2NhdGlvbklkID0gdHQ7XHJcbiAgICB0aGlzLl90cmF2ZWxsaW5nRnJvbSA9ICcnO1xyXG4gICAgaWYgKHR0Py5yYWlsc3RhdGlvbj8uaWQpIHtcclxuICAgICAgdGhpcy5fdHJhdmVsbGluZ0Zyb20gPSB0dC5yYWlsc3RhdGlvbi5pZDtcclxuICAgICAgdGhpcy5zdXBwbGllciA9IHR0LnJhaWxzdGF0aW9uLnN1cHBsaWVyO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N1cHBsaWVyOiBJcmxTdXBwbGllciA9IG51bGxcclxuICBnZXQgc3VwcGxpZXIoKTogSXJsU3VwcGxpZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N1cHBsaWVyO1xyXG4gIH1cclxuICBzZXQgc3VwcGxpZXIoZGF0YTogSXJsU3VwcGxpZXIpIHtcclxuICAgIHRoaXMuX3N1cHBsaWVyID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvdW50cnlDb2RlOiBzdHJpbmcgPSBudWxsXHJcbiAgZ2V0IGNvdW50cnlDb2RlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnRyeUNvZGU7XHJcbiAgfVxyXG4gIHNldCBjb3VudHJ5Q29kZShkYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2NvdW50cnlDb2RlID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsYXNzOiBJcmxDbGFzcyA9IG51bGxcclxuICBnZXQgY2xhc3MoKTogSXJsQ2xhc3Mge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzO1xyXG4gIH1cclxuICBzZXQgY2xhc3MoZGF0YTogSXJsQ2xhc3MpIHtcclxuICAgIHRoaXMuX2NsYXNzID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX291dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQgPSBudWxsXHJcbiAgZ2V0IG91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTtcclxuICB9XHJcbiAgc2V0IG91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUobmV3RGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMuX291dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZVxyXG4gICAgdGhpcy5fb3V0Ym91bmRfZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlVGltZSk7XHJcbiAgICB0aGlzLl9vdXRib3VuZF90aW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICA/IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgOiAnMDcwMCc7XHJcbiAgICB0aGlzLl91cGRhdGVPdXRib3VuZERhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kZXBhcnR1cmVMb2NhdGlvbklkOiBzdHJpbmcgPSBudWxsXHJcbiAgZ2V0IGRlcGFydHVyZUxvY2F0aW9uSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXBhcnR1cmVMb2NhdGlvbklkO1xyXG4gIH1cclxuICBzZXQgZGVwYXJ0dXJlTG9jYXRpb25JZChkYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2RlcGFydHVyZUxvY2F0aW9uSWQgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYXJyaXZhbExvY2F0aW9uSWQ6IHN0cmluZyA9IG51bGxcclxuICBnZXQgYXJyaXZhbExvY2F0aW9uSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9hcnJpdmFsTG9jYXRpb25JZDtcclxuICB9XHJcbiAgc2V0IGFycml2YWxMb2NhdGlvbklkKGRhdGE6IHN0cmluZykge1xyXG4gICAgdGhpcy5fYXJyaXZhbExvY2F0aW9uSWQgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWR1bHRzOiBudW1iZXIgPSAwXHJcbiAgZ2V0IGFkdWx0cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FkdWx0cztcclxuICB9XHJcbiAgc2V0IGFkdWx0cyhkYXRhOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2FkdWx0cyA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaGlsZHJlbjogbnVtYmVyID0gMFxyXG4gIGdldCBjaGlsZHJlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xyXG4gIH1cclxuICBzZXQgY2hpbGRyZW4oZGF0YTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jaGlsZHJlbiA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXR1cm5EZXBhcnR1cmVEYXRlVGltZTogbW9tZW50Lk1vbWVudCA9IG51bGxcclxuICBnZXQgcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWU7XHJcbiAgfVxyXG4gIHNldCByZXR1cm5EZXBhcnR1cmVEYXRlVGltZShuZXdEYXRlVGltZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgdGhpcy5fcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZTtcclxuICAgIHRoaXMuX3JldHVybl9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGVUaW1lKTtcclxuICAgIHRoaXMuX3JldHVybl90aW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICA/IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgOiAnMDcwMCc7XHJcbiAgICB0aGlzLl91cGRhdGVSZXR1cm5EYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWdlUmFuZ2U6IHN0cmluZyA9IG51bGxcclxuICBnZXQgYWdlUmFuZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9hZ2VSYW5nZTtcclxuICB9XHJcbiAgc2V0IGFnZVJhbmdlKGRhdGE6IHN0cmluZykge1xyXG4gICAgdGhpcy5fYWdlUmFuZ2UgPSBkYXRhO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgLy8gZ2V0IGNob3NlblJhaWxDbGFzcygpOiBSYWlsQ2xhc3Mge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hDbGFzcztcclxuICAvLyB9XHJcblxyXG4gIGdldCBjaG9zZW5TZWFyY2hDbGFzcygpOiBJcmxDbGFzcyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNsYXNzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNob3NlblNlYXJjaENsYXNzKGNsYXNzUjogSXJsQ2xhc3MpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jbGFzcyA9IGNsYXNzUjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBvdXRCb3VuZERhdGVUaW1lKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZERlcGFydHVyZURhdGVUaW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dEJvdW5kRGF0ZVRpbWUobmV3RGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZERlcGFydHVyZURhdGVUaW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKTtcclxuXHJcbiAgICB0aGlzLm1pbkluYm91bmREYXRlID0ge1xyXG4gICAgICB5ZWFyOiBuZXdEYXRlVGltZS55ZWFyKCksXHJcbiAgICAgIG1vbnRoOiBuZXdEYXRlVGltZS5tb250aCgpICsgMSxcclxuICAgICAgZGF5OiBuZXdEYXRlVGltZS5kYXRlKClcclxuICAgIH07XHJcblxyXG4gICAgaWYgKG5ld0RhdGVUaW1lICYmIG5ld0RhdGVUaW1lLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLl9vdXRib3VuZF9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGVUaW1lKTtcclxuICAgICAgdGhpcy5fb3V0Ym91bmRfdGltZSA9IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgICA/IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgICA6ICcwNzAwJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlVGltZSAmJlxyXG4gICAgICB0aGlzLmluQm91bmREYXRlVGltZSAmJlxyXG4gICAgICB0aGlzLm91dEJvdW5kRGF0ZVRpbWUuaXNBZnRlcih0aGlzLmluQm91bmREYXRlVGltZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLmluQm91bmREYXRlVGltZSA9IHRoaXMub3V0Qm91bmREYXRlVGltZS5jbG9uZSgpLmFkZCgxLCAnZGF5Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG91dGJvdW5kQ3JpdGVyaWEoKTogSXJsU2VhcmNoQ3JpdGVyaWEge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZENyaXRlcmlhO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kQ3JpdGVyaWEobmV3Q3JpdDogSXJsU2VhcmNoQ3JpdGVyaWEpIHtcclxuICAgIC8vIGNvbnNvbGUud2FybihgKysrIFNldHRpbmcgTmV3IENyaXRlcmlhOiAke25ld0NyaXR9ICsrK2ApO1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kQ3JpdGVyaWEgPSBuZXdDcml0O1xyXG5cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBpbkJvdW5kRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnJldHVybkRlcGFydHVyZURhdGVUaW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IGluQm91bmREYXRlVGltZShuZXdEYXRlVGltZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnJldHVybkRlcGFydHVyZURhdGVUaW1lID0gbmV3RGF0ZVRpbWU7XHJcbiAgICBpZiAobmV3RGF0ZVRpbWUgJiYgbmV3RGF0ZVRpbWUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMuX3JldHVybl9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGVUaW1lKTtcclxuICAgICAgdGhpcy5fcmV0dXJuX3RpbWUgPSBtb21lbnQobmV3RGF0ZVRpbWUpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgPyBtb21lbnQobmV3RGF0ZVRpbWUpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgOiAnMTYwMCc7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICAvLyAhZGF0ZSBhbmQgdGltZSBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IGZvciBMVVxyXG4gIHByaXZhdGUgX291dGJvdW5kX2RhdGU6IE5nYkRhdGVTdHJ1Y3QgPSBudWxsO1xyXG5cclxuICBnZXQgb3V0Ym91bmRfZGF0ZSgpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9vdXRib3VuZF9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kX2RhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX291dGJvdW5kX2RhdGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZU91dGJvdW5kRGF0ZVRpbWUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX291dGJvdW5kX3RpbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgZ2V0IG91dGJvdW5kX3RpbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vdXRib3VuZF90aW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kX3RpbWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fb3V0Ym91bmRfdGltZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5fdXBkYXRlT3V0Ym91bmREYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmV0dXJuX2RhdGU6IE5nYkRhdGVTdHJ1Y3QgPSBudWxsO1xyXG5cclxuICBnZXQgcmV0dXJuX2RhdGUoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmV0dXJuX2RhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgcmV0dXJuX2RhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX3JldHVybl9kYXRlID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVSZXR1cm5EYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmV0dXJuX3RpbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgZ2V0IHJldHVybl90aW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmV0dXJuX3RpbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgcmV0dXJuX3RpbWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcmV0dXJuX3RpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZVJldHVybkRhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcmV0dXJuQ3JpdGVyaWEoKTogSXJsU2VhcmNoQ3JpdGVyaWEge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5yZXR1cm5Dcml0ZXJpYTtcclxuICB9XHJcblxyXG4gIHNldCByZXR1cm5Dcml0ZXJpYShuZXdDcml0OiBJcmxTZWFyY2hDcml0ZXJpYSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnJldHVybkNyaXRlcmlhID0gbmV3Q3JpdDtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8vIHNldCByYWlsQ2FyZHMobmV3UmFpbENhcmRzOiBzdHJpbmdbXSkge1xyXG4gIC8vICAgdGhpcy50ZW1wUGFyYW1zLnJhaWxDYXJkcyA9IG5ld1JhaWxDYXJkcztcclxuICAvLyAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBjYXJuZXRUaWNrZXQoKTogYm9vbGVhbiB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNhcm5ldFRpY2tldDtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBjYXJuZXRUaWNrZXQobmV3Q2FybmV0OiBib29sZWFuKSB7XHJcbiAgLy8gICB0aGlzLnRlbXBQYXJhbXMuY2FybmV0VGlja2V0ID0gbmV3Q2FybmV0O1xyXG4gIC8vICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGRpc2FibGVBdXRvRGlzY291bnRzKCk6IGJvb2xlYW4ge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5kaXNhYmxlQXV0b0Rpc2NvdW50cztcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBkaXNhYmxlQXV0b0Rpc2NvdW50cyhuZXdEaXM6IGJvb2xlYW4pIHtcclxuICAvLyAgIHRoaXMudGVtcFBhcmFtcy5kaXNhYmxlQXV0b0Rpc2NvdW50cyA9IG5ld0RpcztcclxuICAvLyAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBwcmlvcml0aXNlQnlQcmljZSgpOiBib29sZWFuIHtcclxuICAvLyAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJpb3JpdGlzZUJ5UHJpY2U7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgcHJpb3JpdGlzZUJ5UHJpY2UobmV3UHJpb3JpdHk6IGJvb2xlYW4pIHtcclxuICAvLyAgIHRoaXMudGVtcFBhcmFtcy5wcmlvcml0aXNlQnlQcmljZSA9IG5ld1ByaW9yaXR5O1xyXG4gIC8vICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIC8vIH1cclxuXHJcblxyXG4gIHB1YmxpYyBnZXQgdGltZUFycmF5KCk6IFZhbHVlRGlzcGxheVtdIHtcclxuICAgIHRoaXMuX3RpbWVBcnJheSA9XHJcbiAgICAgIHRoaXMuX3RpbWVBcnJheSB8fFxyXG4gICAgICBBcnJheSg0OClcclxuICAgICAgICAuZmlsbCgwKVxyXG4gICAgICAgIC5tYXAoKF8sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbHVlOlxyXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoaW5kZXggLyAyKVxyXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgIC5wYWRTdGFydCgyLCAnMCcpICtcclxuICAgICAgICAgICAgICAoKGluZGV4ICUgMikgKiAzMCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxyXG4gICAgICAgICAgICBkaXNwbGF5OlxyXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoaW5kZXggLyAyKVxyXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgIC5wYWRTdGFydCgyLCAnMCcpICtcclxuICAgICAgICAgICAgICAnOicgK1xyXG4gICAgICAgICAgICAgICgoaW5kZXggJSAyKSAqIDMwKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5fdGltZUFycmF5O1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX2NoZWFwZXN0U3RhbmRhcmQ6IElybFRpY2tldE9wdGlvbiA9IG51bGw7XHJcbiAgZ2V0IGNoZWFwZXN0U3RhbmRhcmQoKTogSXJsVGlja2V0T3B0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVhcGVzdFN0YW5kYXJkO1xyXG4gIH1cclxuICBwcml2YXRlIF9jaGVhcGVzdEZpcnN0OiBJcmxUaWNrZXRPcHRpb24gPSBudWxsO1xyXG4gIGdldCBjaGVhcGVzdEZpcnN0KCk6IElybFRpY2tldE9wdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hlYXBlc3RGaXJzdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lybENsYXNzOiBJcmxDbGFzcyA9IG51bGw7XHJcbiAgZ2V0IGlybENsYXNzKCk6IElybENsYXNzIHtcclxuICAgIHJldHVybiB0aGlzLl9pcmxDbGFzc1xyXG4gIH1cclxuXHJcbiAgc2V0IGlybENsYXNzKGRhdGE6IElybENsYXNzKSB7XHJcbiAgICB0aGlzLl9pcmxDbGFzcyA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9qb3VybmV5dHlwZTogSXJsSm91cm5leVR5cGUgPSBJcmxKb3VybmV5VHlwZS5TaW5nbGVKb3VybmV5O1xyXG4gIGdldCBqb3VybmV5VHlwZSgpOiBJcmxKb3VybmV5VHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fam91cm5leXR5cGVcclxuICB9XHJcblxyXG4gIHNldCBqb3VybmV5VHlwZShkYXRhOiBJcmxKb3VybmV5VHlwZSkge1xyXG4gICAgdGhpcy5fam91cm5leXR5cGUgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIElybGZldGNoZXI6IEJhc2VJcmxRdW90ZUZldGNoZXI8UT4sXHJcbiAgICBwcml2YXRlIHNlYXJjaElybFN0YXRpb25zRmV0Y2hlcjogQmFzZVNlYXJjaElybFN0YXRpb25zRmV0Y2hlcjxTSVNfUT4sXHJcbiAgICBwcml2YXRlIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZTogRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBzdG9yYWdlU2VydmljZTogQmFzZVN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZVxyXG4gICkge1xyXG4gICAgc3VwZXIoc3RvcmFnZVNlcnZpY2UpO1xyXG5cclxuICAgIGNvbnN0IGRhdGE6IHtcclxuICAgICAgcXVlcnk6IHt9O1xyXG4gICAgICB0ZW1wUGFyYW1zOiBJcmxUZW1wUGFyYW1zO1xyXG4gICAgICBvcmlnaW5hbFVzZXJTZWFyY2g6IElybFRlbXBQYXJhbXM7XHJcbiAgICB9ID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIElSTEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNU1xyXG4gICAgKSB8fCB7XHJcbiAgICAgICAgcXVlcnk6IHt9LFxyXG4gICAgICAgIHRlbXBQYXJhbXM6IHt9IGFzIElybFRlbXBQYXJhbXMsXHJcbiAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB7fSBhcyBJcmxUZW1wUGFyYW1zXHJcbiAgICAgIH07XHJcblxyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlSXJsUXVlcnkoZGF0YS50ZW1wUGFyYW1zKSk7XHJcbiAgICB0aGlzLl9vcmlnaW5hbFVzZXJTZWFyY2ggPSBkYXRhLm9yaWdpbmFsVXNlclNlYXJjaDtcclxuXHJcbiAgICBpZiAoc2VhcmNoU2VydmljZS5zaG91bGRBZGRUcmF2ZWxsZXJTdWJzY3JpcHRpb24oKSkge1xyXG4gICAgICBzZWFyY2hTZXJ2aWNlLnRyYXZlbGxlckluZm9ybWF0aW9uLnN1YnNjcmliZShcclxuICAgICAgICAodHJhdmVsbGVyczogVHJhdmVsbGVyW10pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICBpZiAodGhpcy50cmF2ZWxsZXJzWzBdICYmICF0aGlzLnRyYXZlbGxlcnNbMF0uYWdlVHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyYXZlbGxlcnNbMF0uYWdlVHlwZSA9IGFnZXMuQWR1bHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBzcGxpdFRyYXZlbGxlcnMgPSB0aGlzLmhlbHBlcnMuc2VsZWN0ZWRUcmF2ZWxsZXJzKFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXJzLFxyXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5JbnRlcm5hdGlvbmFsUmFpbFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5hZHVsdHMgPSBzcGxpdFRyYXZlbGxlcnMuYWR1bHRzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbiA9IHNwbGl0VHJhdmVsbGVycy5jaGlsZHJlbi5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIGNvbnN0IHJlc3VsdHMgPVxyXG4gICAgICBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbUFzTGlzdDxJcmxRdW90ZVJlc3VsdEFycmF5PihcclxuICAgICAgICB0aGlzLnJlc3VsdHNTZXNzaW9uTmFtZVxyXG4gICAgICApIHx8IFtdO1xyXG4gICAgLy8gaWYgKHJlc3VsdHMgPT0gbnVsbCAmJiB0aGlzLmlzVmFsaWQpIHtcclxuICAgIC8vICAgc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAvLyB9XHJcbiAgICB0aGlzLl9jaGVhcGVzdFJlc3VsdFByaWNlID0gdGhpcy51cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzKTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMgfHwgW10pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0UXVlcnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXModGhpcy5zZWFyY2hTZXJ2aWNlLm1ha2VJcmxRdWVyeSgpKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzVmFsaWQoKSB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB0aGlzLnRlbXBQYXJhbXMsXHJcbiAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaFxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgY29uc3Qgbm93ID0gbW9tZW50KCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl90cmF2ZWxsaW5nRnJvbSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgRW50ZXIgYSBGcm9tIExvY2F0aW9uLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5fdHJhdmVsbGluZ1RvKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBFbnRlciBhIFRvIExvY2F0aW9uLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm91dEJvdW5kRGF0ZVRpbWU/LmlzQmVmb3JlKG5vdykpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAnRGVwYXJ0dXJlIERhdGUvVGltZSBjYW5ub3QgYmUgaW4gdGhlIHBhc3QuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIChcclxuICAgIC8vICAgdGhpcy5jaG9zZW5TZWFyY2hUeXBlID09PSBJcmxKb3VybmV5VHlwZS5SZXR1cm5Kb3VybmV5XHJcbiAgICAvLyApIHtcclxuICAgIC8vICAgLy8gY2hlY2sgZm9yIHJldHVybiBzcGVjaWZpYyB2YWxpZGF0aW9ucyBpbiBoZXJlXHJcblxyXG4gICAgLy8gICBpZiAodGhpcy5pbkJvdW5kRGF0ZVRpbWU/LmlzU2FtZU9yQmVmb3JlKHRoaXMub3V0Qm91bmREYXRlVGltZSkpIHtcclxuICAgIC8vICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgLy8gICAgICAgJ1JldHVybiBEYXRlL1RpbWUgbXVzdCBiZSBhZnRlciBEZXBhcnR1cmUgRGF0ZS9UaW1lJ1xyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy52aWEpIHtcclxuICAgIC8vICAgaWYgKCF0aGlzLnRlbXBQYXJhbXMudmlhTG9jYXRpb24pIHtcclxuICAgIC8vICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgZW50ZXIgYSB2aWEgbG9jYXRpb24uJyk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAodGhpcy50ZW1wUGFyYW1zLmFkdWx0cyArIHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbiA8IDEpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCAxIHRyYXZlbGxlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNWYWxpZC5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB0aGlzLm1lc3NhZ2VzLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2goKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChbXSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbFVzZXJTZWFyY2ggPSBPYmplY3QuZnJlZXplKHsgLi4udGhpcy50ZW1wUGFyYW1zIH0pO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICAgIElSTEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0ZW1wUGFyYW1zOiB0aGlzLnRlbXBQYXJhbXMsXHJcbiAgICAgICAgICBvcmlnaW5hbFVzZXJTZWFyY2g6IHRoaXMub3JpZ2luYWxVc2VyU2VhcmNoXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWFyY2goXHJcbiAgICAgICAgdGhpcy5JcmxmZXRjaGVyLmZldGNoTGlzdCh0aGlzLmdldFNlYXJjaFF1ZXJ5KCkpLnBpcGUoXHJcbiAgICAgICAgICBtYXAocmVzdWx0ID0+IHJlc3VsdClcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydFJlY2VudFNlYXJjaChyZWNlbnRTZWFyY2g6IFJlY2VudFNlYXJjaCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGFydFNlYXJjaCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlT3V0Ym91bmREYXRlVGltZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9vdXRib3VuZF9kYXRlICYmIHRoaXMuX291dGJvdW5kX3RpbWUpIHtcclxuICAgICAgY29uc3QgdGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgICB0aGlzLl9vdXRib3VuZF9kYXRlLFxyXG4gICAgICAgIHRoaXMuX291dGJvdW5kX3RpbWVcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlVGltZSA9IHRpbWUuaXNWYWxpZCgpID8gdGltZSA6IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVJldHVybkRhdGVUaW1lKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JldHVybl9kYXRlICYmIHRoaXMuX3JldHVybl90aW1lKSB7XHJcbiAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgdGhpcy5fcmV0dXJuX2RhdGUsXHJcbiAgICAgICAgdGhpcy5fcmV0dXJuX3RpbWVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5pbkJvdW5kRGF0ZVRpbWUgPSB0aW1lLmlzVmFsaWQoKSA/IHRpbWUgOiBudWxsO1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hRdWVyeSgpOiBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyB7XHJcbiAgICAvLyB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgdGhpcy5ub09mQWR1bHRzID0gdGhpcy50cmF2ZWxsZXJzLmZpbHRlcigodHJhdmVsbGVyOiBUcmF2ZWxsZXIpPT5cclxuICAgIHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLkFkdWx0IHx8IHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLllvdXRoIHx8IHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLlNlbmlvcikubGVuZ3RoO1xyXG4gICAgdGhpcy5ub09mQ2hpbGRyZW4gPSB0aGlzLnRyYXZlbGxlcnMuZmlsdGVyKCh0cmF2ZWxsZXI6IFRyYXZlbGxlcik9PlxyXG4gICAgdHJhdmVsbGVyLmFnZVR5cGUgPT09IGFnZXMuQ2hpbGQpLmxlbmd0aDtcclxuICAgIGNvbnN0IHF1ZXJ5OiBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyA9IHtcclxuICAgICAgc3VwcGxpZXI6IHRoaXMuc3VwcGxpZXIsIC8vIElSTFN1cHBsaWVyIVxyXG4gICAgICBjb3VudHJ5Q29kZTogJ0dCJyxcclxuICAgICAgLy8gam91cm5leVR5cGU6IHRoaXMuam91cm5leVR5cGUsIC8vIElSTEpvdXJuZXlUeXBlIVxyXG4gICAgICBjbGFzczogdGhpcy5pcmxDbGFzcywgLy8gSVJMQ2xhc3NcclxuICAgICAgb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTogdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUsXHJcbiAgICAgIGRlcGFydHVyZUxvY2F0aW9uSWQ6IHRoaXMuX3RyYXZlbGxpbmdGcm9tLFxyXG4gICAgICBhcnJpdmFsTG9jYXRpb25JZDogdGhpcy5fdHJhdmVsbGluZ1RvLFxyXG4gICAgICBhZHVsdHM6IHRoaXMudGVtcFBhcmFtcy5hZHVsdHMsXHJcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4sXHJcbiAgICAgIHJldHVybkRlcGFydHVyZURhdGVUaW1lOiB0aGlzLnRlbXBQYXJhbXMucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUsXHJcblxyXG4gICAgICBqb3VybmV5VHlwZTogdGhpcy5qb3VybmV5VHlwZSxcclxuICAgICAgLy8gY2xhc3M6IHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hDbGFzcyxcclxuICAgICAgLy8gZXh0cmFUaW1lVG9DaGFuZ2U6IHRoaXMudGVtcFBhcmFtcy5leHRyYVRpbWUsXHJcbiAgICAgIC8vIG91dGJvdW5kQXJyaXZhbERhdGVUaW1lOiB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlVGltZSxcclxuICAgICAgLy8gcmV0dXJuQXJyaXZhbERhdGVUaW1lOiB0aGlzLnRlbXBQYXJhbXMuaW5Cb3VuZERhdGVUaW1lLFxyXG4gICAgICAvLyB2aWFMb2NhdGlvbkNvZGU6IHRoaXMudGVtcFBhcmFtcy52aWFMb2NhdGlvblxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID09PSAwKSB7XHJcbiAgICAgIHF1ZXJ5LmNoaWxkcmVuID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzd2l0Y2ggKHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZENyaXRlcmlhKSB7XHJcbiAgICAvLyAgIGNhc2UgSXJsU2VhcmNoQ3JpdGVyaWEuRGVwYXJ0OlxyXG4gICAgLy8gICAgIHF1ZXJ5Lm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUgPSBudWxsO1xyXG4gICAgLy8gICAgIGJyZWFrO1xyXG4gICAgLy8gICBjYXNlIElybFNlYXJjaENyaXRlcmlhLkFycml2ZTpcclxuICAgIC8vICAgICBxdWVyeS5vdXRib3VuZERlcGFydHVyZURhdGVUaW1lID0gbnVsbDtcclxuICAgIC8vICAgICBicmVhaztcclxuICAgIC8vICAgZGVmYXVsdDpcclxuICAgIC8vICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAvLyAgICAgICBgKysrIFVua25vd24gQ3JpdGVyaWE6ICR7dGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kQ3JpdGVyaWF9ICsrK2BcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHN3aXRjaCAodGhpcy50ZW1wUGFyYW1zLnJldHVybkNyaXRlcmlhKSB7XHJcbiAgICAvLyAgIGNhc2UgSXJsU2VhcmNoQ3JpdGVyaWEuRGVwYXJ0OlxyXG4gICAgLy8gICAgIHF1ZXJ5LnJldHVybkRlcGFydHVyZURhdGVUaW1lID0gbnVsbDtcclxuICAgIC8vICAgICBicmVhaztcclxuICAgIC8vICAgY2FzZSBJcmxTZWFyY2hDcml0ZXJpYS5BcnJpdmU6XHJcbiAgICAvLyAgICAgcXVlcnkucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUgPSBudWxsO1xyXG4gICAgLy8gICAgIGJyZWFrO1xyXG4gICAgLy8gICBkZWZhdWx0OlxyXG4gICAgLy8gICAgIGNvbnNvbGUud2FybihcclxuICAgIC8vICAgICAgIGArKysgVW5rbm93biBDcml0ZXJpYTogJHt0aGlzLnRlbXBQYXJhbXMucmV0dXJuQ3JpdGVyaWF9ICsrK2BcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy50ZW1wUGFyYW1zLmpvdXJuZXlUeXBlKSB7XHJcbiAgICAgIGNhc2UgSXJsSm91cm5leVR5cGUuU2luZ2xlSm91cm5leTpcclxuICAgICAgICBxdWVyeS5yZXR1cm5EZXBhcnR1cmVEYXRlVGltZSA9IG51bGw7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnJlbW92ZU51bGxzPFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzPihxdWVyeSk7XHJcbiAgfVxyXG5cclxuICAvLyBjcmVhdGVUaWNrZXRHcm91cHMocmVzdWx0czogSVJMSm91cm5leU9wdGlvbnNbXSk6IFJhaWxUaWNrZXRHcm91cHMge1xyXG4gIC8vICAgbGV0IHRpY2tldHM6IFJhaWxUaWNrZXRHcm91cHMgPSB7fTtcclxuICAvLyAgIGxldCB0aWNrZXRJZCA9ICcnO1xyXG4gIC8vICAgdGhpcy5fY2FuQ29tYmluZSA9IHt9O1xyXG5cclxuICAvLyAgIGxldCB0aWNrZXRHcm91cHNPdXRib3VuZCA9IHRoaXMuc2V0VGlja2V0c0dyb3VwcyhyZXN1bHRzWzBdLm91dGJvdW5kKTtcclxuICAvLyAgIGxldCB0aWNrZXRHcm91cHNSZXR1cm4gPSB0aGlzLnNldFRpY2tldHNHcm91cHMocmVzdWx0c1swXS5yZXR1cm4pO1xyXG4gIC8vICAgdGlja2V0R3JvdXBzT3V0Ym91bmQgPSB0aGlzLnNvcnRUaWNrZXRQcmljZXModGlja2V0R3JvdXBzT3V0Ym91bmQpO1xyXG4gIC8vICAgdGlja2V0R3JvdXBzUmV0dXJuID0gdGhpcy5zb3J0VGlja2V0UHJpY2VzKHRpY2tldEdyb3Vwc1JldHVybik7XHJcblxyXG4gIC8vICAgT2JqZWN0LmtleXModGlja2V0R3JvdXBzT3V0Ym91bmQpLm1hcCgoa2V5KSA9PiB7XHJcbiAgLy8gICAgIHRpY2tldEdyb3Vwc091dGJvdW5kW2tleV0ubWFwKCh0a3Q6IFJhaWxUaWNrZXRPcHRpb24pID0+IHtcclxuICAvLyAgICAgICB0aWNrZXRJZCA9IGAke3RrdC50eXBlfSR7dGt0LnNpbmdsZU9yUmV0dXJufWA7XHJcbiAgLy8gICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRrdC5pZGVudGlmaWVycy5qb3VybmV5SWRlbnRpZmllcjtcclxuICAvLyAgICAgICBjb25zdCBpZGVudGlmaWVyT2JqOiBSYWlsUmVzdWx0SW5kaWZpZXJzID0ge307XHJcbiAgLy8gICAgICAgaWRlbnRpZmllck9ialtpZGVudGlmaWVyXSA9IHtcclxuICAvLyAgICAgICAgIHByaWNlOiB0a3QucHJpY2UsXHJcbiAgLy8gICAgICAgICBpc0NoaWxkOiBmYWxzZSxcclxuICAvLyAgICAgICAgIGZhcmVJZGVudGlmaWVyOiB0a3QuaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAvLyAgICAgICB9O1xyXG4gIC8vICAgICAgIGlmICh0aWNrZXRzW2tleV0pIHtcclxuICAvLyAgICAgICAgIHRoaXMudXBkYXRlQ2FuQ29tYmluZSh0a3QpO1xyXG4gIC8vICAgICAgICAgaWRlbnRpZmllck9ialt0a3QuaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXJdLmlzQ2hpbGQgPSBmYWxzZTtcclxuICAvLyAgICAgICAgIGlmICh0aWNrZXRzW3RrdC50eXBlXS5oZWFkZXIucHJpY2UgPT09IHRrdC5wcmljZSkge1xyXG4gIC8vICAgICAgICAgICB0aWNrZXRzW3RrdC50eXBlXS5yZXN1bHRJbmRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcclxuICAvLyAgICAgICAgICAgdGlja2V0c1t0a3QudHlwZV0ucmVzdWx0SW5kaWZpZXJzUHJpY2VzID0ge1xyXG4gIC8vICAgICAgICAgICAgIC4uLnRpY2tldHNbdGt0LnR5cGVdLnJlc3VsdEluZGlmaWVyc1ByaWNlcyxcclxuICAvLyAgICAgICAgICAgICAuLi5pZGVudGlmaWVyT2JqXHJcbiAgLy8gICAgICAgICAgIH07XHJcbiAgLy8gICAgICAgICB9IGVsc2UgaWYgKHRrdC5wcmljZSkge1xyXG4gIC8vICAgICAgICAgICBpZGVudGlmaWVyT2JqW2lkZW50aWZpZXJdLmlzQ2hpbGQgPSB0cnVlO1xyXG4gIC8vICAgICAgICAgICBjb25zdCBjaGlsZFRpY2tldCA9IHtcclxuICAvLyAgICAgICAgICAgICBoZWFkZXI6IHRrdCxcclxuICAvLyAgICAgICAgICAgICBjaGlsZHJlbjogW10sXHJcbiAgLy8gICAgICAgICAgICAgb3BlbjogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgICAgZGlyZWN0aW9uOiBSYWlsRGlyZWN0aW9uLk91dGJvdW5kLFxyXG4gIC8vICAgICAgICAgICAgIHJlc3VsdEluZGlmaWVyczogW2lkZW50aWZpZXJdLFxyXG4gIC8vICAgICAgICAgICAgIHJlc3VsdEluZGlmaWVyc1ByaWNlczogaWRlbnRpZmllck9iaixcclxuICAvLyAgICAgICAgICAgICBjaGlsZDogdHJ1ZSxcclxuICAvLyAgICAgICAgICAgICB0aWNrZXRJZCxcclxuICAvLyAgICAgICAgICAgICBzZWxlY3RlZEluZGljaWVzOiBbXSxcclxuICAvLyAgICAgICAgICAgICBkaXNhYmxlZEluZGljaWVzOiBbXVxyXG4gIC8vICAgICAgICAgICB9IGFzIFJhaWxUaWNrZXRHcm91cDtcclxuICAvLyAgICAgICAgICAgdGlja2V0c1t0a3QudHlwZV0uY2hpbGRyZW4ucHVzaChjaGlsZFRpY2tldCk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHRoaXMuX2NhbkNvbWJpbmVbdGt0LnR5cGVdID0ge307XHJcbiAgLy8gICAgICAgICB0aGlzLnVwZGF0ZUNhbkNvbWJpbmUodGt0KTtcclxuICAvLyAgICAgICAgIHRpY2tldHNbdGt0LnR5cGVdID0ge1xyXG4gIC8vICAgICAgICAgICBoZWFkZXI6IHRrdCxcclxuICAvLyAgICAgICAgICAgY2hpbGRyZW46IFtdLFxyXG4gIC8vICAgICAgICAgICBvcGVuOiBmYWxzZSxcclxuICAvLyAgICAgICAgICAgZGlyZWN0aW9uOiBSYWlsRGlyZWN0aW9uLk91dGJvdW5kLFxyXG4gIC8vICAgICAgICAgICByZXN1bHRJbmRpZmllcnM6IFtpZGVudGlmaWVyXSxcclxuICAvLyAgICAgICAgICAgcmVzdWx0SW5kaWZpZXJzUHJpY2VzOiBpZGVudGlmaWVyT2JqLFxyXG4gIC8vICAgICAgICAgICBjaGlsZDogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgIHRpY2tldElkLFxyXG4gIC8vICAgICAgICAgICBzZWxlY3RlZEluZGljaWVzOiBbXSxcclxuICAvLyAgICAgICAgICAgZGlzYWJsZWRJbmRpY2llczogW11cclxuICAvLyAgICAgICAgIH0gYXMgUmFpbFRpY2tldEdyb3VwO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9KTtcclxuXHJcbiAgLy8gICBPYmplY3Qua2V5cyh0aWNrZXRHcm91cHNSZXR1cm4pLm1hcCgoa2V5KSA9PiB7XHJcbiAgLy8gICAgIHRpY2tldEdyb3Vwc1JldHVybltrZXldLm1hcCgodGt0OiBSYWlsVGlja2V0T3B0aW9uKSA9PiB7XHJcbiAgLy8gICAgICAgdGlja2V0SWQgPSBgJHt0a3QudHlwZX0ke3RrdC5zaW5nbGVPclJldHVybn1gO1xyXG4gIC8vICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0a3QuaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXI7XHJcbiAgLy8gICAgICAgY29uc3QgaWRlbnRpZmllck9iajogUmFpbFJlc3VsdEluZGlmaWVycyA9IHt9O1xyXG4gIC8vICAgICAgIGlkZW50aWZpZXJPYmpbaWRlbnRpZmllcl0gPSB7XHJcbiAgLy8gICAgICAgICBwcmljZTogdGt0LnByaWNlLFxyXG4gIC8vICAgICAgICAgaXNDaGlsZDogdHJ1ZSxcclxuICAvLyAgICAgICAgIGZhcmVJZGVudGlmaWVyOiB0a3QuaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAvLyAgICAgICB9O1xyXG4gIC8vICAgICAgIGlmIChcclxuICAvLyAgICAgICAgIHRpY2tldHNbdGt0LnR5cGVdICYmXHJcbiAgLy8gICAgICAgICB0a3QucHJpY2UgJiZcclxuICAvLyAgICAgICAgIHRrdC5wcmljZSAhPT0gdGlja2V0c1t0a3QudHlwZV0uaGVhZGVyLnByaWNlXHJcbiAgLy8gICAgICAgKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLnVwZGF0ZUNhbkNvbWJpbmUodGt0KTtcclxuICAvLyAgICAgICAgIGlkZW50aWZpZXJPYmpbaWRlbnRpZmllcl0uaXNDaGlsZCA9IHRydWU7XHJcbiAgLy8gICAgICAgICBjb25zdCBjaGlsZFRpY2tldCA9IHtcclxuICAvLyAgICAgICAgICAgaGVhZGVyOiB0a3QsXHJcbiAgLy8gICAgICAgICAgIGNoaWxkcmVuOiBbXSxcclxuICAvLyAgICAgICAgICAgb3BlbjogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgIGRpcmVjdGlvbjogUmFpbERpcmVjdGlvbi5JbmJvdW5kLFxyXG4gIC8vICAgICAgICAgICByZXN1bHRJbmRpZmllcnM6IFtpZGVudGlmaWVyXSxcclxuICAvLyAgICAgICAgICAgcmVzdWx0SW5kaWZpZXJzUHJpY2VzOiBpZGVudGlmaWVyT2JqLFxyXG4gIC8vICAgICAgICAgICBjaGlsZDogdHJ1ZSxcclxuICAvLyAgICAgICAgICAgdGlja2V0SWQsXHJcbiAgLy8gICAgICAgICAgIHNlbGVjdGVkSW5kaWNpZXM6IFtdLFxyXG4gIC8vICAgICAgICAgICBkaXNhYmxlZEluZGljaWVzOiBbXVxyXG4gIC8vICAgICAgICAgfSBhcyBhbnk7XHJcbiAgLy8gICAgICAgICB0aWNrZXRzW3RrdC50eXBlXS5jaGlsZHJlbi5wdXNoKGNoaWxkVGlja2V0KTtcclxuICAvLyAgICAgICB9IGVsc2UgaWYgKCF0aWNrZXRzW3RrdC50eXBlXSkge1xyXG4gIC8vICAgICAgICAgdGhpcy51cGRhdGVDYW5Db21iaW5lKHRrdCk7XHJcbiAgLy8gICAgICAgICB0aWNrZXRzW3RrdC50eXBlXSA9IHtcclxuICAvLyAgICAgICAgICAgaGVhZGVyOiB0a3QsXHJcbiAgLy8gICAgICAgICAgIGNoaWxkcmVuOiBbXSxcclxuICAvLyAgICAgICAgICAgb3BlbjogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgIGRpcmVjdGlvbjogUmFpbERpcmVjdGlvbi5JbmJvdW5kLFxyXG4gIC8vICAgICAgICAgICByZXN1bHRJbmRpZmllcnM6IFtpZGVudGlmaWVyXSxcclxuICAvLyAgICAgICAgICAgcmVzdWx0SW5kaWZpZXJzUHJpY2VzOiBpZGVudGlmaWVyT2JqLFxyXG4gIC8vICAgICAgICAgICBjaGlsZDogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgIHRpY2tldElkLFxyXG4gIC8vICAgICAgICAgICBzZWxlY3RlZEluZGljaWVzOiBbXSxcclxuICAvLyAgICAgICAgICAgZGlzYWJsZWRJbmRpY2llczogW11cclxuICAvLyAgICAgICAgIH0gYXMgYW55O1xyXG4gIC8vICAgICAgIH0gZWxzZSBpZiAoIXRrdC5wcmljZSB8fCB0a3QucHJpY2UgPT09IHRpY2tldHNbdGt0LnR5cGVdLmhlYWRlci5wcmljZSkge1xyXG4gIC8vICAgICAgICAgdGhpcy51cGRhdGVDYW5Db21iaW5lKHRrdCk7XHJcbiAgLy8gICAgICAgICB0aWNrZXRzW3RrdC50eXBlXS5yZXN1bHRJbmRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcclxuICAvLyAgICAgICAgIGlkZW50aWZpZXJPYmpbaWRlbnRpZmllcl0uaXNDaGlsZCA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgdGlja2V0c1t0a3QudHlwZV0ucmVzdWx0SW5kaWZpZXJzUHJpY2VzID0ge1xyXG4gIC8vICAgICAgICAgICAuLi50aWNrZXRzW3RrdC50eXBlXS5yZXN1bHRJbmRpZmllcnNQcmljZXMsXHJcbiAgLy8gICAgICAgICAgIC4uLmlkZW50aWZpZXJPYmpcclxuICAvLyAgICAgICAgIH07XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KTtcclxuICAvLyAgIH0pO1xyXG5cclxuICAvLyAgIGxldCBjb21iaW5lVGlja2V0cyA9IHsgLi4udGlja2V0cyB9O1xyXG4gIC8vICAgdGlja2V0cyA9IHRoaXMuY29tYmluZUNoaWxkVGlja2V0cyhjb21iaW5lVGlja2V0cyk7XHJcblxyXG4gIC8vICAgLy8gY29uc29sZS5sb2coJ2dyb3VwczogJywgdGlja2V0cyk7XHJcbiAgLy8gICAvLyBjb25zb2xlLmxvZygnQ2FuIENvbWJpbmU6ICcsIHRoaXMuX2NhbkNvbWJpbmUpO1xyXG4gIC8vICAgcmV0dXJuIHRpY2tldHM7XHJcbiAgLy8gfVxyXG5cclxuICBjb21iaW5lQ2hpbGRUaWNrZXRzKHRpY2tldHM6IFJhaWxUaWNrZXRHcm91cHMpOiBSYWlsVGlja2V0R3JvdXBzIHtcclxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXModGlja2V0cyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBSYWlsVGlja2V0R3JvdXAgfSA9IHt9O1xyXG5cclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZXNbaV0uY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBjaGlsZCA9IHZhbHVlc1tpXS5jaGlsZHJlbltqXTtcclxuICAgICAgICBjb25zdCBmYXJlSWRlbnRpZmllciA9IGNoaWxkLmhlYWRlci5pZGVudGlmaWVycy5mYXJlSWRlbnRpZmllcjtcclxuICAgICAgICBpZiAoY2hpbGRPYmplY3RbZmFyZUlkZW50aWZpZXJdKSB7XHJcbiAgICAgICAgICBjaGlsZE9iamVjdFtmYXJlSWRlbnRpZmllcl0ucmVzdWx0SW5kaWZpZXJzLnB1c2goXHJcbiAgICAgICAgICAgIGNoaWxkLnJlc3VsdEluZGlmaWVyc1swXVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNoaWxkT2JqZWN0W2ZhcmVJZGVudGlmaWVyXS5yZXN1bHRJbmRpZmllcnNQcmljZXMgPSB7XHJcbiAgICAgICAgICAgIC4uLmNoaWxkT2JqZWN0W2ZhcmVJZGVudGlmaWVyXS5yZXN1bHRJbmRpZmllcnNQcmljZXMsXHJcbiAgICAgICAgICAgIC4uLmNoaWxkLnJlc3VsdEluZGlmaWVyc1ByaWNlc1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2hpbGRPYmplY3RbZmFyZUlkZW50aWZpZXJdID0gY2hpbGQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGNoaWxkT2JqZWN0KTtcclxuICAgICAgLy8gY29uc29sZS5sb2codmFsdWVzW2ldWydoZWFkZXInXVsndHlwZSddKTtcclxuICAgICAgdGlja2V0c1t2YWx1ZXNbaV0uaGVhZGVyLnR5cGVdLmNoaWxkcmVuID0gT2JqZWN0LnZhbHVlcyhjaGlsZE9iamVjdCk7XHJcbiAgICB9XHJcbiAgICAvLyB0aWNrZXRzID0gdGhpcy5zb3J0VGlja2V0Q2hpbGRyZW5QcmljZXModGlja2V0cyk7XHJcbiAgICByZXR1cm4gdGlja2V0cztcclxuICB9XHJcbiAgc2V0VGlja2V0c0dyb3VwcyhyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uW10pOiBhbnkge1xyXG4gICAgbGV0IHRpY2tldEdyb3VwczogYW55ID0ge307XHJcbiAgICByZXN1bHRzLmZvckVhY2goKG91dDogSXJsSm91cm5leU9wdGlvbikgPT4ge1xyXG4gICAgICBvdXQucHJvdmlkZXJzLmZvckVhY2goKHByb3Y6IElybFByb3ZpZGVyKSA9PiB7XHJcbiAgICAgICAgcHJvdi50aWNrZXRPcHRpb25zLmZvckVhY2goKHRrdDogSXJsVGlja2V0T3B0aW9uKSA9PiB7XHJcbiAgICAgICAgICB0aWNrZXRHcm91cHNbdGt0LnR5cGVdXHJcbiAgICAgICAgICAgID8gdGlja2V0R3JvdXBzW3RrdC50eXBlXS5wdXNoKHRrdClcclxuICAgICAgICAgICAgOiAodGlja2V0R3JvdXBzW3RrdC50eXBlXSA9IFt0a3RdKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aWNrZXRHcm91cHM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHsgfVxyXG5cclxuICB1cGRhdGVDYW5Db21iaW5lKHRrdDogSXJsVGlja2V0T3B0aW9uKTogdm9pZCB7XHJcbiAgICAodGt0LmlkZW50aWZpZXJzLmFsbG93ZWRXaXRoIHx8IFtdKS5mb3JFYWNoKChhbGxvd2VkKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5fY2FuQ29tYmluZVt0a3QudHlwZV1bYWxsb3dlZC5qb3VybmV5SWRlbnRpZmllcl0pIHtcclxuICAgICAgICB0aGlzLl9jYW5Db21iaW5lW3RrdC50eXBlXVthbGxvd2VkLmpvdXJuZXlJZGVudGlmaWVyXSA9IFtcclxuICAgICAgICAgIGFsbG93ZWQuZmFyZUlkZW50aWZpZXJcclxuICAgICAgICBdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2NhbkNvbWJpbmVbdGt0LnR5cGVdW2FsbG93ZWQuam91cm5leUlkZW50aWZpZXJdLnB1c2goXHJcbiAgICAgICAgICBhbGxvd2VkLmZhcmVJZGVudGlmaWVyXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyB0b2dnbGVUaWNrZXRTZWxlY3QoXHJcbiAgLy8gICB0aWNrZXQ6IElybFRpY2tldEdyb3VwLFxyXG4gIC8vICAgd2F5OiAnZGVwYXJ0cycgfCAncmV0dXJucycsXHJcbiAgLy8gICB0aW1lU2xvdElkOiBzdHJpbmcsXHJcbiAgLy8gICB0aWNrZXRJZDogc3RyaW5nLFxyXG4gIC8vICAgZmFyZUlkZW50aWZpZXI6IHN0cmluZyxcclxuICAvLyAgIHRpY2tldHNHcm91cHM6IElybFRpY2tldEdyb3Vwc1xyXG4gIC8vICk6IElybFRpY2tldEdyb3VwcyB7XHJcbiAgLy8gICBpZiAoIXRpY2tldCkge1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGlja2V0c0dyb3Vwcyk7XHJcbiAgLy8gICBsZXQgc2VsZWN0ZWRUaWNrZXQgPSBudWxsO1xyXG4gIC8vICAgbGV0IGRlcGFydHNUaWNrZXQ6IElybFRpY2tldE9wdGlvbltdID0gW107XHJcbiAgLy8gICBsZXQgcmV0dXJuVGlja2V0OiBJcmxUaWNrZXRPcHRpb25bXSA9IFtdO1xyXG4gIC8vICAgbGV0IGlzVW5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gIC8vICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAvLyAgICAgbGV0IGdyb3VwID0gdGlja2V0c0dyb3Vwc1trZXldIGFzIFJhaWxUaWNrZXRHcm91cDtcclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICBncm91cC50aWNrZXRJZCA9PT0gdGlja2V0SWQgJiZcclxuICAvLyAgICAgICBncm91cC5zZWxlY3RlZEluZGljaWVzLmluY2x1ZGVzKHRpbWVTbG90SWQpXHJcbiAgLy8gICAgICkge1xyXG4gIC8vICAgICAgIGlmICh3YXkgPT09ICdkZXBhcnRzJykge1xyXG4gIC8vICAgICAgICAgZ3JvdXAuc2VsZWN0ZWRJbmRpY2llcyA9IFtdO1xyXG4gIC8vICAgICAgICAgZGVwYXJ0c1RpY2tldCA9IFtdO1xyXG4gIC8vICAgICAgICAgcmV0dXJuVGlja2V0ID0gW107XHJcbiAgLy8gICAgICAgICB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0ID0gbnVsbDtcclxuICAvLyAgICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRKb3VybmV5ID0gbnVsbDtcclxuICAvLyAgICAgICAgIGdyb3VwLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNoaWxkLnNlbGVjdGVkSW5kaWNpZXMgPSBbXTtcclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICBncm91cC5zZWxlY3RlZEluZGljaWVzID0gZ3JvdXAuc2VsZWN0ZWRJbmRpY2llcy5maWx0ZXIoXHJcbiAgLy8gICAgICAgICAgIChJbmRpY2llcykgPT4gSW5kaWNpZXMgIT09IHRpbWVTbG90SWRcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICByZXR1cm5UaWNrZXQgPSByZXR1cm5UaWNrZXQuZmlsdGVyKFxyXG4gIC8vICAgICAgICAgICAoSW5kaWNpZXMpID0+IEluZGljaWVzICE9PSBncm91cC5oZWFkZXJcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIGlmIChcclxuICAvLyAgICAgICAgIGdyb3VwLnRpY2tldElkID09PSB0aWNrZXRJZCAmJlxyXG4gIC8vICAgICAgICAgZ3JvdXAuaGVhZGVyLmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyID09PSBmYXJlSWRlbnRpZmllciAmJlxyXG4gIC8vICAgICAgICAgd2F5ID09PSAnZGVwYXJ0cydcclxuICAvLyAgICAgICApIHtcclxuICAvLyAgICAgICAgIGdyb3VwID0gdGhpcy5jbGVhclVubmVlZGVkVGlja2V0cyh3YXksIGdyb3VwLCB0aW1lU2xvdElkKTtcclxuICAvLyAgICAgICAgIGdyb3VwLnNlbGVjdGVkSW5kaWNpZXMucHVzaCh0aW1lU2xvdElkKTtcclxuICAvLyAgICAgICAgIHdheSA9PT0gJ2RlcGFydHMnXHJcbiAgLy8gICAgICAgICAgID8gZGVwYXJ0c1RpY2tldC5wdXNoKGdyb3VwLmhlYWRlcilcclxuICAvLyAgICAgICAgICAgOiByZXR1cm5UaWNrZXQucHVzaChncm91cC5oZWFkZXIpO1xyXG4gIC8vICAgICAgICAgc2VsZWN0ZWRUaWNrZXQgPSBncm91cC5oZWFkZXI7XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIC8vIG1heSBoYXZlIHRvIG1vZGlmeSB0aGlzIGZvciBkdWFsIHNpbmdsZXNcclxuICAvLyAgICAgICAgIGlmICh3YXkgPT09ICdkZXBhcnRzJykge1xyXG4gIC8vICAgICAgICAgICBncm91cC5zZWxlY3RlZEluZGljaWVzID0gW107XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICBzZWxlY3RlZFRpY2tldCA9IGdyb3VwLmhlYWRlcjtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcblxyXG4gIC8vICAgICAgIGdyb3VwLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoY2hpbGQuc2VsZWN0ZWRJbmRpY2llcy5pbmNsdWRlcyh0aW1lU2xvdElkKSkge1xyXG4gIC8vICAgICAgICAgICBpZiAod2F5ID09PSAnZGVwYXJ0cycpIHtcclxuICAvLyAgICAgICAgICAgICBjaGlsZC5zZWxlY3RlZEluZGljaWVzID0gW107XHJcbiAgLy8gICAgICAgICAgICAgZGVwYXJ0c1RpY2tldCA9IFtdO1xyXG4gIC8vICAgICAgICAgICAgIHJldHVyblRpY2tldCA9IFtdO1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRUaWNrZXQgPSBudWxsO1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRKb3VybmV5ID0gbnVsbDtcclxuICAvLyAgICAgICAgICAgICBpc1Vuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIGNoaWxkLnNlbGVjdGVkSW5kaWNpZXMgPSBjaGlsZC5zZWxlY3RlZEluZGljaWVzLmZpbHRlcihcclxuICAvLyAgICAgICAgICAgICAgIChJbmRpY2llcykgPT4gSW5kaWNpZXMgIT09IHRpbWVTbG90SWRcclxuICAvLyAgICAgICAgICAgICApO1xyXG4gIC8vICAgICAgICAgICAgIHJldHVyblRpY2tldCA9IHJldHVyblRpY2tldC5maWx0ZXIoXHJcbiAgLy8gICAgICAgICAgICAgICAoSW5kaWNpZXMpID0+IEluZGljaWVzICE9PSBncm91cC5oZWFkZXJcclxuICAvLyAgICAgICAgICAgICApO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICBpZiAoXHJcbiAgLy8gICAgICAgICAgICAgY2hpbGQudGlja2V0SWQgPT09IHRpY2tldElkICYmXHJcbiAgLy8gICAgICAgICAgICAgY2hpbGQuaGVhZGVyLmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyID09PSBmYXJlSWRlbnRpZmllclxyXG4gIC8vICAgICAgICAgICApIHtcclxuICAvLyAgICAgICAgICAgICBpZiAoXHJcbiAgLy8gICAgICAgICAgICAgICAod2F5ID09PSAnZGVwYXJ0cycgJiZcclxuICAvLyAgICAgICAgICAgICAgICAgY2hpbGQuZGlyZWN0aW9uICE9PSBSYWlsRGlyZWN0aW9uLkluYm91bmQpIHx8XHJcbiAgLy8gICAgICAgICAgICAgICAod2F5ICE9PSAnZGVwYXJ0cycgJiYgY2hpbGQuZGlyZWN0aW9uID09PSBSYWlsRGlyZWN0aW9uLkluYm91bmQpXHJcbiAgLy8gICAgICAgICAgICAgKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2xlYXJVbm5lZWRlZFRpY2tldHMod2F5LCBjaGlsZCwgdGltZVNsb3RJZCk7XHJcbiAgLy8gICAgICAgICAgICAgICBjaGlsZC5zZWxlY3RlZEluZGljaWVzLnB1c2godGltZVNsb3RJZCk7XHJcbiAgLy8gICAgICAgICAgICAgICB3YXkgPT09ICdkZXBhcnRzJ1xyXG4gIC8vICAgICAgICAgICAgICAgICA/IGRlcGFydHNUaWNrZXQucHVzaChjaGlsZC5oZWFkZXIpXHJcbiAgLy8gICAgICAgICAgICAgICAgIDogcmV0dXJuVGlja2V0LnB1c2goY2hpbGQuaGVhZGVyKTtcclxuICAvLyAgICAgICAgICAgICAgIHNlbGVjdGVkVGlja2V0ID0gY2hpbGQuaGVhZGVyO1xyXG4gIC8vICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNVbnNlbGVjdGVkKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjaGlsZC5zZWxlY3RlZEluZGljaWVzID0gW107XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIGNoaWxkLnNlbGVjdGVkSW5kaWNpZXMgPSBbXTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuXHJcbiAgLy8gICAvLyBub3cgd2UgbmVlZCB0byBtYXJrIHRpY2tldHMgYXMgZGlzYWJsZWQgaWYgdGhleSBhcmUgcmV0dXJucyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgc2VsZWN0ZWQgcmV0dXJuXHJcbiAgLy8gICAvLyBvciBvbiBvdmVybGFwcGluZyB0aW1lc1xyXG4gIC8vICAgaWYgKHdheSA9PT0gJ2RlcGFydHMnKSB7XHJcbiAgLy8gICAgIHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0ID0gdGhpcy5oZWxwZXJzLmNsb25lKHNlbGVjdGVkVGlja2V0KTtcclxuXHJcbiAgLy8gICAgIC8vIG5vdyBnbyBvdmVyIHRoZSBmdWxsIHJlc3VsdHMgYW5kIGZpbmQgdGhlIG1hdGNoaW5nIHRpbWVzbG90XHJcbiAgLy8gICAgIGRlcGFydHNUaWNrZXQubGVuZ3RoXHJcbiAgLy8gICAgICAgPyAodGhpcy5fY2hvc2VuT3V0Ym91bmRKb3VybmV5ID0gdGhpcy5yZXN1bHRzLnZhbHVlWzBdLm91dGJvdW5kLmZpbmQoXHJcbiAgLy8gICAgICAgICAgIChvdXQ6IFJhaWxKb3VybmV5T3B0aW9uKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuIG91dC5pZGVudGlmaWVycy5qb3VybmV5SWRlbnRpZmllciA9PT0gdGltZVNsb3RJZDtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgKSlcclxuICAvLyAgICAgICA6ICh0aGlzLl9jaG9zZW5PdXRib3VuZEpvdXJuZXkgPSBudWxsKTtcclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0ICYmXHJcbiAgLy8gICAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQuc2luZ2xlT3JSZXR1cm4gPT09ICdSZXR1cm4nICYmXHJcbiAgLy8gICAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQuaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXIgIT09XHJcbiAgLy8gICAgICAgICB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0LmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyXHJcbiAgLy8gICAgICkge1xyXG4gIC8vICAgICAgIGNvbnNvbGUud2FybignKysrIENhbm5vdCBjb21iaW5lIGZhcmVzLCBjbGVhcmluZyBpbmJvdW5kLi4uICsrKycpO1xyXG4gIC8vICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRUaWNrZXQgPSBudWxsO1xyXG4gIC8vICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRKb3VybmV5ID0gbnVsbDtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSBlbHNlIGlmICh3YXkgPT09ICdyZXR1cm5zJykge1xyXG4gIC8vICAgICB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0ID0gdGhpcy5oZWxwZXJzLmNsb25lKHNlbGVjdGVkVGlja2V0KTtcclxuXHJcbiAgLy8gICAgIHRoaXMuX2Nob3NlbkluYm91bmRUaWNrZXRcclxuICAvLyAgICAgICA/ICh0aGlzLl9jaG9zZW5JbmJvdW5kSm91cm5leSA9IHRoaXMucmVzdWx0cy52YWx1ZVswXS5yZXR1cm4uZmluZChcclxuICAvLyAgICAgICAgICAgKGluVDogUmFpbEpvdXJuZXlPcHRpb24pID0+IHtcclxuICAvLyAgICAgICAgICAgICByZXR1cm4gaW5ULmlkZW50aWZpZXJzLmpvdXJuZXlJZGVudGlmaWVyID09PSB0aW1lU2xvdElkO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICApKVxyXG4gIC8vICAgICAgIDogKHRoaXMuX2Nob3NlbkluYm91bmRKb3VybmV5ID0gbnVsbCk7XHJcbiAgLy8gICB9XHJcblxyXG4gIC8vICAgY29uc29sZS5sb2codGhpcy5jaG9zZW5PdXRib3VuZEpvdXJuZXkpO1xyXG4gIC8vICAgY29uc29sZS5sb2codGhpcy5fY2hvc2VuSW5ib3VuZEpvdXJuZXkpO1xyXG4gIC8vICAgcmV0dXJuIHRpY2tldHNHcm91cHM7XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBkZXRlcm1pbmUgaWYgYSBmYXJlIGNhbiBiZSBjb21iaW5lZCB3aXRoIHdoYXQgd2UgY3VycmVudGx5IGhhdmUgc2VsZWN0ZWRcclxuICAgKi9cclxuICAvLyBjYW5Db21iaW5lKGpvdXJuZXlJZGVudGlmaWVyOiBzdHJpbmcsIGZhcmVJZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAvLyAgIC8vIG1heSBoYXZlIHRvIG1vZGlmeSB0aGlzIGZvciBkdWFsIHNpbmdsZXMgbGF0ZXIgb25cclxuICAvLyAgIGlmIChcclxuICAvLyAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQgJiZcclxuICAvLyAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQuc2luZ2xlT3JSZXR1cm4gPT09ICdSZXR1cm4nICYmXHJcbiAgLy8gICAgIE51bWJlcihqb3VybmV5SWRlbnRpZmllcikgPiA1XHJcbiAgLy8gICApIHtcclxuICAvLyAgICAgLy8gZ3JlYXRlciB0aGFuIDUgb25seSBhcyB3ZSBhcmUgbm90IGdvaW5nIHRvIHJlc3RyaWN0IG91dGJvdW5kc1xyXG4gIC8vICAgICBpZiAoXHJcbiAgLy8gICAgICAgdGhpcy5fY2FuQ29tYmluZVt0aGlzLl9jaG9zZW5PdXRib3VuZFRpY2tldC50eXBlXVtcclxuICAvLyAgICAgICAgIE51bWJlcihqb3VybmV5SWRlbnRpZmllcilcclxuICAvLyAgICAgICBdPy5pbmNsdWRlcyhmYXJlSWRlbnRpZmllcikgJiZcclxuICAvLyAgICAgICB0aGlzLl9jaG9zZW5PdXRib3VuZFRpY2tldC5pZGVudGlmaWVycy5mYXJlSWRlbnRpZmllciA9PT0gZmFyZUlkZW50aWZpZXJcclxuICAvLyAgICAgKSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIHRydWU7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIHJldHVybiBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIGNsZWFyVW5uZWVkZWRUaWNrZXRzKFxyXG4gICAgd2F5OiBzdHJpbmcsXHJcbiAgICBncm91cDogUmFpbFRpY2tldEdyb3VwLFxyXG4gICAgdGltZVNsb3RJZDogc3RyaW5nXHJcbiAgKTogUmFpbFRpY2tldEdyb3VwIHtcclxuICAgIGlmICh3YXkgPT09ICdyZXR1cm5zJykge1xyXG4gICAgICBncm91cC5zZWxlY3RlZEluZGljaWVzID0gZ3JvdXAuc2VsZWN0ZWRJbmRpY2llcy5maWx0ZXIoXHJcbiAgICAgICAgKGluZGljaWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIE51bWJlcihpbmRpY2llKSA8PSA1IHx8IGluZGljaWUgPT09IHRpbWVTbG90SWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JvdXAuc2VsZWN0ZWRJbmRpY2llcyA9IGdyb3VwLnNlbGVjdGVkSW5kaWNpZXMuZmlsdGVyKFxyXG4gICAgICAgIChpbmRpY2llOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHJldHVybiBOdW1iZXIoaW5kaWNpZSkgPiA1IHx8IGluZGljaWUgPT09IHRpbWVTbG90SWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncm91cDtcclxuICB9XHJcblxyXG4gIC8vIGdldFJhaWxTdGF0aW9uKFxyXG4gIC8vICAgY29kZTogc3RyaW5nLFxyXG4gIC8vICAgaXNMb2FkaW5nOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICAvLyApOiBPYnNlcnZhYmxlPElybFN0YXRpb24+IHtcclxuICAvLyAgIGlmIChjb2RlLmxlbmd0aCA9PT0gMykge1xyXG4gIC8vICAgICBpc0xvYWRpbmc/Lm5leHQodHJ1ZSk7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLmdldFJhaWxTdGF0aW9uRmV0Y2hlci5mZXRjaExpc3QoeyBjb2RlIH0pLnBpcGUoXHJcbiAgLy8gICAgICAgdGFwKCgpID0+IGlzTG9hZGluZz8ubmV4dChmYWxzZSkpLFxyXG4gIC8vICAgICAgIHRha2UoMSlcclxuICAvLyAgICAgKTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHJldHVybiBvZigpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0U2VsZWN0ZWRpcmxUaWNrZXRPcHRpb24oXHJcbiAgLy8gICBpcmxKb3VybmV5T3B0aW9uOiBJcmxKb3VybmV5T3B0aW9uLFxyXG4gIC8vICAgaXJsVGlja2V0R3JvdXA6IElybFRpY2tldEdyb3VwLFxyXG4gIC8vICAgcHJvdmlkZXJJbmRleDogbnVtYmVyXHJcbiAgLy8gKTogSXJsVGlja2V0T3B0aW9uIHtcclxuICAvLyAgIHJldHVybiBpcmxKb3VybmV5T3B0aW9uLnByb3ZpZGVyc1twcm92aWRlckluZGV4XS50aWNrZXRPcHRpb25zLmZpbmQoXHJcbiAgLy8gICAgICh0aWNrZXRPcHRpb24pID0+XHJcbiAgLy8gICAgICAgdGlja2V0T3B0aW9uLnR5cGUgPT09IGlybFRpY2tldEdyb3VwLmhlYWRlci50eXBlICYmXHJcbiAgLy8gICAgICAgdGlja2V0T3B0aW9uLnByaWNlID09PSBpcmxUaWNrZXRHcm91cC5oZWFkZXIucHJpY2VcclxuICAvLyAgICk7XHJcbiAgLy8gfVxyXG5cclxuICBnZXRMZWdzRnJvbVJhaWxKb3VybmV5T3B0aW9uKHJhaWxKb3VybmV5T3B0aW9uOiBJcmxKb3VybmV5T3B0aW9uKTogYW55W10ge1xyXG4gICAgbGV0IGxlZ3M6IGFueVtdID0gW107XHJcbiAgICBpZiAocmFpbEpvdXJuZXlPcHRpb24/LnNlZ21lbnRzLmxlbmd0aCkge1xyXG4gICAgICBsZWdzID0gcmFpbEpvdXJuZXlPcHRpb24uc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIG9wZXJhdG9yOiBzZWdtZW50Lm9wZXJhdG9yLFxyXG4gICAgICAgICAgZGVwYXJ0dXJlRGF0ZVRpbWU6IHNlZ21lbnQuZGVwYXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICBkZXBhcnR1cmVTdGF0aW9uTmFtZTogc2VnbWVudC5kZXBhcnQsXHJcbiAgICAgICAgICBhcnJpdmFsRGF0ZVRpbWU6IHNlZ21lbnQuYXJyaXZlRGF0ZVRpbWUsXHJcbiAgICAgICAgICBhcnJpdmFsU3RhdGlvbk5hbWU6IHNlZ21lbnQuYXJyaXZlXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVncztcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFNpbmdsZUpvdXJuZXlUb0Jhc2tldChcclxuICAgIHNlcnZpY2VJZDogc3RyaW5nLFxyXG4gICAgcmFpbFF1ZXJ5OiBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyxcclxuICAgIGlybEpvdXJuZXlPcHRpb246IElybFRpY2tldCxcclxuICAgIC8vIHJhaWxUaWNrZXRHcm91cDogSXJsVGlja2V0R3JvdXBcclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKHNlcnZpY2VJZCxyYWlsUXVlcnksaXJsSm91cm5leU9wdGlvbilcclxuICAgIC8vIGlmIChpcmxKb3VybmV5T3B0aW9uLnVuc2VsbGFibGUpIHtcclxuICAgIC8vICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAvLyB9XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgLy8gY29uc3Qgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24gPSB0aGlzLmdldFNlbGVjdGVkSXJsVGlja2V0T3B0aW9uKFxyXG4gICAgICAvLyAgIGlybEpvdXJuZXlPcHRpb24sXHJcbiAgICAgIC8vICAgcmFpbFRpY2tldEdyb3VwLFxyXG4gICAgICAvLyAgIDBcclxuICAgICAgLy8gKTtcclxuICAgICAgLy8gY29uc3QgbGVncyA9IHRoaXMuZ2V0TGVnc0Zyb21SYWlsSm91cm5leU9wdGlvbihyYWlsSm91cm5leU9wdGlvbik7XHJcbiAgICAgIC8vIGNvbnN0IHRpY2tldFF1ZXVlTGlzdCA9IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLnRpY2tldFF1ZXVlTGlzdC5tYXAoXHJcbiAgICAgIC8vICAgKHRpY2tldFF1ZXVlTGlzdCkgPT4ge1xyXG4gICAgICAvLyAgICAgcmV0dXJuIHtcclxuICAgICAgLy8gICAgICAgaWQ6IHRpY2tldFF1ZXVlTGlzdC5pZCxcclxuICAgICAgLy8gICAgICAgbmFtZTogdGlja2V0UXVldWVMaXN0Lm5hbWUsXHJcbiAgICAgIC8vICAgICAgIHR5cGU6IHRpY2tldFF1ZXVlTGlzdC50eXBlXHJcbiAgICAgIC8vICAgICB9O1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gKTtcclxuICAgIC8vICAgY29uc3QgYmFza2V0SXRlbSA9IHtcclxuICAgIC8vICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgIC8vICAgICBzZXJ2aWNlOiBzZXJ2aWNlSWQsXHJcbiAgICAvLyAgICAgZGV0YWlsOiB7XHJcbiAgICAvLyAgICAgICAvLyBhY2NvdW50c0xpc3Q6IGlybEpvdXJuZXlPcHRpb24uYWNjb3VudHNMaXN0Lm1hcChcclxuICAgIC8vICAgICAgIC8vICAgKGFjY291bnQ6IFJhaWxBY2NvdW50KSA9PiB7XHJcbiAgICAvLyAgICAgICAvLyAgICAgcmV0dXJuIHsgaWQ6IGFjY291bnQuaWQsIGRlc2NyaXB0aW9uOiBhY2NvdW50LmRlc2NyaXB0aW9uIH07XHJcbiAgICAvLyAgICAgICAvLyAgIH1cclxuICAgIC8vICAgICAgIC8vICksXHJcbiAgICAvLyAgICAgICBvdXR3YXJkRGV0YWlsOiB7XHJcbiAgICAvLyAgICAgICAgIGFycml2YWxEYXRlVGltZTogcmFpbEpvdXJuZXlPcHRpb24uYXJyaXZlRGF0ZVRpbWUsXHJcbiAgICAvLyAgICAgICAgIGFycml2YWxTdGF0aW9uTmFtZTogcmFpbEpvdXJuZXlPcHRpb24udG8sXHJcbiAgICAvLyAgICAgICAgIGRlcGFydHVyZURhdGVUaW1lOiByYWlsSm91cm5leU9wdGlvbi5kZXBhcnREYXRlVGltZSxcclxuICAgIC8vICAgICAgICAgZGVwYXJ0dXJlU3RhdGlvbk5hbWU6IHJhaWxKb3VybmV5T3B0aW9uLmZyb20sXHJcbiAgICAvLyAgICAgICAgIHN1cHBsaWVyVGlja2V0czogW1xyXG4gICAgLy8gICAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogcmFpbEpvdXJuZXlPcHRpb24ucHJvdmlkZXJzWzBdLm5hbWUsXHJcbiAgICAvLyAgICAgICAgICAgICB0aWNrZXREZXNjcmlwdGlvbjogc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLnR5cGUsXHJcbiAgICAvLyAgICAgICAgICAgICBwcmljZTogc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLnByaWNlLFxyXG4gICAgLy8gICAgICAgICAgICAgbGVnc1xyXG4gICAgLy8gICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgXVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIHRyYW5zYWN0aW9uSWRlbnRpZmllcjpcclxuICAgIC8vICAgICAgICAgcmFpbEpvdXJuZXlPcHRpb24uaWRlbnRpZmllcnMudHJhbnNhY3Rpb25JZGVudGlmaWVyLFxyXG4gICAgLy8gICAgICAgb3V0Ym91bmQ6IHtcclxuICAgIC8vICAgICAgICAgZmFyZUlkZW50aWZpZXJzOiBbXHJcbiAgICAvLyAgICAgICAgICAgc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyXHJcbiAgICAvLyAgICAgICAgIF0sXHJcbiAgICAvLyAgICAgICAgIGpvdXJuZXlJZGVudGlmaWVyOiBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXJcclxuICAgIC8vICAgICAgIH0sXHJcbiAgICAvLyAgICAgICB0aWNrZXRRdWV1ZUxpc3RcclxuICAgIC8vICAgICB9LFxyXG4gICAgLy8gICAgIGFkdWx0czogcmFpbFF1ZXJ5LmFkdWx0cyxcclxuICAgIC8vICAgICBwcmljZTogc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLnByaWNlLFxyXG4gICAgLy8gICAgIGN1cnJlbmN5OiBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24uY3VycmVuY3kgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgLy8gICAgIHNlYXJjaFF1ZXJ5OiByYWlsUXVlcnksXHJcbiAgICAvLyAgICAgLy8gY28yUGVySXRlbTogaXJsSm91cm5leU9wdGlvbi5jbzJQZXJJdGVtLFxyXG4gICAgLy8gICAgIC8vIGNvMlBlclBhc3NlbmdlcjogaXJsSm91cm5leU9wdGlvbi5jbzJQZXJQYXNzZW5nZXIsXHJcbiAgICAvLyAgICAgb3V0Ym91bmREYXRlOiBpcmxKb3VybmV5T3B0aW9uLlxyXG4gICAgLy8gICB9XHJcblxyXG4gICAgLy8gICAvLyBpZiBvdXRUaWNrZXRFeHRyYXMgZXhpc3RzIGFkZCB0aGUgb2JqZWN0IHRvIGJhc2tldEl0ZW1cclxuICAgIC8vICAgaWYgKG91dFRpY2tldEV4dHJhcykge1xyXG4gICAgLy8gICAgIGJhc2tldEl0ZW0uZGV0YWlsLm91dGJvdW5kLnRpY2tldEV4dHJhcyA9IG91dFRpY2tldEV4dHJhcztcclxuICAgIC8vICAgfVxyXG5cclxuICAgIC8vICAgcmV0dXJuIHRoaXMuYmFza2V0U2VydmljZS5hZGRUb0Jhc2tldChcclxuICAgIC8vICAgICBiYXNrZXRJdGVtLFxyXG4gICAgLy8gICAgIGludEJhc2tldCxcclxuICAgIC8vICAgICB0aGlzLnNlYXJjaFNlcnZpY2UsXHJcbiAgICAvLyAgICAgdGhpcy50cmF2ZWxsZXJzXHJcbiAgICAvLyAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vIGFzeW5jIGFkZFJldHVybkpvdXJuZXlUb0Jhc2tldChcclxuICAvLyAgIHNlcnZpY2VJZDogc3RyaW5nLFxyXG4gIC8vICAgcmFpbFF1ZXJ5OiBTZWFyY2hSYWlsUXVlcnlWYXJpYWJsZXMsXHJcbiAgLy8gICBvdXRib3VuZDogUmFpbEpvdXJuZXlPcHRpb24sXHJcbiAgLy8gICBpbmJvdW5kOiBSYWlsSm91cm5leU9wdGlvbixcclxuICAvLyAgIHJhaWxUaWNrZXRHcm91cDogUmFpbFRpY2tldEdyb3VwXHJcbiAgLy8gKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgLy8gICBpZiAob3V0Ym91bmQudW5zZWxsYWJsZSkge1xyXG4gIC8vICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGludEJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UgPVxyXG4gIC8vICAgICBhd2FpdCB0aGlzLmJhc2tldFNlcnZpY2UuZ2V0RGVmYXVsdEJhc2tldCgpO1xyXG4gIC8vICAgY29uc3QgYmFza2V0ID0gaW50QmFza2V0Py5zdWJqZWN0LnZhbHVlO1xyXG4gIC8vICAgaWYgKGJhc2tldCkge1xyXG4gIC8vICAgICBjb25zdCBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24gPSB0aGlzLmdldFNlbGVjdGVkUmFpbFRpY2tldE9wdGlvbihcclxuICAvLyAgICAgICBvdXRib3VuZCxcclxuICAvLyAgICAgICByYWlsVGlja2V0R3JvdXAsXHJcbiAgLy8gICAgICAgMFxyXG4gIC8vICAgICApO1xyXG4gIC8vICAgICBjb25zdCBvdXRib3VuZExlZ3MgPSB0aGlzLmdldExlZ3NGcm9tUmFpbEpvdXJuZXlPcHRpb24ob3V0Ym91bmQpO1xyXG4gIC8vICAgICBjb25zdCBpbmJvdW5kTGVncyA9IHRoaXMuZ2V0TGVnc0Zyb21SYWlsSm91cm5leU9wdGlvbihpbmJvdW5kKTtcclxuICAvLyAgICAgY29uc3QgdGlja2V0UXVldWVMaXN0ID0gc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLnRpY2tldFF1ZXVlTGlzdC5tYXAoXHJcbiAgLy8gICAgICAgKHRpY2tldFF1ZXVlTGlzdDE6IFJhaWxUaWNrZXRRdWV1ZSkgPT4ge1xyXG4gIC8vICAgICAgICAgcmV0dXJuIHtcclxuICAvLyAgICAgICAgICAgaWQ6IHRpY2tldFF1ZXVlTGlzdDEuaWQsXHJcbiAgLy8gICAgICAgICAgIG5hbWU6IHRpY2tldFF1ZXVlTGlzdDEubmFtZSxcclxuICAvLyAgICAgICAgICAgdHlwZTogdGlja2V0UXVldWVMaXN0MS50eXBlXHJcbiAgLy8gICAgICAgICB9O1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgKTtcclxuXHJcbiAgLy8gICAgIHJldHVybiB0aGlzLmJhc2tldFNlcnZpY2UuYWRkVG9CYXNrZXQoXHJcbiAgLy8gICAgICAge1xyXG4gIC8vICAgICAgICAgYmFza2V0OiBiYXNrZXQuaWQsXHJcbiAgLy8gICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlSWQsXHJcbiAgLy8gICAgICAgICBkZXRhaWw6IHtcclxuICAvLyAgICAgICAgICAgb3V0d2FyZERldGFpbDoge1xyXG4gIC8vICAgICAgICAgICAgIGFycml2YWxEYXRlVGltZTogb3V0Ym91bmQuYXJyaXZlRGF0ZVRpbWUsXHJcbiAgLy8gICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25OYW1lOiBvdXRib3VuZC50byxcclxuICAvLyAgICAgICAgICAgICBkZXBhcnR1cmVEYXRlVGltZTogb3V0Ym91bmQuZGVwYXJ0RGF0ZVRpbWUsXHJcbiAgLy8gICAgICAgICAgICAgZGVwYXJ0dXJlU3RhdGlvbk5hbWU6IG91dGJvdW5kLmZyb20sXHJcbiAgLy8gICAgICAgICAgICAgc3VwcGxpZXJUaWNrZXRzOiBbXHJcbiAgLy8gICAgICAgICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogb3V0Ym91bmQucHJvdmlkZXJzWzBdLm5hbWUsXHJcbiAgLy8gICAgICAgICAgICAgICAgIHRpY2tldERlc2NyaXB0aW9uOiBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24udHlwZSxcclxuICAvLyAgICAgICAgICAgICAgICAgcHJpY2U6IHNlbGVjdGVkUmFpbFRpY2tldE9wdGlvbi5wcmljZSxcclxuICAvLyAgICAgICAgICAgICAgICAgbGVnczogb3V0Ym91bmRMZWdzXHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgXVxyXG4gIC8vICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICBpbndhcmREZXRhaWw6IHtcclxuICAvLyAgICAgICAgICAgICBhcnJpdmFsRGF0ZVRpbWU6IGluYm91bmQuYXJyaXZlRGF0ZVRpbWUsXHJcbiAgLy8gICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25OYW1lOiBpbmJvdW5kLnRvLFxyXG4gIC8vICAgICAgICAgICAgIGRlcGFydHVyZURhdGVUaW1lOiBpbmJvdW5kLmRlcGFydERhdGVUaW1lLFxyXG4gIC8vICAgICAgICAgICAgIGRlcGFydHVyZVN0YXRpb25OYW1lOiBpbmJvdW5kLmZyb20sXHJcbiAgLy8gICAgICAgICAgICAgc3VwcGxpZXJUaWNrZXRzOiBbXHJcbiAgLy8gICAgICAgICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogaW5ib3VuZC5wcm92aWRlcnNbMF0ubmFtZSxcclxuICAvLyAgICAgICAgICAgICAgICAgdGlja2V0RGVzY3JpcHRpb246IHNlbGVjdGVkUmFpbFRpY2tldE9wdGlvbi50eXBlLFxyXG4gIC8vICAgICAgICAgICAgICAgICBsZWdzOiBpbmJvdW5kTGVnc1xyXG4gIC8vICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIF1cclxuICAvLyAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgdHJhbnNhY3Rpb25JZGVudGlmaWVyOiBvdXRib3VuZC5pZGVudGlmaWVycy50cmFuc2FjdGlvbklkZW50aWZpZXIsXHJcbiAgLy8gICAgICAgICAgIG91dGJvdW5kOiB7XHJcbiAgLy8gICAgICAgICAgICAgZmFyZUlkZW50aWZpZXJzOiBbXHJcbiAgLy8gICAgICAgICAgICAgICBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAvLyAgICAgICAgICAgICBdLFxyXG4gIC8vICAgICAgICAgICAgIGpvdXJuZXlJZGVudGlmaWVyOlxyXG4gIC8vICAgICAgICAgICAgICAgc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLmlkZW50aWZpZXJzLmpvdXJuZXlJZGVudGlmaWVyXHJcbiAgLy8gICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgIHRpY2tldFF1ZXVlTGlzdFxyXG4gIC8vICAgICAgICAgfSxcclxuICAvLyAgICAgICAgIGFkdWx0czogcmFpbFF1ZXJ5LmFkdWx0cyxcclxuICAvLyAgICAgICAgIHByaWNlOiByYWlsVGlja2V0R3JvdXAuaGVhZGVyLnByaWNlLFxyXG4gIC8vICAgICAgICAgY3VycmVuY3k6IHNlbGVjdGVkUmFpbFRpY2tldE9wdGlvbi5jdXJyZW5jeSBhcyBDdXJyZW5jeUNvZGUsXHJcbiAgLy8gICAgICAgICBzZWFyY2hRdWVyeTogcmFpbFF1ZXJ5LFxyXG4gIC8vICAgICAgICAgY28yUGVySXRlbTogb3V0Ym91bmQuY28yUGVySXRlbSxcclxuICAvLyAgICAgICAgIGNvMlBlclBhc3Nlbmdlcjogb3V0Ym91bmQuY28yUGVyUGFzc2VuZ2VyXHJcbiAgLy8gICAgICAgfSxcclxuICAvLyAgICAgICBpbnRCYXNrZXQsXHJcbiAgLy8gICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLFxyXG4gIC8vICAgICAgIHRoaXMudHJhdmVsbGVyc1xyXG4gIC8vICAgICApO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzb3J0VGlja2V0UHJpY2VzKHRpY2tldHM6IFRpY2tldEdyb3Vwcyk6IFRpY2tldEdyb3VwcyB7XHJcbiAgLy8gICBjb25zdCBzb3J0VGlja2V0UHJpY2VzID0geyAuLi50aWNrZXRzIH07XHJcbiAgLy8gICBPYmplY3Qua2V5cyhzb3J0VGlja2V0UHJpY2VzKS5tYXAoKGtleSkgPT4ge1xyXG4gIC8vICAgICBzb3J0VGlja2V0UHJpY2VzW2tleV0uc29ydCgoYTogSXJsVGlja2V0T3B0aW9uLCBiOiBJcmxUaWNrZXRPcHRpb24pID0+IHtcclxuICAvLyAgICAgICBjb25zdCBwcmljZUEgPSBhLnByaWNlLFxyXG4gIC8vICAgICAgICAgcHJpY2VCID0gYi5wcmljZTtcclxuICAvLyAgICAgICByZXR1cm4gcHJpY2VBIDwgcHJpY2VCID8gLTEgOiBwcmljZUEgPiBwcmljZUIgPyAxIDogMDtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9KTtcclxuICAvLyAgIHJldHVybiBzb3J0VGlja2V0UHJpY2VzO1xyXG4gIC8vIC8vIH1cclxuICAvLyBzb3J0VGlja2V0Q2hpbGRyZW5QcmljZXModGlja2V0czogUmFpbFRpY2tldEdyb3Vwcyk6IFJhaWxUaWNrZXRHcm91cHMge1xyXG4gIC8vICAgY29uc3Qgc29ydFRpY2tldFByaWNlcyA9IHsgLi4udGlja2V0cyB9O1xyXG4gIC8vICAgT2JqZWN0LmtleXMoc29ydFRpY2tldFByaWNlcykubWFwKChrZXkpID0+IHtcclxuICAvLyAgICAgc29ydFRpY2tldFByaWNlc1trZXldLmNoaWxkcmVuLnNvcnQoXHJcbiAgLy8gICAgICAgKGE6IFJhaWxUaWNrZXRHcm91cCwgYjogUmFpbFRpY2tldEdyb3VwKSA9PiB7XHJcbiAgLy8gICAgICAgICBjb25zdCBwcmljZUEgPSBhLmhlYWRlci5wcmljZSxcclxuICAvLyAgICAgICAgICAgcHJpY2VCID0gYi5oZWFkZXIucHJpY2U7XHJcbiAgLy8gICAgICAgICByZXR1cm4gcHJpY2VBIDwgcHJpY2VCID8gLTEgOiBwcmljZUEgPiBwcmljZUIgPyAxIDogMDtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICk7XHJcbiAgLy8gICB9KTtcclxuICAvLyAgIHJldHVybiBzb3J0VGlja2V0UHJpY2VzO1xyXG4gIC8vIH1cclxuICB1cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdKTogSUNoZWFwZXN0UHJpY2Uge1xyXG4gICAgaWYgKCFyZXN1bHRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcbiAgICBjb25zdCBjdXJyZW5jeSA9XHJcbiAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmRbMF0ucHJvdmlkZXJzWzBdLmNoZWFwZXN0VGlja2V0LmN1cnJlbmN5O1xyXG4gICAgY29uc3QgcHJpY2UgPSB0aGlzLmZpbmRDaGVhcGVzdFRpY2tldChyZXN1bHRzKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFtb3VudDogcHJpY2UsXHJcbiAgICAgIGN1cnJlbmN5Q29kZTogY3VycmVuY3lcclxuICAgIH07XHJcbiAgfVxyXG4gIGZpbmRDaGVhcGVzdFRpY2tldChyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NoZWFwZXN0Rmlyc3QgPSBudWxsO1xyXG4gICAgdGhpcy5fY2hlYXBlc3RTdGFuZGFyZCA9IG51bGw7XHJcbiAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBjaGVhcGVzdEFycjogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIHJlc3VsdC5vdXRib3VuZC5tYXAoKG91dCkgPT4ge1xyXG4gICAgICAgIG91dC5wcm92aWRlcnMubWFwKCh0a3QpID0+IHtcclxuICAgICAgICAgIGxldCBjaGVhcGVzdFRpY2tldDogbnVtYmVyID0gdGt0LmNoZWFwZXN0VGlja2V0LnByaWNlO1xyXG4gICAgICAgICAgdGt0LnRpY2tldE9wdGlvbnMubWFwKCh0a3RPcHRpb24pID0+IHtcclxuICAgICAgICAgICAgbGV0IHRrdFByaWNlID0gdGt0T3B0aW9uLnByaWNlO1xyXG4gICAgICAgICAgICBsZXQgdGt0Q2xhc3MgPSB0a3RPcHRpb24uY2xhc3M7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICB0a3RDbGFzcyA9PT0gJ0ZpcnN0JyAmJlxyXG4gICAgICAgICAgICAgICh0aGlzLl9jaGVhcGVzdEZpcnN0Py5wcmljZSA+IHRrdFByaWNlIHx8ICF0aGlzLl9jaGVhcGVzdEZpcnN0KVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICB0aGlzLl9jaGVhcGVzdEZpcnN0ID0gdGt0T3B0aW9uO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgIHRrdENsYXNzID09PSAnU3RhbmRhcmQnICYmXHJcbiAgICAgICAgICAgICAgKHRoaXMuX2NoZWFwZXN0U3RhbmRhcmQ/LnByaWNlID4gdGt0UHJpY2UgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLl9jaGVhcGVzdFN0YW5kYXJkKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICB0aGlzLl9jaGVhcGVzdFN0YW5kYXJkID0gdGt0T3B0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0a3RQcmljZSA9PT0gY2hlYXBlc3RUaWNrZXQpIHtcclxuICAgICAgICAgICAgICBjaGVhcGVzdEFyci5wdXNoKGNoZWFwZXN0VGlja2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gTWF0aC5taW4oLi4uY2hlYXBlc3RBcnIpO1xyXG4gIH1cclxufVxyXG4iXX0=
870
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXJsLWVudGVycHJpc2Utc2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2J0c2VydmljZXMvYmFzZS9zcmMvbGliL3ZlbmRvci9jbGFzc2VzL2lybC1lbnRlcnByaXNlLXNlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVd6RCxPQUFPLEVBR0wsUUFBUSxFQU1SLFdBQVcsRUFDWCxjQUFjLEVBSWYsTUFBTSx3QkFBd0IsQ0FBQztBQWtCaEMsT0FBTyxFQUFhLElBQUksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUcxRCxNQUFNLENBQU4sSUFBWSxZQUlYO0FBSkQsV0FBWSxZQUFZO0lBQ3RCLG1DQUFtQixDQUFBO0lBQ25CLG1DQUFtQixDQUFBO0lBQ25CLGlDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyxZQUFZLEtBQVosWUFBWSxRQUl2QjtBQVdELE1BQU0sQ0FBTixJQUFZLFNBTVg7QUFORCxXQUFZLFNBQVM7SUFDbkIsMEJBQWEsQ0FBQTtJQUNiLDBCQUFhLENBQUE7SUFDYixxQ0FBcUM7SUFDckMsdUNBQTBCLENBQUE7SUFDMUIsc0NBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQU5XLFNBQVMsS0FBVCxTQUFTLFFBTXBCO0FBRUQsTUFBTSxPQUFPLG1CQUlYLFNBQVEsb0JBSVA7SUFpYkQsWUFDVSxVQUFrQyxFQUNsQyx1QkFBMkQsRUFDbkUsT0FBMkIsRUFDbkIsYUFBK0MsRUFDdkQsY0FBa0MsRUFDMUIsYUFBK0M7UUFFdkQsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMs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NUMsUUFBUTtTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsZUFBaUM7O1FBQy9DLE9BQU87WUFDTDtnQkFDRSxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsS0FBSyxjQUFFLGVBQWUsYUFBZixlQUFlLHVCQUFmLGVBQWUsQ0FBRSxTQUFTLENBQUMsQ0FBQywyQ0FBRyxhQUFhLENBQUMsQ0FBQywyQ0FBRyxTQUFTO2FBQ2xFO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUN0QixNQUFNLEtBQUssR0FBNEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdELE1BQU0sb0JBQW9CLEdBQW1CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRSxNQUFNLFVBQVUsR0FBRztnQkFDakIsSUFBSSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUU7Z0JBQ25CLFdBQVcsRUFBRSxXQUFXLENBQUMsaUJBQWlCO2dCQUMxQyxVQUFVLEVBQUUsb0JBQW9CO2FBQ2pDLENBQUE7WUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDOztBQTlpQ2UsMENBQXNCLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLDJDQUF1QixHQUFHLGFBQWEsQ0FBQztBQUN4QyxpQ0FBYSxHQUFHLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJhc2VFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi9iYXNlLWVudGVycHJpc2UnO1xyXG5pbXBvcnQgeyBCYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlSGVscGVyUm91dGluZXMgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBWYWx1ZURpc3BsYXkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ZhbHVlLWRpc3BsYXknO1xyXG5pbXBvcnQge1xyXG4gIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgSXJsUXVvdGVSZXN1bHRBcnJheSxcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgSXJsVGlja2V0T3B0aW9uV2l0aFNlbGVjdGVkLFxyXG4gIFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQmFza2V0SXRlbSxcclxuICBDdXJyZW5jeUNvZGUsXHJcbiAgSXJsQ2xhc3MsXHJcbiAgSXJsSm91cm5leU9wdGlvbixcclxuICBJcmxKb3VybmV5T3B0aW9ucyxcclxuICBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgSXJsVGlja2V0T3B0aW9uLFxyXG4gIFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlcnZpY2VUeXBlLFxyXG4gIElybEpvdXJuZXlUeXBlLFxyXG4gIElybFN1cHBsaWVyLFxyXG4gIElybFRyYXZlbENhcmQsXHJcbiAgSXJsU2VnbWVudFxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VJcmxEaXNjb3VudENhcmRGZXRjaGVyLFxyXG4gIElybERpc2NvdW50Q2FyZEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvaXJsLWRpc2NvdW50LWNhcmQtZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUlybFF1b3RlRmV0Y2hlcixcclxuICBJcmxRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvaXJsLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIElSTEVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgSXJsVGVtcFBhcmFtc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWlybC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciwgYWdlcyB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgSUNoZWFwZXN0UHJpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NoZWFwZXN0LXByaWNlJztcclxuaW1wb3J0IHsgU29ydE1ldGhvZCB9IGZyb20gJy4vZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBJSXJsU2VhcmNoQXJncyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaXJsLXNlYXJjaC1hcmcuaW50ZXJmYWNlJztcclxuXHJcbmV4cG9ydCBlbnVtIFNvcnRUeXBlc0lybCB7XHJcbiAgQ2hlYXBlc3RGaXJzdCA9ICdDJyxcclxuICBFYXJsaWVzdEZpcnN0ID0gJ0UnLFxyXG4gIExhdGVzdEZpcnN0ID0gJ0wnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU29ydFR5cGVJcmwge1xyXG4gIC8qKiBUaXRsZSBkaXNwbGF5ZWQgb24gZHJvcGRvd24gKi9cclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIC8qKiBNZXRob2QgbmFtZSB1c2VkIGJ5IGNvbXBvbmVudCB0byBzb3J0IHJlc3VsdHMgKi9cclxuICBtZXRob2RSZWY6IFNvcnRNZXRob2Q7XHJcbiAgLyoqIEljb24gZGlzcGxheWVkIG9uIGRyb3AgZG93biAqL1xyXG4gIGljb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gQ2xhc3NUeXBlIHtcclxuICBDbGFzc18xID0gJzEnLFxyXG4gIENsYXNzXzIgPSAnMicsXHJcbiAgLy8gISB0aGVzZSAyIHNob3B1bGQgYmUgcmVtb3ZlZCBsYXRlclxyXG4gIFNlY29uZF9DbGFzcyA9ICcybmQgQ2xhc3MnLFxyXG4gIEZpcnN0X0NsYXNzID0gJzFzdCBDbGFzcydcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIElSTEVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBRIGV4dGVuZHMgSXJsUXVvdGVGZXRjaGVyVHlwZSxcclxuICAgIEdJREZfUSBleHRlbmRzIElybERpc2NvdW50Q2FyZEZldGNoZXJUeXBlXHJcbiAgPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBJcmxUZW1wUGFyYW1zLFxyXG4gICAgSXJsUXVvdGVSZXN1bHRBcnJheSxcclxuICAgIElybFF1b3RlUmVzdWx0QXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBJUkxFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlXHJcbntcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyA9ICdzZWFyY2hfaXJsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAnaXJsX3Jlc3VsdHMnO1xyXG4gIHN0YXRpYyByZWFkb25seSBQQVNTSU5HX1BPSU5UID0gJ1Bhc3NpbmcnO1xyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcblxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPSBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG4gIHByb3RlY3RlZCBtdWx0aVJlc3VsdHNTZXNzaW9uTmFtZSA9XHJcbiAgICBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG5cclxuICBwcml2YXRlIF9zb3J0QXJyYXk6IFNvcnRUeXBlSXJsW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnUHJpY2UnLFxyXG4gICAgICBtZXRob2RSZWY6IFNvcnRNZXRob2Quc29ydEJ5UHJpY2UsXHJcbiAgICAgIGljb246ICdpY28tZG9sbGFyJ1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdUaW1lJyxcclxuICAgICAgbWV0aG9kUmVmOiBTb3J0TWV0aG9kLnNvcnRCeURhdGUsXHJcbiAgICAgIGljb246ICdpY28tY2FsZW5kYXInXHJcbiAgICB9XHJcbiAgXTtcclxuXHJcbiAgcHVibGljIHNlYXJjaFR5cGVzID0gW1xyXG4gICAgeyBkaXNwbGF5OiAnUmV0dXJuJywgdmFsdWU6IElybEpvdXJuZXlUeXBlLlJldHVybkpvdXJuZXkgfSxcclxuICAgIHsgZGlzcGxheTogJ09uZS1XYXknLCB2YWx1ZTogSXJsSm91cm5leVR5cGUuU2luZ2xlSm91cm5leSB9XHJcbiAgXTtcclxuXHJcbiAgcHVibGljIGNsYXNzVHlwZXMgPSBbXHJcbiAgICB7IGRpc3BsYXk6ICdBbnknLCB2YWx1ZTogSXJsQ2xhc3MuQWxsIH0sXHJcbiAgICB7IGRpc3BsYXk6ICdTdGFuZGFyZCcsIHZhbHVlOiBJcmxDbGFzcy5TdGFuZGFyZCB9LFxyXG4gICAgeyBkaXNwbGF5OiAnRmlyc3QnLCB2YWx1ZTogSXJsQ2xhc3MuRmlyc3QgfVxyXG4gIF07XHJcblxyXG4gIHB1YmxpYyBhZ2VSYW5nZXM6IHtcclxuICAgIGtleTogYWdlcztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBrZXk6IGFnZXMuQ2hpbGQsIHZhbHVlOiAnQ2hpbGQgKDAtMyknIH0sXHJcbiAgICB7IGtleTogYWdlcy5DaGlsZCwgdmFsdWU6ICdDaGlsZCAoNC01KScgfSxcclxuICAgIHsga2V5OiBhZ2VzLkNoaWxkLCB2YWx1ZTogJ0NoaWxkICg2LTExKScgfSxcclxuICAgIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1lvdXRoICgxMi0xNCknIH0sXHJcbiAgICB7IGtleTogYWdlcy5Zb3V0aCwgdmFsdWU6ICdZb3V0aCAoMTUtMjUpJyB9LFxyXG4gICAgeyBrZXk6IGFnZXMuQWR1bHQsIHZhbHVlOiAnQWR1bHQgKDI2LTU5KScgfSxcclxuICAgIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1NlbmlvciAoNjArKScgfVxyXG4gIF07XHJcblxyXG4gIHB1YmxpYyB0cmF2ZWxDYXJkcyA9IFtcclxuICAgIHsgZGlzcGxheTogJ1lvdW5nIHBlcnNvbnMgcmFpbGNhcmQnLCB2YWx1ZTogJ1lORycgfSxcclxuICAgIHsgZGlzcGxheTogJ0Rpc2FiaWxpdHkgcmFpbGNhcmQnLCB2YWx1ZTogJ0RJUycgfSxcclxuICAgIHsgZGlzcGxheTogJ0ZhbWlseSByYWlsY2FyZCcsIHZhbHVlOiAnRkFNJyB9LFxyXG4gICAgeyBkaXNwbGF5OiAnRm9yY2VzIHJhaWxjYXJkJywgdmFsdWU6ICdITUYnIH0sXHJcbiAgICB7IGRpc3BsYXk6ICdUcmF2ZWwgYWdlbmN5IGRpc2NvdW50JywgdmFsdWU6ICdUQUQnIH1cclxuICBdO1xyXG5cclxuICBwdWJsaWMgdHlwZTogU2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5JbnRlcm5hdGlvbmFsUmFpbDtcclxuICBwdWJsaWMgbWluT3V0Ym91bmREYXRlOiBOZ2JEYXRlU3RydWN0ID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKClcclxuICB9O1xyXG4gIHB1YmxpYyBtaW5JbmJvdW5kRGF0ZTogTmdiRGF0ZVN0cnVjdCA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSxcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpXHJcbiAgfTtcclxuICBwcml2YXRlIF90aW1lQXJyYXk6IFZhbHVlRGlzcGxheVtdO1xyXG4gIHByaXZhdGUgX2NhbkNvbWJpbmU6IGFueTtcclxuICBwcml2YXRlIF90cmF2ZWxsaW5nRnJvbTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3RyYXZlbGxpbmdUbzogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfb3JpZ2luYWxVc2VyU2VhcmNoOiBJcmxUZW1wUGFyYW1zO1xyXG4gIHByaXZhdGUgX291dGJvdW5kSm91cm5leU9wdGlvbnM6IElybEpvdXJuZXlPcHRpb247XHJcbiAgcHJpdmF0ZSBfaXNGaWx0ZXJlZDogYm9vbGVhbjtcclxuICBnZXQgb3V0Ym91bmRKb3VybmV5T3B0aW9ucygpOiBJcmxKb3VybmV5T3B0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9vdXRib3VuZEpvdXJuZXlPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kSm91cm5leU9wdGlvbnMoZGF0YTogSXJsSm91cm5leU9wdGlvbikge1xyXG4gICAgdGhpcy5fb3V0Ym91bmRKb3VybmV5T3B0aW9ucyA9IGRhdGE7XHJcbiAgfVxyXG4gIF9vdXRib3VuZFRpY2tldDogSXJsVGlja2V0T3B0aW9uV2l0aFNlbGVjdGVkO1xyXG4gIGdldCBvdXRib3VuZFRpY2tldCgpOiBJcmxUaWNrZXRPcHRpb25XaXRoU2VsZWN0ZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX291dGJvdW5kVGlja2V0O1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kVGlja2V0KGRhdGE6IElybFRpY2tldE9wdGlvbldpdGhTZWxlY3RlZCkge1xyXG4gICAgdGhpcy5fb3V0Ym91bmRUaWNrZXQgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vT2ZBZHVsdHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IG5vT2ZBZHVsdHMoYWR1bHRzOiBudW1iZXIpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5hZHVsdHMgPSBhZHVsdHM7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgbm9PZkNoaWxkcmVuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgc2V0IG5vT2ZDaGlsZHJlbihjaGlsZHJlbjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCB0cmF2ZWxsaW5nVG8oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbExvY2F0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgdHJhdmVsbGluZ1RvKHR0OiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5hcnJpdmFsTG9jYXRpb25JZCA9IHR0O1xyXG5cclxuICAgIHRoaXMuX3RyYXZlbGxpbmdUbyA9ICcnO1xyXG4gICAgaWYgKHR0Py5yYWlsc3RhdGlvbj8uaWQpIHtcclxuICAgICAgdGhpcy5fdHJhdmVsbGluZ1RvID0gdHQucmFpbHN0YXRpb24uaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRyYXZlbGxpbmdGcm9tKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmRlcGFydHVyZUxvY2F0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgdHJhdmVsbGluZ0Zyb20odHQ6IGFueSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmRlcGFydHVyZUxvY2F0aW9uSWQgPSB0dDtcclxuICAgIHRoaXMuX3RyYXZlbGxpbmdGcm9tID0gJyc7XHJcbiAgICBpZiAodHQ/LnJhaWxzdGF0aW9uPy5pZCkge1xyXG4gICAgICB0aGlzLl90cmF2ZWxsaW5nRnJvbSA9IHR0LnJhaWxzdGF0aW9uLmlkO1xyXG4gICAgICB0aGlzLnN1cHBsaWVyID0gdHQucmFpbHN0YXRpb24uc3VwcGxpZXI7XHJcbiAgICAgIHRoaXMuZ2V0SXJsRGlzY291bnRDYXJkcygpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXJsRGlzY291bnRDYXJkc0FycmF5ID0gZGF0YTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc3VwcGxpZXI6IElybFN1cHBsaWVyID0gbnVsbDtcclxuICBnZXQgc3VwcGxpZXIoKTogSXJsU3VwcGxpZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N1cHBsaWVyO1xyXG4gIH1cclxuICBzZXQgc3VwcGxpZXIoZGF0YTogSXJsU3VwcGxpZXIpIHtcclxuICAgIHRoaXMuX3N1cHBsaWVyID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvdW50cnlDb2RlOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBjb3VudHJ5Q29kZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvdW50cnlDb2RlO1xyXG4gIH1cclxuICBzZXQgY291bnRyeUNvZGUoZGF0YTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jb3VudHJ5Q29kZSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbGFzczogSXJsQ2xhc3MgPSBudWxsO1xyXG4gIGdldCBjbGFzcygpOiBJcmxDbGFzcyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2xhc3M7XHJcbiAgfVxyXG4gIHNldCBjbGFzcyhkYXRhOiBJcmxDbGFzcykge1xyXG4gICAgdGhpcy5fY2xhc3MgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTogbW9tZW50Lk1vbWVudCA9IG51bGw7XHJcbiAgZ2V0IG91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTtcclxuICB9XHJcbiAgc2V0IG91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUobmV3RGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZERlcGFydHVyZURhdGVUaW1lID0gbmV3RGF0ZVRpbWU7XHJcbiAgICBpZiAobmV3RGF0ZVRpbWUgJiYgbmV3RGF0ZVRpbWUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMuX291dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZTtcclxuICAgICAgdGhpcy5fb3V0Ym91bmRfZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlVGltZSk7XHJcbiAgICAgIHRoaXMuX291dGJvdW5kX3RpbWUgPSBtb21lbnQobmV3RGF0ZVRpbWUpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgPyBtb21lbnQobmV3RGF0ZVRpbWUpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgOiAnMDcwMCc7XHJcbiAgICB9XHJcbiAgICB0aGlzLl91cGRhdGVPdXRib3VuZERhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kZXBhcnR1cmVMb2NhdGlvbklkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBkZXBhcnR1cmVMb2NhdGlvbklkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVwYXJ0dXJlTG9jYXRpb25JZDtcclxuICB9XHJcbiAgc2V0IGRlcGFydHVyZUxvY2F0aW9uSWQoZGF0YTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9kZXBhcnR1cmVMb2NhdGlvbklkID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Fycml2YWxMb2NhdGlvbklkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBhcnJpdmFsTG9jYXRpb25JZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Fycml2YWxMb2NhdGlvbklkO1xyXG4gIH1cclxuICBzZXQgYXJyaXZhbExvY2F0aW9uSWQoZGF0YTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9hcnJpdmFsTG9jYXRpb25JZCA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hZHVsdHM6IG51bWJlciA9IDA7XHJcbiAgZ2V0IGFkdWx0cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FkdWx0cztcclxuICB9XHJcbiAgc2V0IGFkdWx0cyhkYXRhOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2FkdWx0cyA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaGlsZHJlbjogbnVtYmVyID0gMDtcclxuICBnZXQgY2hpbGRyZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcclxuICB9XHJcbiAgc2V0IGNoaWxkcmVuKGRhdGE6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY2hpbGRyZW4gPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2hlYXBlc3RTdGFuZGFyZDogSXJsVGlja2V0T3B0aW9uID0gbnVsbDtcclxuICBnZXQgY2hlYXBlc3RTdGFuZGFyZCgpOiBJcmxUaWNrZXRPcHRpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWFwZXN0U3RhbmRhcmQ7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NoZWFwZXN0Rmlyc3Q6IElybFRpY2tldE9wdGlvbiA9IG51bGw7XHJcbiAgZ2V0IGNoZWFwZXN0Rmlyc3QoKTogSXJsVGlja2V0T3B0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVhcGVzdEZpcnN0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQgPSBudWxsO1xyXG4gIGdldCByZXR1cm5EZXBhcnR1cmVEYXRlVGltZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLl9yZXR1cm5EZXBhcnR1cmVEYXRlVGltZTtcclxuICB9XHJcbiAgc2V0IHJldHVybkRlcGFydHVyZURhdGVUaW1lKG5ld0RhdGVUaW1lOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZTtcclxuICAgIGlmIChuZXdEYXRlVGltZSAmJiBuZXdEYXRlVGltZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy5fcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZTtcclxuICAgICAgdGhpcy5fcmV0dXJuX2RhdGUgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUobmV3RGF0ZVRpbWUpO1xyXG4gICAgICB0aGlzLl9yZXR1cm5fdGltZSA9IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgICA/IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgICA6ICcxNjAwJztcclxuICAgIH1cclxuICAgIHRoaXMuX3VwZGF0ZVJldHVybkRhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hZ2VSYW5nZTogc3RyaW5nID0gbnVsbDtcclxuICBnZXQgYWdlUmFuZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9hZ2VSYW5nZTtcclxuICB9XHJcbiAgc2V0IGFnZVJhbmdlKGRhdGE6IHN0cmluZykge1xyXG4gICAgdGhpcy5fYWdlUmFuZ2UgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJpY2VEaXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBnZXQgcHJpY2VEaXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJpY2VEaXI7XHJcbiAgfVxyXG4gIHNldCBwcmljZURpcihkYXRhOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9wcmljZURpciA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kYXRlRGlyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ2V0IGRhdGVEaXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0ZURpcjtcclxuICB9XHJcbiAgc2V0IGRhdGVEaXIoZGF0YTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZGF0ZURpciA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXQgY2hvc2VuU2VhcmNoQ2xhc3MoKTogSXJsQ2xhc3Mge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jbGFzcztcclxuICB9XHJcblxyXG4gIHNldCBjaG9zZW5TZWFyY2hDbGFzcyhjbGFzc1I6IElybENsYXNzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2xhc3MgPSBjbGFzc1I7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzY291bnRDYXJkKCk6IElybFRyYXZlbENhcmQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5pcmxEaXNjb3VudENhcmRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRpc2NvdW50Q2FyZChkYXRhOiBJcmxUcmF2ZWxDYXJkKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaXJsRGlzY291bnRDYXJkcyA9IGRhdGE7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pcmxEaXNjb3VudENhcmRzQXJyYXk6IElybFRyYXZlbENhcmRbXSA9IFtdO1xyXG4gIGdldCBpcmxEaXNjb3VudENhcmRzQXJyYXkoKTogSXJsVHJhdmVsQ2FyZFtdIHtcclxuICAgIHJldHVybiB0aGlzLl9pcmxEaXNjb3VudENhcmRzQXJyYXk7XHJcbiAgfVxyXG5cclxuICBzZXQgaXJsRGlzY291bnRDYXJkc0FycmF5KGFycmF5OiBJcmxUcmF2ZWxDYXJkW10pIHtcclxuICAgIHRoaXMuX2lybERpc2NvdW50Q2FyZHNBcnJheSA9IGFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IG91dEJvdW5kRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgb3V0Qm91bmREYXRlVGltZShuZXdEYXRlVGltZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUgPSBtb21lbnQobmV3RGF0ZVRpbWUpO1xyXG5cclxuICAgIHRoaXMubWluSW5ib3VuZERhdGUgPSB7XHJcbiAgICAgIHllYXI6IG5ld0RhdGVUaW1lLnllYXIoKSxcclxuICAgICAgbW9udGg6IG5ld0RhdGVUaW1lLm1vbnRoKCkgKyAxLFxyXG4gICAgICBkYXk6IG5ld0RhdGVUaW1lLmRhdGUoKVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAobmV3RGF0ZVRpbWUgJiYgbmV3RGF0ZVRpbWUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMuX291dGJvdW5kX2RhdGUgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUobmV3RGF0ZVRpbWUpO1xyXG4gICAgICB0aGlzLl9vdXRib3VuZF90aW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgID8gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgIDogJzA3MDAnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vdXRCb3VuZERhdGVUaW1lICYmXHJcbiAgICAgIHRoaXMuaW5Cb3VuZERhdGVUaW1lICYmXHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlVGltZS5pc0FmdGVyKHRoaXMuaW5Cb3VuZERhdGVUaW1lKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaW5Cb3VuZERhdGVUaW1lID0gdGhpcy5vdXRCb3VuZERhdGVUaW1lLmNsb25lKCkuYWRkKDEsICdkYXknKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5Cb3VuZERhdGVUaW1lKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5yZXR1cm5EZXBhcnR1cmVEYXRlVGltZTtcclxuICB9XHJcblxyXG4gIHNldCBpbkJvdW5kRGF0ZVRpbWUobmV3RGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5yZXR1cm5EZXBhcnR1cmVEYXRlVGltZSA9IG5ld0RhdGVUaW1lO1xyXG4gICAgaWYgKG5ld0RhdGVUaW1lICYmIG5ld0RhdGVUaW1lLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLl9yZXR1cm5fZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlVGltZSk7XHJcbiAgICAgIHRoaXMuX3JldHVybl90aW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgID8gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgIDogJzE2MDAnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gIWRhdGUgYW5kIHRpbWUgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBmb3IgTFVcclxuICBwcml2YXRlIF9vdXRib3VuZF9kYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuXHJcbiAgZ2V0IG91dGJvdW5kX2RhdGUoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0Ym91bmRfZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBvdXRib3VuZF9kYXRlKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9vdXRib3VuZF9kYXRlID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVPdXRib3VuZERhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vdXRib3VuZF90aW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBvdXRib3VuZF90aW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0Ym91bmRfdGltZTtcclxuICB9XHJcblxyXG4gIHNldCBvdXRib3VuZF90aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX291dGJvdW5kX3RpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZU91dGJvdW5kRGF0ZVRpbWUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JldHVybl9kYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuXHJcbiAgZ2V0IHJldHVybl9kYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JldHVybl9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJldHVybl9kYXRlKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9yZXR1cm5fZGF0ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5fdXBkYXRlUmV0dXJuRGF0ZVRpbWUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JldHVybl90aW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCByZXR1cm5fdGltZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JldHVybl90aW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJldHVybl90aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3JldHVybl90aW1lID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVSZXR1cm5EYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0aW1lQXJyYXkoKTogVmFsdWVEaXNwbGF5W10ge1xyXG4gICAgdGhpcy5fdGltZUFycmF5ID1cclxuICAgICAgdGhpcy5fdGltZUFycmF5IHx8XHJcbiAgICAgIEFycmF5KDQ4KVxyXG4gICAgICAgIC5maWxsKDApXHJcbiAgICAgICAgLm1hcCgoXywgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmFsdWU6XHJcbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihpbmRleCAvIDIpXHJcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDIsICcwJykgK1xyXG4gICAgICAgICAgICAgICgoaW5kZXggJSAyKSAqIDMwKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksXHJcbiAgICAgICAgICAgIGRpc3BsYXk6XHJcbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihpbmRleCAvIDIpXHJcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDIsICcwJykgK1xyXG4gICAgICAgICAgICAgICc6JyArXHJcbiAgICAgICAgICAgICAgKChpbmRleCAlIDIpICogMzApLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLl90aW1lQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vZmZsaW5lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ2V0IG9mZmxpbmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb2ZmbGluZTtcclxuICB9XHJcblxyXG4gIHNldCBvZmZsaW5lKGRhdGE6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX29mZmxpbmUgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXJsQ2xhc3M6IElybENsYXNzID0gSXJsQ2xhc3MuQWxsO1xyXG4gIGdldCBpcmxDbGFzcygpOiBJcmxDbGFzcyB7XHJcbiAgICByZXR1cm4gdGhpcy5faXJsQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBzZXQgaXJsQ2xhc3MoZGF0YTogSXJsQ2xhc3MpIHtcclxuICAgIHRoaXMuX2lybENsYXNzID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2pvdXJuZXl0eXBlOiBJcmxKb3VybmV5VHlwZSA9IElybEpvdXJuZXlUeXBlLlNpbmdsZUpvdXJuZXk7XHJcbiAgZ2V0IGpvdXJuZXlUeXBlKCk6IElybEpvdXJuZXlUeXBlIHtcclxuICAgIHJldHVybiB0aGlzLl9qb3VybmV5dHlwZTtcclxuICB9XHJcblxyXG4gIHNldCBqb3VybmV5VHlwZShkYXRhOiBJcmxKb3VybmV5VHlwZSkge1xyXG4gICAgdGhpcy5fam91cm5leXR5cGUgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNvcnREcm9wZG93blZhbHVlcygpOiBTb3J0VHlwZUlybFtdIHtcclxuICAgIHJldHVybiB0aGlzLl9zb3J0QXJyYXk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgSXJsZmV0Y2hlcjogQmFzZUlybFF1b3RlRmV0Y2hlcjxRPixcclxuICAgIHByaXZhdGUgaXJsRGlzY291bnRDYXJkc0ZldGNoZXI6IEJhc2VJcmxEaXNjb3VudENhcmRGZXRjaGVyPEdJREZfUT4sXHJcbiAgICBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICBwcml2YXRlIGJhc2tldFNlcnZpY2U6IEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgc3RvcmFnZVNlcnZpY2U6IEJhc2VTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2VcclxuICApIHtcclxuICAgIHN1cGVyKHN0b3JhZ2VTZXJ2aWNlLCBoZWxwZXJzKTtcclxuXHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHF1ZXJ5OiB7fTtcclxuICAgICAgdGVtcFBhcmFtczogSXJsVGVtcFBhcmFtcztcclxuICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiBJcmxUZW1wUGFyYW1zO1xyXG4gICAgfSA9IHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtKFxyXG4gICAgICBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVNcclxuICAgICkgfHwge1xyXG4gICAgICBxdWVyeToge30sXHJcbiAgICAgIHRlbXBQYXJhbXM6IHt9IGFzIElybFRlbXBQYXJhbXMsXHJcbiAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDoge30gYXMgSXJsVGVtcFBhcmFtc1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXModGhpcy5zZWFyY2hTZXJ2aWNlLm1ha2VJcmxRdWVyeShkYXRhLnRlbXBQYXJhbXMpKTtcclxuICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IGRhdGEub3JpZ2luYWxVc2VyU2VhcmNoO1xyXG5cclxuICAgIGlmIChzZWFyY2hTZXJ2aWNlLnNob3VsZEFkZFRyYXZlbGxlclN1YnNjcmlwdGlvbigpKSB7XHJcbiAgICAgIHNlYXJjaFNlcnZpY2UudHJhdmVsbGVySW5mb3JtYXRpb24uc3Vic2NyaWJlKFxyXG4gICAgICAgICh0cmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50cmF2ZWxsZXJzID0gdHJhdmVsbGVycztcclxuICAgICAgICAgIGlmICh0aGlzLnRyYXZlbGxlcnNbMF0gJiYgIXRoaXMudHJhdmVsbGVyc1swXS5hZ2VUeXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhdmVsbGVyc1swXS5hZ2VUeXBlID0gYWdlcy5BZHVsdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHNwbGl0VHJhdmVsbGVycyA9IHRoaXMuaGVscGVycy5zZWxlY3RlZFRyYXZlbGxlcnMoXHJcbiAgICAgICAgICAgIHRyYXZlbGxlcnMsXHJcbiAgICAgICAgICAgIFNlcnZpY2VUeXBlLkludGVybmF0aW9uYWxSYWlsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmFkdWx0cyA9IHNwbGl0VHJhdmVsbGVycy5hZHVsdHMubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID0gc3BsaXRUcmF2ZWxsZXJzLmNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgY29uc3QgcmVzdWx0cyA9XHJcbiAgICAgIHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtQXNMaXN0PElybFF1b3RlUmVzdWx0QXJyYXk+KFxyXG4gICAgICAgIHRoaXMucmVzdWx0c1Nlc3Npb25OYW1lXHJcbiAgICAgICkgfHwgW107XHJcbiAgICAvLyBpZiAocmVzdWx0cyA9PSBudWxsICYmIHRoaXMuaXNWYWxpZCkge1xyXG4gICAgLy8gICBzZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgIC8vIH1cclxuICAgIHRoaXMuX2NoZWFwZXN0UmVzdWx0UHJpY2UgPSB0aGlzLnVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHMpO1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyB8fCBbXSk7XHJcbiAgfVxyXG4gIGlybERpc2NvdW50Q2FyZHM6IElybFRyYXZlbENhcmQ7XHJcblxyXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0cyhyZXN1bHRzOiBJcmxRdW90ZVJlc3VsdEFycmF5KSB7XHJcbiAgICByZXN1bHRzWzBdPy5vdXRib3VuZC5mb3JFYWNoKChpdGVtOiBJcmxKb3VybmV5T3B0aW9uKSA9PiB7XHJcbiAgICAgIGl0ZW0ucHJvdmlkZXJzWzBdLnRpY2tldE9wdGlvbnMubWFwKFxyXG4gICAgICAgICh0aWNrZXQ6IElybFRpY2tldE9wdGlvbldpdGhTZWxlY3RlZCwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgdGlja2V0LnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aWNrZXQuU2hvd0RldGFpbCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGlja2V0LnVpZCA9IGAke3RpY2tldC5pZGVudGlmaWVycy5qb3VybmV5SWRlbnRpZmllcn1fJHtpbmRleCArIDF9YDtcclxuICAgICAgICAgIHJldHVybiB0aWNrZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZnJlZXplKHJlc3VsdHMpO1xyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCByZXNldFF1ZXJ5KCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlSXJsUXVlcnkoKSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZhbGlkKCkge1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgSVJMRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TLFxyXG4gICAgICB7XHJcbiAgICAgICAgdGVtcFBhcmFtczogdGhpcy50ZW1wUGFyYW1zLFxyXG4gICAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2hcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xyXG5cclxuICAgIGNvbnN0IG5vdyA9IG1vbWVudCgpO1xyXG5cclxuICAgIGlmICghdGhpcy5fdHJhdmVsbGluZ0Zyb20pIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIEVudGVyIGEgRnJvbSBMb2NhdGlvbi4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX3RyYXZlbGxpbmdUbykge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgRW50ZXIgYSBUbyBMb2NhdGlvbi4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vdXRCb3VuZERhdGVUaW1lPy5pc0JlZm9yZShub3cpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgJ0RlcGFydHVyZSBEYXRlL1RpbWUgY2Fubm90IGJlIGluIHRoZSBwYXN0LidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAoXHJcbiAgICAvLyAgIHRoaXMuY2hvc2VuU2VhcmNoVHlwZSA9PT0gSXJsSm91cm5leVR5cGUuUmV0dXJuSm91cm5leVxyXG4gICAgLy8gKSB7XHJcbiAgICAvLyAgIC8vIGNoZWNrIGZvciByZXR1cm4gc3BlY2lmaWMgdmFsaWRhdGlvbnMgaW4gaGVyZVxyXG5cclxuICAgIC8vICAgaWYgKHRoaXMuaW5Cb3VuZERhdGVUaW1lPy5pc1NhbWVPckJlZm9yZSh0aGlzLm91dEJvdW5kRGF0ZVRpbWUpKSB7XHJcbiAgICAvLyAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgIC8vICAgICAgICdSZXR1cm4gRGF0ZS9UaW1lIG11c3QgYmUgYWZ0ZXIgRGVwYXJ0dXJlIERhdGUvVGltZSdcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaWYgKHRoaXMudmlhKSB7XHJcbiAgICAvLyAgIGlmICghdGhpcy50ZW1wUGFyYW1zLnZpYUxvY2F0aW9uKSB7XHJcbiAgICAvLyAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIGVudGVyIGEgdmlhIGxvY2F0aW9uLicpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKHRoaXMudGVtcFBhcmFtcy5hZHVsdHMgKyB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPCAxKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1RoZXJlIG11c3QgYmUgYXQgbGVhc3QgMSB0cmF2ZWxsZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzVmFsaWQubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDApO1xyXG4gICAgdGhpcy5tZXNzYWdlcy5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoW10pO1xyXG5cclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IE9iamVjdC5mcmVlemUoeyAuLi50aGlzLnRlbXBQYXJhbXMgfSk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgICAgSVJMRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtcyxcclxuICAgICAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2hcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zYXZlUmVjZW50U2VhcmNoKHRoaXMuZ2V0UmVjZW50U2VhcmNoUXVlcnkocXVlcnkpKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0U2VhcmNoKFxyXG4gICAgICAgIHRoaXMuSXJsZmV0Y2hlci5mZXRjaExpc3QocXVlcnkpLnBpcGUobWFwKChyZXN1bHQpID0+IHJlc3VsdCkpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzXHJcbiAgKTogU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHJlY2VudFNlYXJjaFF1ZXJ5OiBJSXJsU2VhcmNoQXJncyA9IHRoaXMudXBkYXRlU2VyY2hRdWVyeShxdWVyeSlcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWwsXHJcbiAgICAgIHNlYXJjaEFyZ3M6IHJlY2VudFNlYXJjaFF1ZXJ5LFxyXG4gICAgICB0cmF2ZWxEYXRlOiB0aGlzLm91dEJvdW5kRGF0ZVRpbWUuZm9ybWF0KCksXHJcbiAgICAgIHRyYXZlbGxlcnM6IHRoaXMuaGVscGVycy5nZXRUcmF2ZWxsZXJzSWQodGhpcy50cmF2ZWxsZXJzKVxyXG4gICAgfTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNlcmNoUXVlcnkocXVlcnk6IFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzKTogSUlybFNlYXJjaEFyZ3N7XHJcbiAgICBjb25zdCBzZWFyY2hRdWVyeTogSUlybFNlYXJjaEFyZ3MgID0gcXVlcnk7XHJcbiAgICBpZiAodGhpcy50cmF2ZWxsaW5nRnJvbSkge1xyXG4gICAgICBzZWFyY2hRdWVyeS50cmF2ZWxsaW5nRnJvbSA9IHRoaXMudHJhdmVsbGluZ0Zyb207XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudHJhdmVsbGluZ1RvKSB7XHJcbiAgICAgIHNlYXJjaFF1ZXJ5LnRyYXZlbGxpbmdUbyA9IHRoaXMudHJhdmVsbGluZ1RvO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0UmVjZW50U2VhcmNoKHJlY2VudFNlYXJjaDogUmVjZW50U2VhcmNoKTogdm9pZCB7XHJcbiAgICB0aGlzLmpvdXJuZXlUeXBlID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Muam91cm5leVR5cGU7XHJcbiAgICB0aGlzLmlybENsYXNzID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY2xhc3M7XHJcbiAgICB0aGlzLnRyYXZlbGxpbmdUbyA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRyYXZlbGxpbmdUbztcclxuICAgIHRoaXMudHJhdmVsbGluZ0Zyb20gPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy50cmF2ZWxsaW5nRnJvbTtcclxuXHJcbiAgICAvLyBnZXQgb3V0Qm91bmREYXRlVGltZSwgaW5Cb3VuZERhdGVUaW1lXHJcbiAgICB0aGlzLm91dEJvdW5kRGF0ZVRpbWUgPSBtb21lbnQoXHJcbiAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWVcclxuICAgICk7XHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Muam91cm5leVR5cGUgPT09IElybEpvdXJuZXlUeXBlLlJldHVybkpvdXJuZXkpIHtcclxuICAgICAgdGhpcy5pbkJvdW5kRGF0ZVRpbWUgPSBtb21lbnQoXHJcbiAgICAgICAgcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWVcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlT3V0Ym91bmREYXRlVGltZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9vdXRib3VuZF9kYXRlICYmIHRoaXMuX291dGJvdW5kX3RpbWUpIHtcclxuICAgICAgY29uc3QgdGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgICB0aGlzLl9vdXRib3VuZF9kYXRlLFxyXG4gICAgICAgIHRoaXMuX291dGJvdW5kX3RpbWVcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlVGltZSA9IHRpbWUuaXNWYWxpZCgpID8gdGltZSA6IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVJldHVybkRhdGVUaW1lKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JldHVybl9kYXRlICYmIHRoaXMuX3JldHVybl90aW1lKSB7XHJcbiAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgdGhpcy5fcmV0dXJuX2RhdGUsXHJcbiAgICAgICAgdGhpcy5fcmV0dXJuX3RpbWVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5pbkJvdW5kRGF0ZVRpbWUgPSB0aW1lLmlzVmFsaWQoKSA/IHRpbWUgOiBudWxsO1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hRdWVyeSgpOiBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyB7XHJcbiAgICAvLyB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgdGhpcy5ub09mQWR1bHRzID0gdGhpcy50cmF2ZWxsZXJzLmZpbHRlcihcclxuICAgICAgKHRyYXZlbGxlcjogVHJhdmVsbGVyKSA9PlxyXG4gICAgICAgIHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLkFkdWx0IHx8XHJcbiAgICAgICAgdHJhdmVsbGVyLmFnZVR5cGUgPT09IGFnZXMuWW91dGggfHxcclxuICAgICAgICB0cmF2ZWxsZXIuYWdlVHlwZSA9PT0gYWdlcy5TZW5pb3JcclxuICAgICkubGVuZ3RoO1xyXG4gICAgdGhpcy5ub09mQ2hpbGRyZW4gPSB0aGlzLnRyYXZlbGxlcnMuZmlsdGVyKFxyXG4gICAgICAodHJhdmVsbGVyOiBUcmF2ZWxsZXIpID0+IHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLkNoaWxkXHJcbiAgICApLmxlbmd0aDtcclxuICAgIGlmICghdGhpcy5zdXBwbGllciAmJiB0aGlzLnRyYXZlbGxpbmdGcm9tLm5hbWUpIHtcclxuICAgICAgdGhpcy5zdXBwbGllciA9IHRoaXMudHJhdmVsbGluZ0Zyb20ucmFpbHN0YXRpb24uc3VwcGxpZXI7XHJcbiAgICAgIHRoaXMuZ2V0SXJsRGlzY291bnRDYXJkcygpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXJsRGlzY291bnRDYXJkc0FycmF5ID0gZGF0YTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBxdWVyeTogU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMgPSB7XHJcbiAgICAgIHN1cHBsaWVyOiB0aGlzLnN1cHBsaWVyLCAvLyBJUkxTdXBwbGllciFcclxuICAgICAgY291bnRyeUNvZGU6ICdHQicsXHJcbiAgICAgIGlybERpc2NvdW50Q2FyZHM6IHRoaXMuZGlzY291bnRDYXJkID8gdGhpcy5kaXNjb3VudENhcmQuaWQgOiBudWxsLFxyXG4gICAgICBjbGFzczogdGhpcy5pcmxDbGFzcywgLy8gSVJMQ2xhc3NcclxuICAgICAgb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTogdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUsXHJcbiAgICAgIGRlcGFydHVyZUxvY2F0aW9uSWQ6IHRoaXMuX3RyYXZlbGxpbmdGcm9tLFxyXG4gICAgICBhcnJpdmFsTG9jYXRpb25JZDogdGhpcy5fdHJhdmVsbGluZ1RvLFxyXG4gICAgICBhZHVsdHM6IHRoaXMudGVtcFBhcmFtcy5hZHVsdHMsXHJcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4sXHJcbiAgICAgIHJldHVybkRlcGFydHVyZURhdGVUaW1lOiB0aGlzLnRlbXBQYXJhbXMucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUsXHJcbiAgICAgIGpvdXJuZXlUeXBlOiB0aGlzLmpvdXJuZXlUeXBlXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPT09IDApIHtcclxuICAgICAgcXVlcnkuY2hpbGRyZW4gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy50ZW1wUGFyYW1zLmpvdXJuZXlUeXBlKSB7XHJcbiAgICAgIGNhc2UgSXJsSm91cm5leVR5cGUuU2luZ2xlSm91cm5leTpcclxuICAgICAgICBxdWVyeS5yZXR1cm5EZXBhcnR1cmVEYXRlVGltZSA9IG51bGw7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnJlbW92ZU51bGxzPFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzPihxdWVyeSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHt9XHJcblxyXG4gIHVwZGF0ZUNhbkNvbWJpbmUodGt0OiBJcmxUaWNrZXRPcHRpb24pOiB2b2lkIHtcclxuICAgICh0a3QuaWRlbnRpZmllcnMuYWxsb3dlZFdpdGggfHwgW10pLmZvckVhY2goKGFsbG93ZWQpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLl9jYW5Db21iaW5lW3RrdC50eXBlXVthbGxvd2VkLmpvdXJuZXlJZGVudGlmaWVyXSkge1xyXG4gICAgICAgIHRoaXMuX2NhbkNvbWJpbmVbdGt0LnR5cGVdW2FsbG93ZWQuam91cm5leUlkZW50aWZpZXJdID0gW1xyXG4gICAgICAgICAgYWxsb3dlZC5mYXJlSWRlbnRpZmllclxyXG4gICAgICAgIF07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fY2FuQ29tYmluZVt0a3QudHlwZV1bYWxsb3dlZC5qb3VybmV5SWRlbnRpZmllcl0ucHVzaChcclxuICAgICAgICAgIGFsbG93ZWQuZmFyZUlkZW50aWZpZXJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldExlZ3NGcm9tSXJsSm91cm5leU9wdGlvbihyYWlsSm91cm5leU9wdGlvbjogSXJsSm91cm5leU9wdGlvbik6IGFueVtdIHtcclxuICAgIGxldCBsZWdzOiBhbnlbXSA9IFtdO1xyXG4gICAgaWYgKHJhaWxKb3VybmV5T3B0aW9uPy5zZWdtZW50cy5sZW5ndGgpIHtcclxuICAgICAgbGVncyA9IHJhaWxKb3VybmV5T3B0aW9uLnNlZ21lbnRzLm1hcCgoc2VnbWVudDogSXJsU2VnbWVudCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBvcGVyYXRvcjpcclxuICAgICAgICAgICAgc2VnbWVudC5vcGVyYXRvciB8fCByYWlsSm91cm5leU9wdGlvbi5wcm92aWRlcnNbMF0ucHJvdmlkZXJJZCxcclxuICAgICAgICAgIGRlcGFydHVyZURhdGVUaW1lOiBzZWdtZW50LmRlcGFydERhdGVUaW1lLFxyXG4gICAgICAgICAgZGVwYXJ0dXJlU3RhdGlvbk5hbWU6IHNlZ21lbnQuZGVwYXJ0LFxyXG4gICAgICAgICAgYXJyaXZhbERhdGVUaW1lOiBzZWdtZW50LmFycml2ZURhdGVUaW1lLFxyXG4gICAgICAgICAgYXJyaXZhbFN0YXRpb25OYW1lOiBzZWdtZW50LmFycml2ZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxlZ3M7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZElybFRpY2tldE9wdGlvbihcclxuICAgIGlybEpvdXJuZXlPcHRpb246IElybEpvdXJuZXlPcHRpb24sXHJcbiAgICBpcmxUaWNrZXRPcHRpb246IElybFRpY2tldE9wdGlvbixcclxuICAgIHByb3ZpZGVySW5kZXg6IG51bWJlclxyXG4gICk6IElybFRpY2tldE9wdGlvbiB7XHJcbiAgICByZXR1cm4gaXJsSm91cm5leU9wdGlvbi5wcm92aWRlcnNbcHJvdmlkZXJJbmRleF0udGlja2V0T3B0aW9ucy5maW5kKFxyXG4gICAgICAodGlja2V0T3B0aW9uKSA9PlxyXG4gICAgICAgIHRpY2tldE9wdGlvbi50eXBlID09PSBpcmxUaWNrZXRPcHRpb24udHlwZSAmJlxyXG4gICAgICAgICh0aWNrZXRPcHRpb24ucHJpY2UgPT09IGlybFRpY2tldE9wdGlvbi5wcmljZSB8fFxyXG4gICAgICAgICAgdGlja2V0T3B0aW9uLmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyID09PVxyXG4gICAgICAgICAgICBpcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkU2luZ2xlSm91cm5leVRvQmFza2V0KFxyXG4gICAgc2VydmljZUlkOiBzdHJpbmcsXHJcbiAgICBpcmxRdWVyeTogU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMsXHJcbiAgICBvdXRib3VuZDogSXJsVGlja2V0T3B0aW9uLFxyXG4gICAgaXJsSm91cm5leU9wdGlvbjogSXJsSm91cm5leU9wdGlvblxyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZyhzZXJ2aWNlSWQscmFpbFF1ZXJ5LGlybEpvdXJuZXlPcHRpb24pXHJcbiAgICAvLyAgIC8vIGlmIChpcmxKb3VybmV5T3B0aW9uLnVuc2VsbGFibGUpIHtcclxuICAgIC8vICAgLy8gICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIC8vICAgLy8gfVxyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldEludGVyZmFjZSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmFza2V0U2VydmljZS5nZXREZWZhdWx0QmFza2V0KCk7XHJcbiAgICBjb25zdCBiYXNrZXQgPSBpbnRCYXNrZXQ/LnN1YmplY3QudmFsdWU7XHJcbiAgICBpZiAoYmFza2V0KSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uID0gdGhpcy5nZXRTZWxlY3RlZElybFRpY2tldE9wdGlvbihcclxuICAgICAgICBpcmxKb3VybmV5T3B0aW9uLFxyXG4gICAgICAgIG91dGJvdW5kLFxyXG4gICAgICAgIDBcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgbGVncyA9IHRoaXMuZ2V0TGVnc0Zyb21JcmxKb3VybmV5T3B0aW9uKGlybEpvdXJuZXlPcHRpb24pO1xyXG4gICAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChpcmxKb3VybmV5T3B0aW9uKTtcclxuICAgICAgLy8gc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMucHJvdmlkZXI7XHJcbiAgICAgIGNvbnN0IGJhc2tldEl0ZW0gPSB7XHJcbiAgICAgICAgYmFza2V0OiBiYXNrZXQuaWQsXHJcbiAgICAgICAgc2VydmljZTogc2VydmljZUlkLFxyXG4gICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgb3V0d2FyZERldGFpbDoge1xyXG4gICAgICAgICAgICBhcnJpdmFsRGF0ZVRpbWU6IGlybEpvdXJuZXlPcHRpb24uYXJyaXZlRGF0ZVRpbWUsXHJcbiAgICAgICAgICAgIGFycml2YWxTdGF0aW9uTmFtZTogaXJsSm91cm5leU9wdGlvbi50byxcclxuICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25Db2RlOiBpcmxKb3VybmV5T3B0aW9uLnRvQ29kZSxcclxuICAgICAgICAgICAgZGVwYXJ0dXJlRGF0ZVRpbWU6IGlybEpvdXJuZXlPcHRpb24uZGVwYXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICAgIGRlcGFydHVyZVN0YXRpb25OYW1lOiBpcmxKb3VybmV5T3B0aW9uLmZyb20sXHJcbiAgICAgICAgICAgIGRlcGFydHVyZVN0YXRpb25Db2RlOiBpcmxKb3VybmV5T3B0aW9uLmZyb21Db2RlLFxyXG4gICAgICAgICAgICBzdXBwbGllclRpY2tldHM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdXBwbGllck5hbWU6IGlybEpvdXJuZXlPcHRpb24ucHJvdmlkZXJzWzBdLm5hbWUsXHJcbiAgICAgICAgICAgICAgICB0aWNrZXREZXNjcmlwdGlvbjogc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24udHlwZSxcclxuICAgICAgICAgICAgICAgIHByaWNlOiBzZWxlY3RlZElybFRpY2tldE9wdGlvbi5wcmljZSxcclxuICAgICAgICAgICAgICAgIGxlZ3NcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0cmFuc2FjdGlvbklkZW50aWZpZXI6XHJcbiAgICAgICAgICAgIGlybEpvdXJuZXlPcHRpb24uaWRlbnRpZmllcnMudHJhbnNhY3Rpb25JZGVudGlmaWVyLFxyXG4gICAgICAgICAgb3V0Ym91bmQ6IHtcclxuICAgICAgICAgICAgZmFyZUlkZW50aWZpZXJzOiBbXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgam91cm5leUlkZW50aWZpZXI6XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdXBwbGllcjogaXJsSm91cm5leU9wdGlvbi5wcm92aWRlcnNbMF0ucHJvdmlkZXJJZCxcclxuICAgICAgICAgIHRlcm1zQW5kQ29uZDogdGVybXNBbmRDb25kaXRpb25zXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhZHVsdHM6IGlybFF1ZXJ5LmFkdWx0cyxcclxuICAgICAgICBwcmljZTogc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24ucHJpY2UsXHJcbiAgICAgICAgY3VycmVuY3k6IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLmN1cnJlbmN5IGFzIEN1cnJlbmN5Q29kZSxcclxuICAgICAgICBzZWFyY2hRdWVyeTogaXJsUXVlcnksXHJcbiAgICAgICAgLy8gY28yUGVySXRlbTogaXJsSm91cm5leU9wdGlvbi5jbzJQZXJJdGVtLFxyXG4gICAgICAgIC8vIGNvMlBlclBhc3NlbmdlcjogaXJsSm91cm5leU9wdGlvbi5jbzJQZXJQYXNzZW5nZXIsXHJcbiAgICAgICAgb3V0Ym91bmREYXRlOiBpcmxKb3VybmV5T3B0aW9uLmRlcGFydERhdGVUaW1lXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICAgIGJhc2tldEl0ZW0sXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgICB0aGlzLnRyYXZlbGxlcnNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUmV0dXJuSm91cm5leVRvQmFza2V0KFxyXG4gICAgc2VydmljZUlkOiBzdHJpbmcsXHJcbiAgICBpcmxRdWVyeTogU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMsXHJcbiAgICBpbmJvdW5kOiBJcmxUaWNrZXRPcHRpb24sXHJcbiAgICBpbkpvdXJuZXlPcHRpb246IElybEpvdXJuZXlPcHRpb25cclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG91dGJvdW5kID0gdGhpcy5vdXRib3VuZFRpY2tldDtcclxuICAgIGNvbnN0IG91dEpvdXJuZXlPcHRpb24gPSB0aGlzLm91dGJvdW5kSm91cm5leU9wdGlvbnM7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24gPSB0aGlzLmdldFNlbGVjdGVkSXJsVGlja2V0T3B0aW9uKFxyXG4gICAgICAgIG91dEpvdXJuZXlPcHRpb24sXHJcbiAgICAgICAgb3V0Ym91bmQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBvdXRib3VuZExlZ3MgPSB0aGlzLmdldExlZ3NGcm9tSXJsSm91cm5leU9wdGlvbihvdXRKb3VybmV5T3B0aW9uKTtcclxuICAgICAgY29uc3QgaW5ib3VuZExlZ3MgPSB0aGlzLmdldExlZ3NGcm9tSXJsSm91cm5leU9wdGlvbihpbkpvdXJuZXlPcHRpb24pO1xyXG4gICAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChvdXRKb3VybmV5T3B0aW9uKTtcclxuICAgICAgY29uc3QgYmFza2V0SXRlbSA9IHtcclxuICAgICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlSWQsXHJcbiAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICBvdXR3YXJkRGV0YWlsOiB7XHJcbiAgICAgICAgICAgIGFycml2YWxEYXRlVGltZTogb3V0Sm91cm5leU9wdGlvbi5hcnJpdmVEYXRlVGltZSxcclxuICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25OYW1lOiBvdXRKb3VybmV5T3B0aW9uLnRvLFxyXG4gICAgICAgICAgICBhcnJpdmFsU3RhdGlvbkNvZGU6IG91dEpvdXJuZXlPcHRpb24udG9Db2RlLFxyXG4gICAgICAgICAgICBkZXBhcnR1cmVTdGF0aW9uQ29kZTogb3V0Sm91cm5leU9wdGlvbi5mcm9tQ29kZSxcclxuICAgICAgICAgICAgZGVwYXJ0dXJlRGF0ZVRpbWU6IG91dEpvdXJuZXlPcHRpb24uZGVwYXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICAgIGRlcGFydHVyZVN0YXRpb25OYW1lOiBvdXRKb3VybmV5T3B0aW9uLmZyb20sXHJcbiAgICAgICAgICAgIHN1cHBsaWVyVGlja2V0czogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogb3V0Sm91cm5leU9wdGlvbi5wcm92aWRlcnNbMF0ubmFtZSxcclxuICAgICAgICAgICAgICAgIHRpY2tldERlc2NyaXB0aW9uOiBzZWxlY3RlZElybFRpY2tldE9wdGlvbi50eXBlLFxyXG4gICAgICAgICAgICAgICAgcHJpY2U6IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLnByaWNlLFxyXG4gICAgICAgICAgICAgICAgbGVnczogb3V0Ym91bmRMZWdzXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgaW53YXJkRGV0YWlsOiB7XHJcbiAgICAgICAgICAgIGFycml2YWxEYXRlVGltZTogaW5Kb3VybmV5T3B0aW9uLmFycml2ZURhdGVUaW1lLFxyXG4gICAgICAgICAgICBhcnJpdmFsU3RhdGlvbk5hbWU6IGluSm91cm5leU9wdGlvbi50byxcclxuICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25Db2RlOiBpbkpvdXJuZXlPcHRpb24udG9Db2RlLFxyXG4gICAgICAgICAgICBkZXBhcnR1cmVTdGF0aW9uQ29kZTogaW5Kb3VybmV5T3B0aW9uLmZyb21Db2RlLFxyXG4gICAgICAgICAgICBkZXBhcnR1cmVEYXRlVGltZTogaW5Kb3VybmV5T3B0aW9uLmRlcGFydERhdGVUaW1lLFxyXG4gICAgICAgICAgICBkZXBhcnR1cmVTdGF0aW9uTmFtZTogaW5Kb3VybmV5T3B0aW9uLmZyb20sXHJcbiAgICAgICAgICAgIHN1cHBsaWVyVGlja2V0czogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogaW5Kb3VybmV5T3B0aW9uLnByb3ZpZGVyc1swXS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgdGlja2V0RGVzY3JpcHRpb246IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLnR5cGUsXHJcbiAgICAgICAgICAgICAgICBsZWdzOiBpbmJvdW5kTGVnc1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRyYW5zYWN0aW9uSWRlbnRpZmllcjogb3V0Ym91bmQuaWRlbnRpZmllcnMudHJhbnNhY3Rpb25JZGVudGlmaWVyLFxyXG4gICAgICAgICAgb3V0Ym91bmQ6IHtcclxuICAgICAgICAgICAgZmFyZUlkZW50aWZpZXJzOiBbXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgam91cm5leUlkZW50aWZpZXI6XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdXBwbGllcjogb3V0Sm91cm5leU9wdGlvbi5wcm92aWRlcnNbMF0ucHJvdmlkZXJJZCxcclxuICAgICAgICAgIHRlcm1zQW5kQ29uZDogdGVybXNBbmRDb25kaXRpb25zXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhZHVsdHM6IGlybFF1ZXJ5LmFkdWx0cyxcclxuICAgICAgICBwcmljZTogc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24ucHJpY2UsXHJcbiAgICAgICAgY3VycmVuY3k6IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLmN1cnJlbmN5IGFzIEN1cnJlbmN5Q29kZSxcclxuICAgICAgICBzZWFyY2hRdWVyeTogaXJsUXVlcnksXHJcbiAgICAgICAgb3V0Ym91bmREYXRlOiBvdXRKb3VybmV5T3B0aW9uLmRlcGFydERhdGVUaW1lXHJcbiAgICAgICAgLy8gY28yUGVySXRlbTogb3V0Ym91bmQuY28yUGVySXRlbSxcclxuICAgICAgICAvLyBjbzJQZXJQYXNzZW5nZXI6IG91dGJvdW5kLmNvMlBlclBhc3NlbmdlclxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmZpbHRlclNlbGVjdGVkKCk7XHJcbiAgICAgIHJldHVybiB0aGlzLmJhc2tldFNlcnZpY2UuYWRkVG9CYXNrZXQoXHJcbiAgICAgICAgYmFza2V0SXRlbSxcclxuICAgICAgICBpbnRCYXNrZXQsXHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXMudHJhdmVsbGVyc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdKTogSUNoZWFwZXN0UHJpY2Uge1xyXG4gICAgaWYgKCFyZXN1bHRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcbiAgICBjb25zdCBjdXJyZW5jeSA9XHJcbiAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmRbMF0ucHJvdmlkZXJzWzBdLmNoZWFwZXN0VGlja2V0LmN1cnJlbmN5O1xyXG4gICAgY29uc3QgcHJpY2UgPSB0aGlzLmZpbmRDaGVhcGVzdFRpY2tldChyZXN1bHRzKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFtb3VudDogcHJpY2UsXHJcbiAgICAgIGN1cnJlbmN5Q29kZTogY3VycmVuY3lcclxuICAgIH07XHJcbiAgfVxyXG4gIGZpbmRDaGVhcGVzdFRpY2tldChyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NoZWFwZXN0Rmlyc3QgPSBudWxsO1xyXG4gICAgdGhpcy5fY2hlYXBlc3RTdGFuZGFyZCA9IG51bGw7XHJcbiAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IGNoZWFwZXN0QXJyOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgIHJlc3VsdHMubWFwKChyZXN1bHQpID0+IHtcclxuICAgICAgcmVzdWx0Lm91dGJvdW5kLm1hcCgob3V0KSA9PiB7XHJcbiAgICAgICAgb3V0LnByb3ZpZGVycy5tYXAoKHRrdCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2hlYXBlc3RUaWNrZXQ6IG51bWJlciA9IHRrdC5jaGVhcGVzdFRpY2tldC5wcmljZTtcclxuICAgICAgICAgIHRrdC50aWNrZXRPcHRpb25zLm1hcCgodGt0T3B0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRrdFByaWNlID0gdGt0T3B0aW9uLnByaWNlO1xyXG4gICAgICAgICAgICBjb25zdCB0a3RDbGFzcyA9IHRrdE9wdGlvbi5jbGFzcztcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHRrdENsYXNzID09PSAnRmlyc3QnICYmXHJcbiAgICAgICAgICAgICAgKHRoaXMuX2NoZWFwZXN0Rmlyc3Q/LnByaWNlID4gdGt0UHJpY2UgfHwgIXRoaXMuX2NoZWFwZXN0Rmlyc3QpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NoZWFwZXN0Rmlyc3QgPSB0a3RPcHRpb247XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgdGt0Q2xhc3MgPT09ICdTdGFuZGFyZCcgJiZcclxuICAgICAgICAgICAgICAodGhpcy5fY2hlYXBlc3RTdGFuZGFyZD8ucHJpY2UgPiB0a3RQcmljZSB8fFxyXG4gICAgICAgICAgICAgICAgIXRoaXMuX2NoZWFwZXN0U3RhbmRhcmQpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NoZWFwZXN0U3RhbmRhcmQgPSB0a3RPcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRrdFByaWNlID09PSBjaGVhcGVzdFRpY2tldCkge1xyXG4gICAgICAgICAgICAgIGNoZWFwZXN0QXJyLnB1c2goY2hlYXBlc3RUaWNrZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBNYXRoLm1pbiguLi5jaGVhcGVzdEFycik7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNvcnQgcmVzdWx0cyBieSBwcmljZVxyXG4gICAqXHJcbiAgICogQHJldHVybnNcclxuICAgKiBAbWVtYmVyb2YgaXJsLWVudGVycHJpc2Utc2VhcmNoXHJcbiAgICovXHJcbiAgc29ydEJ5UHJpY2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnByaWNlRGlyID0gIXRoaXMucHJpY2VEaXI7XHJcbiAgICBjb25zdCByZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdID0gdGhpcy5maWx0ZXJTZWxlY3RlZCh0aGlzLl9pc0ZpbHRlcmVkKTtcclxuXHJcbiAgICBjb25zdCBieVByaWNlID0gKGE6IElybEpvdXJuZXlPcHRpb24sIGI6IElybEpvdXJuZXlPcHRpb24pID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMucHJpY2VEaXJcclxuICAgICAgICA/IGEucHJvdmlkZXJzWzBdLmNoZWFwZXN0VGlja2V0LnByaWNlIC1cclxuICAgICAgICAgICAgYi5wcm92aWRlcnNbMF0uY2hlYXBlc3RUaWNrZXQucHJpY2VcclxuICAgICAgICA6IGIucHJvdmlkZXJzWzBdLmNoZWFwZXN0VGlja2V0LnByaWNlIC1cclxuICAgICAgICAgICAgYS5wcm92aWRlcnNbMF0uY2hlYXBlc3RUaWNrZXQucHJpY2U7XHJcbiAgICB9O1xyXG4gICAgcmVzdWx0c1swXS5vdXRib3VuZCA9IHJlc3VsdHNbMF0ub3V0Ym91bmQuc29ydChieVByaWNlKTtcclxuICAgIHJlc3VsdHNbMF0ucmV0dXJuID0gcmVzdWx0c1swXS5yZXR1cm4uc29ydChieVByaWNlKTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydCByZXN1bHRzIGJ5IGRlcGFydHVyZSB0aW1lXHJcbiAgICpcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqIEBtZW1iZXJvZiBpcmwtZW50ZXJwcmlzZS1zZWFyY2hcclxuICAgKi9cclxuICBzb3J0QnlEYXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRlRGlyID0gIXRoaXMuZGF0ZURpcjtcclxuXHJcbiAgICBjb25zdCByZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdID0gdGhpcy5maWx0ZXJTZWxlY3RlZCh0aGlzLl9pc0ZpbHRlcmVkKTtcclxuICAgIGNvbnN0IGJ5RGF0ZSA9IChhOiBJcmxKb3VybmV5T3B0aW9uLCBiOiBJcmxKb3VybmV5T3B0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGVEaXJcclxuICAgICAgICA/IG1vbWVudChhLmRlcGFydERhdGVUaW1lKS51bml4KCkgLSBtb21lbnQoYi5kZXBhcnREYXRlVGltZSkudW5peCgpXHJcbiAgICAgICAgOiBtb21lbnQoYi5kZXBhcnREYXRlVGltZSkudW5peCgpIC0gbW9tZW50KGEuZGVwYXJ0RGF0ZVRpbWUpLnVuaXgoKTtcclxuICAgIH07XHJcbiAgICByZXN1bHRzWzBdLm91dGJvdW5kID0gcmVzdWx0c1swXS5vdXRib3VuZC5zb3J0KGJ5RGF0ZSk7XHJcbiAgICByZXN1bHRzWzBdLnJldHVybiA9IHJlc3VsdHNbMF0ucmV0dXJuLnNvcnQoYnlEYXRlKTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgYWRkT3V0Ym91bmRBbmRGaWx0ZXIoXHJcbiAgICB0aWNrZXQ6IElybFRpY2tldE9wdGlvbldpdGhTZWxlY3RlZCxcclxuICAgIGZ1bGxUaWNrZXQ6IElybEpvdXJuZXlPcHRpb25cclxuICApOiB2b2lkIHtcclxuICAgIHRoaXMub3V0Ym91bmRKb3VybmV5T3B0aW9ucyA9IGZ1bGxUaWNrZXQ7XHJcbiAgICB0aGlzLm91dGJvdW5kVGlja2V0ID0gdGlja2V0O1xyXG4gICAgdGhpcy5maWx0ZXJTZWxlY3RlZCh0cnVlKTtcclxuICB9XHJcblxyXG4gIGZpbHRlclNlbGVjdGVkKGZpbHRlck91dGJvdW5kOiBib29sZWFuID0gZmFsc2UpOiBJcmxKb3VybmV5T3B0aW9uc1tdIHtcclxuICAgIGNvbnN0IHJlc3VsdHM6IElybEpvdXJuZXlPcHRpb25zW10gPSB0aGlzLmhlbHBlcnMuY2xvbmUoXHJcbiAgICAgIHRoaXMuZnVsbFJlc3VsdHMgYXMgSXJsSm91cm5leU9wdGlvbnNbXVxyXG4gICAgKTtcclxuICAgIGlmIChmaWx0ZXJPdXRib3VuZCkge1xyXG4gICAgICB0aGlzLl9pc0ZpbHRlcmVkID0gdHJ1ZTtcclxuICAgICAgcmVzdWx0c1swXS5vdXRib3VuZCA9IFtcclxuICAgICAgICByZXN1bHRzWzBdLm91dGJvdW5kLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGl0ZW0uZGVwYXJ0RGF0ZVRpbWUgPT09XHJcbiAgICAgICAgICAgICAgdGhpcy5fb3V0Ym91bmRKb3VybmV5T3B0aW9ucy5kZXBhcnREYXRlVGltZSAmJlxyXG4gICAgICAgICAgICBpdGVtLmFycml2ZURhdGVUaW1lID09PSB0aGlzLl9vdXRib3VuZEpvdXJuZXlPcHRpb25zLmFycml2ZURhdGVUaW1lXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIF07XHJcbiAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmRbMF0ucHJvdmlkZXJzWzBdLnRpY2tldE9wdGlvbnMgPVxyXG4gICAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmRbMF0ucHJvdmlkZXJzWzBdLnRpY2tldE9wdGlvbnMucmVkdWNlKFxyXG4gICAgICAgICAgKGFjYywgdGlja2V0OiBJcmxUaWNrZXRPcHRpb25XaXRoU2VsZWN0ZWQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRpY2tldC51aWQgPT09IHRoaXMuX291dGJvdW5kVGlja2V0LnVpZCkge1xyXG4gICAgICAgICAgICAgIHRpY2tldC5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYWNjLnB1c2godGlja2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFtdXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2lzRmlsdGVyZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5vdXRib3VuZEpvdXJuZXlPcHRpb25zID0gbnVsbDtcclxuICAgICAgdGhpcy5vdXRib3VuZFRpY2tldCA9IG51bGw7XHJcbiAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmQuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGl0ZW0ucHJvdmlkZXJzWzBdLnRpY2tldE9wdGlvbnMubWFwKFxyXG4gICAgICAgICAgKHRpY2tldDogSXJsVGlja2V0T3B0aW9uV2l0aFNlbGVjdGVkKSA9PiB7XHJcbiAgICAgICAgICAgIHRpY2tldC5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aWNrZXQuU2hvd0RldGFpbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gdGlja2V0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBnZXQgaXJsIHN0YXRpb24gbG9jYXRpb25zXHJcbiAgICogQHBhcmFtIHRlcm0gLSB0aGUgdGVybSB0byBzZWFyY2hcclxuICAgKiBAcGFyYW0gaXNMb2FkaW5nIC0gQmVoYXZpb3JTdWJqZWN0IHNvIHdlIGtub3cgc29tZXRoaW5nIGlzIGhhcHBlbmluZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SXJsRGlzY291bnRDYXJkcygpOiBPYnNlcnZhYmxlPElybFRyYXZlbENhcmRbXT4ge1xyXG4gICAgY29uc3Qgc3VwcGxpZXIgPSB0aGlzLnN1cHBsaWVyO1xyXG4gICAgcmV0dXJuIHRoaXMuaXJsRGlzY291bnRDYXJkc0ZldGNoZXIuZmV0Y2hMaXN0KHtcclxuICAgICAgc3VwcGxpZXJcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVybXNBbmRDb25kKGluSm91cm5leU9wdGlvbjogSXJsSm91cm5leU9wdGlvbikge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdGYXJlIFJ1bGVzJyxcclxuICAgICAgICB2YWx1ZTogaW5Kb3VybmV5T3B0aW9uPy5wcm92aWRlcnNbMF0/LnRpY2tldE9wdGlvbnNbMF0/LmZhcmVSdWxlc1xyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVNlYXJjaCgpOiBPYnNlcnZhYmxlPFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHQ+e1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICBjb25zdCBxdWVyeTogU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIGNvbnN0IGZhdm91cml0ZVNlYXJjaFF1ZXJ5OiBJSXJsU2VhcmNoQXJncyA9IHRoaXMudXBkYXRlU2VyY2hRdWVyeShxdWVyeSk7XHJcbiAgICAgIGNvbnN0IHNlYXJjaEluZm8gPSB7XHJcbiAgICAgICAgbmFtZTogYCR7bW9tZW50KCl9YCxcclxuICAgICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWwsXHJcbiAgICAgICAgc2VhcmNoQXJnczogZmF2b3VyaXRlU2VhcmNoUXVlcnlcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlLnNhdmVGYXZvdXJpdGVTZWFyY2goc2VhcmNoSW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==