@sabstravtech/obtservices 0.0.22051001 → 0.1.6161600

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 (166) hide show
  1. package/angular/components/basket-panel.d.ts +1 -0
  2. package/angular/fetchers.d.ts +5 -0
  3. package/angular/lib/vendor/fetchers/get-companies.fetcher.d.ts +7 -0
  4. package/angular/lib/vendor/fetchers/get-company.fetcher.d.ts +7 -0
  5. package/angular/lib/vendor/fetchers/get-office.fetcher.d.ts +7 -0
  6. package/angular/lib/vendor/fetchers/get-user-default-mi-value.fetcher.d.ts +7 -0
  7. package/angular/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +7 -0
  8. package/angular/lib/vendor/services/enterprise-basket.service.d.ts +4 -3
  9. package/angular/lib/vendor/services/logon.service.d.ts +2 -1
  10. package/angular/lib/vendor/services/user.service.d.ts +9 -3
  11. package/angular/lib/vendor/types/graphql.angular.types.d.ts +614 -550
  12. package/angular/lib/vendor/updaters/create-guest-updater.d.ts +6 -0
  13. package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
  14. package/angular/updaters.d.ts +1 -0
  15. package/base/fetchers.d.ts +5 -0
  16. package/base/lib/vendor/classes/base-enterprise.d.ts +7 -1
  17. package/base/lib/vendor/classes/basket-info-mi-details.impl.d.ts +2 -0
  18. package/base/lib/vendor/classes/bookable-basket.d.ts +2 -0
  19. package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +9 -4
  20. package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +12 -4
  21. package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +14 -7
  22. package/base/lib/vendor/classes/fast-track-enterprise-search.d.ts +5 -4
  23. package/base/lib/vendor/classes/flight-enterprise-search.d.ts +16 -5
  24. package/base/lib/vendor/classes/helpers.d.ts +6 -1
  25. package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +10 -3
  26. package/base/lib/vendor/classes/irl-enterprise-search.d.ts +13 -8
  27. package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +5 -4
  28. package/base/lib/vendor/classes/management-info-and-valid.d.ts +3 -3
  29. package/base/lib/vendor/classes/modal-types.enum.d.ts +1 -0
  30. package/base/lib/vendor/classes/parking-enterprise-search.d.ts +5 -4
  31. package/base/lib/vendor/classes/rail-enterprise-search.d.ts +10 -8
  32. package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +5 -3
  33. package/base/lib/vendor/classes/user-favourite.enum.d.ts +1 -0
  34. package/base/lib/vendor/fetchers/eurostar-quote.fetcher.d.ts +3 -1
  35. package/base/lib/vendor/fetchers/flight-quote.fetcher.d.ts +1 -0
  36. package/base/lib/vendor/fetchers/get-companies.fetcher.d.ts +21 -0
  37. package/base/lib/vendor/fetchers/get-company.fetcher.d.ts +20 -0
  38. package/base/lib/vendor/fetchers/get-office.fetcher.d.ts +20 -0
  39. package/base/lib/vendor/fetchers/get-user-default-mi-value.fetcher.d.ts +21 -0
  40. package/base/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +20 -0
  41. package/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.d.ts +2 -2
  42. package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +2 -0
  43. package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +5 -2
  44. package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +8 -6
  45. package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +1 -0
  46. package/base/lib/vendor/interfaces/Ifast-track-enterprise-search.d.ts +7 -5
  47. package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +8 -1
  48. package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +8 -2
  49. package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +8 -7
  50. package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +1 -0
  51. package/base/lib/vendor/interfaces/Imybookings.service.d.ts +3 -2
  52. package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +1 -0
  53. package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +5 -2
  54. package/base/lib/vendor/interfaces/Isearch.service.d.ts +5 -2
  55. package/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.d.ts +3 -2
  56. package/base/lib/vendor/interfaces/Iuser.service.d.ts +11 -3
  57. package/base/lib/vendor/interfaces/car-hire-search-arg.interface.d.ts +2 -3
  58. package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +2 -0
  59. package/base/lib/vendor/interfaces/summary-interface.d.ts +6 -0
  60. package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
  61. package/base/lib/vendor/models/traveller.object.d.ts +12 -2
  62. package/base/lib/vendor/services/enterprise-basket.service.d.ts +22 -9
  63. package/base/lib/vendor/services/logon.service.d.ts +5 -1
  64. package/base/lib/vendor/services/my-bookings.service.d.ts +3 -2
  65. package/base/lib/vendor/services/search.service.d.ts +27 -23
  66. package/base/lib/vendor/services/url.service.d.ts +2 -0
  67. package/base/lib/vendor/services/user.service.d.ts +36 -5
  68. package/base/lib/vendor/services/webtoken.service.d.ts +6 -0
  69. package/base/lib/vendor/types/graphql.types.d.ts +581 -549
  70. package/base/lib/vendor/types/types.d.ts +48 -6
  71. package/base/lib/vendor/updaters/create-guest-updater.d.ts +19 -0
  72. package/base/sabstravtech-obtservices-base.d.ts +1 -1
  73. package/base/sabstravtech-obtservices-base.metadata.json +1 -1
  74. package/base/updaters.d.ts +1 -0
  75. package/bundles/sabstravtech-obtservices-angular.umd.js +541 -252
  76. package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
  77. package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
  78. package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
  79. package/bundles/sabstravtech-obtservices-base.umd.js +4080 -1471
  80. package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
  81. package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
  82. package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
  83. package/esm2015/angular/components/basket-panel.js +16 -7
  84. package/esm2015/angular/fetchers.js +6 -1
  85. package/esm2015/angular/lib/vendor/fetchers/get-companies.fetcher.js +25 -0
  86. package/esm2015/angular/lib/vendor/fetchers/get-company.fetcher.js +25 -0
  87. package/esm2015/angular/lib/vendor/fetchers/get-office.fetcher.js +25 -0
  88. package/esm2015/angular/lib/vendor/fetchers/get-user-default-mi-value.fetcher.js +25 -0
  89. package/esm2015/angular/lib/vendor/fetchers/get-user-guests.fetcher.js +25 -0
  90. package/esm2015/angular/lib/vendor/services/enterprise-basket.service.js +24 -21
  91. package/esm2015/angular/lib/vendor/services/http-call.service.js +1 -1
  92. package/esm2015/angular/lib/vendor/services/logon.service.js +8 -5
  93. package/esm2015/angular/lib/vendor/services/search.service.js +1 -1
  94. package/esm2015/angular/lib/vendor/services/ticket-queue.service.js +4 -1
  95. package/esm2015/angular/lib/vendor/services/user.service.js +28 -10
  96. package/esm2015/angular/lib/vendor/services/webtoken.service.js +6 -2
  97. package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +1023 -1220
  98. package/esm2015/angular/lib/vendor/updaters/create-guest-updater.js +22 -0
  99. package/esm2015/angular/updaters.js +2 -1
  100. package/esm2015/base/fetchers.js +6 -1
  101. package/esm2015/base/lib/vendor/classes/base-enterprise.js +12 -3
  102. package/esm2015/base/lib/vendor/classes/basket-info-mi-details.impl.js +14 -1
  103. package/esm2015/base/lib/vendor/classes/bookable-basket.js +27 -8
  104. package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +219 -18
  105. package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +235 -67
  106. package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +462 -49
  107. package/esm2015/base/lib/vendor/classes/fast-track-enterprise-search.js +37 -13
  108. package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +281 -62
  109. package/esm2015/base/lib/vendor/classes/helpers.js +32 -3
  110. package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +228 -54
  111. package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +221 -46
  112. package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +101 -14
  113. package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +67 -40
  114. package/esm2015/base/lib/vendor/classes/modal-types.enum.js +2 -1
  115. package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +146 -11
  116. package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +210 -25
  117. package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +58 -4
  118. package/esm2015/base/lib/vendor/classes/user-favourite.enum.js +2 -1
  119. package/esm2015/base/lib/vendor/data/countries.json +484 -242
  120. package/esm2015/base/lib/vendor/fetchers/eurostar-quote.fetcher.js +3 -3
  121. package/esm2015/base/lib/vendor/fetchers/flight-quote.fetcher.js +3 -3
  122. package/esm2015/base/lib/vendor/fetchers/get-companies.fetcher.js +11 -0
  123. package/esm2015/base/lib/vendor/fetchers/get-company.fetcher.js +11 -0
  124. package/esm2015/base/lib/vendor/fetchers/get-office.fetcher.js +11 -0
  125. package/esm2015/base/lib/vendor/fetchers/get-user-default-mi-value.fetcher.js +10 -0
  126. package/esm2015/base/lib/vendor/fetchers/get-user-guests.fetcher.js +11 -0
  127. package/esm2015/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.js +1 -1
  128. package/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +1 -1
  129. package/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +1 -1
  130. package/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +1 -1
  131. package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
  132. package/esm2015/base/lib/vendor/interfaces/Ifast-track-enterprise-search.js +1 -1
  133. package/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +1 -1
  134. package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +2 -1
  135. package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
  136. package/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +1 -1
  137. package/esm2015/base/lib/vendor/interfaces/Imybookings.service.js +1 -1
  138. package/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +1 -1
  139. package/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +1 -1
  140. package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
  141. package/esm2015/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.js +1 -1
  142. package/esm2015/base/lib/vendor/interfaces/Iuser.service.js +1 -1
  143. package/esm2015/base/lib/vendor/interfaces/car-hire-search-arg.interface.js +1 -1
  144. package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
  145. package/esm2015/base/lib/vendor/interfaces/summary-interface.js +1 -1
  146. package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
  147. package/esm2015/base/lib/vendor/models/traveller.object.js +21 -3
  148. package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +129 -43
  149. package/esm2015/base/lib/vendor/services/http-call.service.js +1 -1
  150. package/esm2015/base/lib/vendor/services/logon.service.js +40 -3
  151. package/esm2015/base/lib/vendor/services/my-bookings.service.js +3 -2
  152. package/esm2015/base/lib/vendor/services/requires-reason.service.js +14 -10
  153. package/esm2015/base/lib/vendor/services/search.service.js +100 -117
  154. package/esm2015/base/lib/vendor/services/url.service.js +3 -1
  155. package/esm2015/base/lib/vendor/services/user.service.js +90 -12
  156. package/esm2015/base/lib/vendor/services/webtoken.service.js +14 -1
  157. package/esm2015/base/lib/vendor/types/graphql.types.js +21 -2
  158. package/esm2015/base/lib/vendor/types/types.js +32 -14
  159. package/esm2015/base/lib/vendor/updaters/create-guest-updater.js +11 -0
  160. package/esm2015/base/sabstravtech-obtservices-base.js +1 -1
  161. package/esm2015/base/updaters.js +2 -1
  162. package/fesm2015/sabstravtech-obtservices-angular.js +1254 -1332
  163. package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
  164. package/fesm2015/sabstravtech-obtservices-base.js +3324 -839
  165. package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
  166. package/package.json +1 -1
@@ -4,27 +4,27 @@ import { BaseEnterpriseSearch } from './base-enterprise';
4
4
  import { BehaviorSubject, of, Subject } from 'rxjs';
5
5
  import { map, take } from 'rxjs/operators';
6
6
  import { URLS } from './../services/url.service';
7
- import { LocationTypes, includedExpression, excludedExpression, SearchHandler } from '../types/types';
7
+ import { LocationTypes, includedExpression, excludedExpression, SearchHandler, includedAccessibilityExpression, DifferentInvokdedUserReasons } from '../types/types';
8
8
  import { DistanceTypes, ServiceType } from '../types/graphql.types';
9
9
  import { HotelFilters, HotelView } from '../interfaces/Ihotel-enterprise-search';
10
10
  import _ from 'lodash';
11
+ import { UserFavorurite } from './user-favourite.enum';
11
12
  export var SortTypesHotel;
12
13
  (function (SortTypesHotel) {
13
14
  SortTypesHotel["distance"] = "distance";
14
15
  SortTypesHotel["name"] = "name";
15
16
  SortTypesHotel["price"] = "price";
16
17
  })(SortTypesHotel || (SortTypesHotel = {}));
17
- const CLIENT_PREFERRED_VALUE = 1;
18
- const AGENT_PREFERRED_VALUE = 2;
18
+ const CLIENT_PREFERRED_VALUE = 2;
19
+ const AGENT_PREFERRED_VALUE = 1;
19
20
  export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
20
21
  constructor(hotelFetcher, helpers, userService, environment, avaliabilityService, basketService, storageService, searchService, httpCallService, quickListFetcher, getRailStationFetcher, applyHotelRulesFetcher) {
21
- super(storageService, helpers);
22
+ super(storageService, helpers, searchService, userService);
22
23
  this.hotelFetcher = hotelFetcher;
23
24
  this.userService = userService;
24
25
  this.environment = environment;
25
26
  this.avaliabilityService = avaliabilityService;
26
27
  this.basketService = basketService;
27
- this.searchService = searchService;
28
28
  this.httpCallService = httpCallService;
29
29
  this.quickListFetcher = quickListFetcher;
30
30
  this.getRailStationFetcher = getRailStationFetcher;
@@ -33,6 +33,8 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
33
33
  this.location_types = new BehaviorSubject([]);
34
34
  this.offices = new BehaviorSubject([]);
35
35
  this.lastActivePage = new BehaviorSubject(null);
36
+ this.jitRulesReceived = new BehaviorSubject(false);
37
+ this.reapplySorting = new BehaviorSubject(false);
36
38
  this.galleries = {};
37
39
  this.occupied = 0;
38
40
  this.results_details = {
@@ -84,6 +86,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
84
86
  this.hasChain(hotel) &&
85
87
  this.breakfastTypeFilter(hotel));
86
88
  });
89
+ console.log('nortmal sort results');
87
90
  this.results.next(this.resultsFilterMethod(this.fullResults));
88
91
  };
89
92
  // Lightening Filters
@@ -95,9 +98,12 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
95
98
  this.hasPreferred(hotel) &&
96
99
  this.breakfastTypeFilter(hotel) &&
97
100
  this.getExtraFilter(hotel) &&
98
- this.getAmenitiesFilter(hotel));
101
+ this.getAmenitiesFilter(hotel) &&
102
+ this.accessibleRoomTypeFilter(hotel));
99
103
  });
104
+ console.log('lightning sort results');
100
105
  this.results.next(this.resultsFilterMethod(this.fullResults));
106
+ this.reapplySorting.next(true);
101
107
  };
102
108
  this.results_details.chains = new Set();
103
109
  const data = storageService.getSessionItem(HotelEnterpriseSearch.STORAGE_SESSION_PARAMS) || {
@@ -107,6 +113,14 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
107
113
  ? this.tempParams.currency
108
114
  : this._default_currency;
109
115
  this.updateTempParams(searchService.makeHotelQuery(data.tempParams));
116
+ userService.fullUserDetails.userConfigs.subscribe(data => {
117
+ var _a;
118
+ // this.userConfig.next(data);
119
+ console.log(data);
120
+ if (data && (data === null || data === void 0 ? void 0 : data.hotel_defaults)) {
121
+ this.updateTempParams(searchService.makeHotelQuery((_a = data === null || data === void 0 ? void 0 : data.hotel_defaults) === null || _a === void 0 ? void 0 : _a.config));
122
+ }
123
+ });
110
124
  if (searchService.shouldAddTravellerSubscription()) {
111
125
  searchService.travellerInformation.subscribe((travellers) => {
112
126
  this.travellers = travellers;
@@ -129,6 +143,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
129
143
  this.results_details.chains.add(hotelResult.group);
130
144
  });
131
145
  this.fullResults = results;
146
+ this.jitRulesReceived.next(false);
132
147
  this.results.next(results);
133
148
  this._isValid();
134
149
  this.userService.changeUser.subscribe((user) => {
@@ -156,6 +171,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
156
171
  if (this.searchService.canBook(ServiceType.Hotel)) {
157
172
  // need this check because on refresh we are getting errors - theory that user hasn't fully loaded in yet
158
173
  this._applyTravelRules();
174
+ this.reapplySorting.next(true);
159
175
  }
160
176
  }
161
177
  });
@@ -381,14 +397,24 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
381
397
  })
382
398
  .pipe(take(1))
383
399
  .subscribe((data1) => {
384
- const filterResults = this.resultsFilterMethod(this.fullResults);
400
+ const filterResults = this.resultsFilterMethod ? this.resultsFilterMethod(this.fullResults) : [];
385
401
  const travleResults = filterResults.map((hotel) => {
386
402
  if (data1[hotel.id]) {
387
403
  return this.avaliabilityService.setHotelAvalability(data1[hotel.id]);
388
404
  }
389
405
  return hotel;
390
406
  });
407
+ travleResults.forEach((hotel) => {
408
+ if (hotel.availableRates) {
409
+ hotel.jitRemoveResultRule = false;
410
+ }
411
+ else {
412
+ hotel.jitRemoveResultRule = true;
413
+ }
414
+ });
415
+ this.jitRulesReceived.next(true);
391
416
  this.results.next(travleResults);
417
+ this.reapplySorting.next(true);
392
418
  });
393
419
  }
394
420
  makeLocations(location) {
@@ -492,7 +518,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
492
518
  // Calculating Occupancy
493
519
  const occupancy = this.no_of_occupants / this.no_of_rooms;
494
520
  if (!(occupancy === 1 || occupancy === 2)) {
495
- this.validationMessages.push('Occupants per room must be 1 or 2, if you have an odd number of travellers (greater than one), the no of rooms must be equal');
521
+ this.validationMessages.push('Occupants per room must be 1 or 2; if you have an odd number of travellers (greater than one); the no of rooms must be equal');
496
522
  }
497
523
  console.log(this.validationMessages);
498
524
  this.isValid.next(this.validationMessages.length === 0);
@@ -500,6 +526,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
500
526
  }
501
527
  startSearch() {
502
528
  this.results.next([]);
529
+ this.jitRulesReceived.next(false);
503
530
  this.avaliabilityService.reset();
504
531
  if (this.isValid.value) {
505
532
  this._originalUserSearch = Object.freeze(this.helpers.clone(this.tempParams));
@@ -638,14 +665,16 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
638
665
  return this.helpers.removeNulls(this.query);
639
666
  }
640
667
  buildQuery(ogSearch = false) {
641
- var _a, _b, _c, _d, _e, _f;
668
+ var _a, _b, _c, _d, _e, _f, _g;
642
669
  const tempParams = ogSearch ? this.originalUserSearch : this.tempParams;
670
+ if (!this.userCurrency)
671
+ this.userCurrency = (_a = this.userService.getUserFavoriteObject(UserFavorurite.LocalCurrency)) === null || _a === void 0 ? void 0 : _a.currency;
643
672
  const query = {
644
673
  startDate: tempParams.checkin_date.format('YYYY-MM-DD'),
645
674
  endDate: tempParams.checkout_date.format('YYYY-MM-DD'),
646
675
  rooms: tempParams.no_of_rooms,
647
676
  adults: tempParams.no_of_occupants,
648
- currency: tempParams.currency ? tempParams.currency : null,
677
+ currency: this.userCurrency || tempParams.currency || null,
649
678
  distance: tempParams.distance,
650
679
  distanceType: DistanceTypes.M,
651
680
  maxResults: 100
@@ -667,18 +696,18 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
667
696
  }
668
697
  break;
669
698
  case LocationTypes.TrainStation:
670
- if ((_b = (_a = tempParams.location) === null || _a === void 0 ? void 0 : _a.railstation) === null || _b === void 0 ? void 0 : _b.stationCode) {
699
+ if ((_c = (_b = tempParams.location) === null || _b === void 0 ? void 0 : _b.railstation) === null || _c === void 0 ? void 0 : _c.stationCode) {
671
700
  query.trainStationCode = tempParams.location.railstation.stationCode;
672
701
  }
673
- else if ((_c = tempParams.trainsStation) === null || _c === void 0 ? void 0 : _c.stationCode) {
702
+ else if ((_d = tempParams.trainsStation) === null || _d === void 0 ? void 0 : _d.stationCode) {
674
703
  query.trainStationCode = tempParams.trainsStation.stationCode;
675
704
  }
676
705
  break;
677
706
  case LocationTypes.Office: // Needs to fix in next PR
678
- if ((_d = tempParams.location) === null || _d === void 0 ? void 0 : _d.id) {
707
+ if ((_e = tempParams.location) === null || _e === void 0 ? void 0 : _e.id) {
679
708
  query.officeId = +tempParams.location.id;
680
709
  }
681
- else if ((_e = tempParams.office) === null || _e === void 0 ? void 0 : _e.id) {
710
+ else if ((_f = tempParams.office) === null || _f === void 0 ? void 0 : _f.id) {
682
711
  query.officeId = +tempParams.office.id;
683
712
  }
684
713
  break;
@@ -696,18 +725,21 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
696
725
  }
697
726
  // add chain or group name int he query
698
727
  if (tempParams.hotel_chain) {
699
- query.groupName = (_f = tempParams.hotel_chain) === null || _f === void 0 ? void 0 : _f.name;
728
+ query.groupName = (_g = tempParams.hotel_chain) === null || _g === void 0 ? void 0 : _g.name;
700
729
  }
701
730
  this.query = query;
702
731
  }
703
732
  makeHotelAvalilityObject(hotel) {
733
+ var _a;
734
+ if (!this.userCurrency)
735
+ this.userCurrency = (_a = this.userService.getUserFavoriteObject(UserFavorurite.LocalCurrency)) === null || _a === void 0 ? void 0 : _a.currency;
704
736
  return {
705
737
  hotel: hotel.id,
706
738
  startDate: this.helpers.formatIsoDate(this.checkin_date),
707
739
  endDate: this.helpers.formatIsoDate(this.checkout_date),
708
740
  rooms: this.no_of_rooms,
709
741
  occupants: this.no_of_occupants,
710
- currency: 'GBP'
742
+ currency: this.userCurrency || 'GBP'
711
743
  };
712
744
  }
713
745
  resultsHaveTag(searchTag) {
@@ -779,31 +811,40 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
779
811
  breakfastTypeFilter(hotel) {
780
812
  if (!this.filters.breakfastType.length)
781
813
  return true;
782
- const hotelObject = this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotel), hotel);
783
- if (!hotelObject && !hotelObject.value)
814
+ const hotelObjectValue = this.getHotelObjectValue(hotel);
815
+ if (!hotelObjectValue || !(hotelObjectValue === null || hotelObjectValue === void 0 ? void 0 : hotelObjectValue.rooms))
784
816
  return false;
785
- const hotelObjectValue = hotelObject.value;
786
817
  const isBreakfastIncluded = this.filters.breakfastType.includes(SearchHandler.BREAKFAST_INCLUDED);
787
818
  const isBreakfastExcluded = this.filters.breakfastType.includes(SearchHandler.BREAKFAST_NOT_INCLUDED);
788
- if (hotelObjectValue === null || hotelObjectValue === void 0 ? void 0 : hotelObjectValue.rooms) {
789
- const breakfastMatches = hotelObjectValue.rooms.filter((rooms) => {
790
- if (isBreakfastIncluded && isBreakfastExcluded) {
791
- return rooms;
792
- }
793
- else if (isBreakfastIncluded) {
794
- return (rooms.rateDescription.match(includedExpression) &&
795
- !rooms.rateDescription.match(excludedExpression));
796
- }
797
- else if (isBreakfastExcluded) {
798
- return (!rooms.rateDescription.match(includedExpression) ||
799
- rooms.rateDescription.match(excludedExpression));
800
- }
801
- });
802
- return !!breakfastMatches.length;
803
- }
804
- else {
819
+ const breakfastMatches = hotelObjectValue.rooms.filter((rooms) => {
820
+ if (isBreakfastIncluded && isBreakfastExcluded) {
821
+ return rooms;
822
+ }
823
+ else if (isBreakfastIncluded) {
824
+ return (rooms.rateDescription.match(includedExpression) &&
825
+ !rooms.rateDescription.match(excludedExpression));
826
+ }
827
+ else if (isBreakfastExcluded) {
828
+ return (!rooms.rateDescription.match(includedExpression) ||
829
+ rooms.rateDescription.match(excludedExpression));
830
+ }
831
+ });
832
+ return !!breakfastMatches.length;
833
+ }
834
+ accessibleRoomTypeFilter(hotel) {
835
+ if (!this.filters.accessibleRoomType.length)
836
+ return true;
837
+ const hotelObjectValue = this.getHotelObjectValue(hotel);
838
+ if (!hotelObjectValue || !(hotelObjectValue === null || hotelObjectValue === void 0 ? void 0 : hotelObjectValue.rooms))
805
839
  return false;
806
- }
840
+ const matches = hotelObjectValue.rooms.filter((rooms) => rooms.rateDescription.match(includedAccessibilityExpression) ||
841
+ rooms.roomDescription.match(includedAccessibilityExpression) ||
842
+ rooms.roomType.match(includedAccessibilityExpression));
843
+ return !!matches.length;
844
+ }
845
+ getHotelObjectValue(hotel) {
846
+ const hotelObject = this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotel), hotel);
847
+ return !hotelObject && !hotelObject.value ? null : hotelObject.value;
807
848
  }
808
849
  byMostExpensive() {
809
850
  this.sortByPrice(false);
@@ -864,9 +905,16 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
864
905
  }));
865
906
  }
866
907
  sortByDistance() {
867
- this.results.next(this.helpers.clone(this.fullResults).sort((a, b) => {
868
- return Number(a.location.distance) - Number(b.location.distance);
869
- }));
908
+ let results = this.results.value || [];
909
+ try {
910
+ results = results.sort((a, b) => {
911
+ return Number(a.location.distance) - Number(b.location.distance);
912
+ });
913
+ }
914
+ catch (error) {
915
+ console.error('+++ Error sorting by preferred: ', error, ' +++');
916
+ }
917
+ this.results.next(results);
870
918
  }
871
919
  byPreferred() {
872
920
  let results = this.results.value || [];
@@ -912,11 +960,86 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
912
960
  this.localFilters.hotelName = '';
913
961
  this.localFilters.breakfastType = [];
914
962
  }
963
+ updateSearchFromExpiredBasketItem(basketItem) {
964
+ var _a, _b, _c, _d;
965
+ const searchHotelQuery = basketItem.searchQuery;
966
+ this.currency = searchHotelQuery.currency;
967
+ this.distance = searchHotelQuery.distance;
968
+ this.no_of_rooms = searchHotelQuery.rooms;
969
+ this.checkin_date = moment(searchHotelQuery.startDate);
970
+ this.checkout_date = moment(searchHotelQuery.endDate);
971
+ this.hotel_name = searchHotelQuery.hotelName;
972
+ if (searchHotelQuery.groupName) {
973
+ this.hotel_chain = {
974
+ name: searchHotelQuery.groupName
975
+ };
976
+ }
977
+ if (searchHotelQuery.iata) {
978
+ this.location_type_select = LocationTypes.Airport;
979
+ this.searchService
980
+ .getAirportByCode(searchHotelQuery.iata)
981
+ .subscribe((iata) => {
982
+ const airport = {
983
+ airport: {
984
+ gateway: iata.iataMatch.iata
985
+ }
986
+ };
987
+ this.location = Object.assign(Object.assign({}, airport), iata.iataMatch);
988
+ });
989
+ }
990
+ else if (searchHotelQuery.latitude && searchHotelQuery.longitude) {
991
+ this.location_type_select = LocationTypes.City;
992
+ this.location = {
993
+ name: ((_b = (_a = basketItem.detail) === null || _a === void 0 ? void 0 : _a.hotelAaddress) === null || _b === void 0 ? void 0 : _b.town) ? (_d = (_c = basketItem.detail) === null || _c === void 0 ? void 0 : _c.hotelAaddress) === null || _d === void 0 ? void 0 : _d.town : '',
994
+ latitude: searchHotelQuery.latitude,
995
+ longitude: searchHotelQuery.longitude
996
+ };
997
+ }
998
+ else if (searchHotelQuery.postOrZipCode) {
999
+ this.location_type_select = LocationTypes.Postcode;
1000
+ this.postcode = {
1001
+ name: searchHotelQuery.postOrZipCode,
1002
+ type: LocationTypes.Postcode
1003
+ };
1004
+ }
1005
+ else if (searchHotelQuery.officeId) {
1006
+ this.location_type_select = LocationTypes.Office;
1007
+ this.searchService
1008
+ .getOffice(searchHotelQuery.officeId)
1009
+ .pipe(take(1))
1010
+ .subscribe((office) => {
1011
+ this.office = {
1012
+ id: office.id,
1013
+ name: office.name
1014
+ };
1015
+ });
1016
+ }
1017
+ else if (searchHotelQuery.trainStationCode) {
1018
+ this.location_type_select = LocationTypes.TrainStation;
1019
+ this.getRailStationByCode(searchHotelQuery.trainStationCode).subscribe((trainsStation) => {
1020
+ this.trainsStation = Object.assign(Object.assign({}, trainsStation), { type: LocationTypes.TrainStation });
1021
+ });
1022
+ }
1023
+ else if (searchHotelQuery.countryCode) {
1024
+ this.location_type_select = LocationTypes.Shortlist;
1025
+ this.country = {
1026
+ cCode: searchHotelQuery.countryCode,
1027
+ cName: ''
1028
+ };
1029
+ }
1030
+ // add Travellers
1031
+ if (basketItem.users) {
1032
+ basketItem.users.forEach((user) => {
1033
+ this.searchService.addTraveller(user);
1034
+ });
1035
+ }
1036
+ }
915
1037
  updateFromPreviousSearches(previousItems) {
916
- var _a, _b;
1038
+ var _a, _b, _c;
917
1039
  console.log('PREPOPULATING HOTEL FORM');
918
1040
  const flightItem = (_a = previousItems[ServiceType.Flight]) === null || _a === void 0 ? void 0 : _a.searchQuery;
919
1041
  const railItem = (_b = previousItems[ServiceType.Rail]) === null || _b === void 0 ? void 0 : _b.searchQuery;
1042
+ const irlItem = (_c = previousItems[ServiceType.InternationalRail]) === null || _c === void 0 ? void 0 : _c.searchQuery;
920
1043
  if (flightItem) {
921
1044
  try {
922
1045
  this.location_type_select = LocationTypes.Airport;
@@ -931,7 +1054,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
931
1054
  airport: this.searchService.searches[ServiceType.Flight].arriveLocation
932
1055
  };
933
1056
  }
934
- catch (_c) {
1057
+ catch (_d) {
935
1058
  console.error('Error trying to prepopulate hotel from flight item');
936
1059
  }
937
1060
  }
@@ -947,10 +1070,25 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
947
1070
  this.location = this.searchService.searches[ServiceType.Rail]
948
1071
  .travellingTo;
949
1072
  }
950
- catch (_d) {
1073
+ catch (_e) {
951
1074
  console.error('Error trying to prepopulate hotel from rail item');
952
1075
  }
953
1076
  }
1077
+ else if (irlItem) {
1078
+ try {
1079
+ this.location_type_select = LocationTypes.TrainStation;
1080
+ this.checkin_date = this.searchService.searches[ServiceType.InternationalRail].outBoundDateTime;
1081
+ this.checkout_date =
1082
+ this.searchService.searches[ServiceType.InternationalRail].returnDepartureDateTime;
1083
+ this.trainsStation = this.searchService.searches[ServiceType.InternationalRail]
1084
+ .travellingTo;
1085
+ this.location = this.searchService.searches[ServiceType.InternationalRail]
1086
+ .travellingTo;
1087
+ }
1088
+ catch (_f) {
1089
+ console.error('Error trying to prepopulate hotel from international rail item');
1090
+ }
1091
+ }
954
1092
  }
955
1093
  hasPreferred(hotel) {
956
1094
  const preferredFilters = this.filters.preferred;
@@ -973,6 +1111,24 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
973
1111
  return hotel.preferred.client === true;
974
1112
  }
975
1113
  }
1114
+ atLeastOnePreferredAgentHotel() {
1115
+ let atLeastOne = false;
1116
+ for (let i = 0; i < this.results.value.length; i++) {
1117
+ if (this.results.value[i].preferred.consumer) {
1118
+ return true;
1119
+ }
1120
+ }
1121
+ return false;
1122
+ }
1123
+ atLeastOnePreferredClientHotel() {
1124
+ let atLeastOne = false;
1125
+ for (let i = 0; i < this.results.value.length; i++) {
1126
+ if (this.results.value[i].preferred.client) {
1127
+ return true;
1128
+ }
1129
+ }
1130
+ return false;
1131
+ }
976
1132
  getmaxPriceForCurrency(currency) {
977
1133
  return this.avaliabilityService.maxPriceForCurrency(currency);
978
1134
  }
@@ -1120,7 +1276,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
1120
1276
  console.log(hotelRoom);
1121
1277
  console.log(hotelQuery);
1122
1278
  if (hotel.unavailable) {
1123
- return Promise.resolve(false);
1279
+ return DifferentInvokdedUserReasons.cancel;
1124
1280
  }
1125
1281
  // modify the 'startDate' and 'endDate' properties to have ISO format
1126
1282
  hotelQuery.startDate = new Date(hotelQuery.startDate).toISOString();
@@ -1150,8 +1306,18 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
1150
1306
  const { address: hotelAaddress } = hotel;
1151
1307
  const termsAndConditions = this.getTermsAndCond(hotelRoom, hotelQuery);
1152
1308
  // bookedTravellersChunks.forEach((chunk: Traveller[], index: number) => {
1153
- roomArray.forEach((chunk, index) => {
1154
- this.basketService.addToBasket({
1309
+ return roomArray.reduce((current, chunk, index) => __awaiter(this, void 0, void 0, function* () {
1310
+ var _a, _b, _c, _d, _e, _f;
1311
+ switch (yield current) {
1312
+ case DifferentInvokdedUserReasons.cancel:
1313
+ return DifferentInvokdedUserReasons.cancel;
1314
+ case DifferentInvokdedUserReasons.research:
1315
+ return DifferentInvokdedUserReasons.research;
1316
+ case DifferentInvokdedUserReasons.continue:
1317
+ case DifferentInvokdedUserReasons.newBasket:
1318
+ break;
1319
+ }
1320
+ const wh = yield this.basketService.addToBasket({
1155
1321
  adults: numberToSplit,
1156
1322
  basket: basket.id,
1157
1323
  service: hotel.sourceId.toString(),
@@ -1175,18 +1341,21 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
1175
1341
  price: hotelRoom.total,
1176
1342
  currency: hotelRoom.currencyCode,
1177
1343
  searchQuery,
1178
- outboundDate: hotelQuery.startDate
1344
+ outboundDate: hotelQuery.startDate,
1345
+ lowestPrice: ((_a = this.cheapestPrice) === null || _a === void 0 ? void 0 : _a.amount) != hotelRoom.total || ((_b = this.cheapestPrice) === null || _b === void 0 ? void 0 : _b.currencyCode) != hotelRoom.currencyCode ? (_c = this.cheapestPrice) === null || _c === void 0 ? void 0 : _c.amount : null,
1346
+ lowestPriceCurrency: ((_d = this.cheapestPrice) === null || _d === void 0 ? void 0 : _d.amount) != hotelRoom.total || ((_e = this.cheapestPrice) === null || _e === void 0 ? void 0 : _e.currencyCode) != hotelRoom.currencyCode ?
1347
+ (_f = this.cheapestPrice) === null || _f === void 0 ? void 0 : _f.currencyCode : null
1179
1348
  }, intBasket, this.searchService,
1180
1349
  // this is an array of 1 or 2 travellers which go in 1 room
1181
1350
  // chunk
1182
1351
  bookedTravellersChunks[index] || [], hotelRoom.requiresReason);
1183
- // if (index === bookedTravellersChunks.length - 1) {
1184
- if (index === roomArray.length - 1) {
1185
- return Promise.resolve(true);
1352
+ if (wh === DifferentInvokdedUserReasons.research) {
1353
+ this.performSearch();
1186
1354
  }
1187
- });
1355
+ return wh;
1356
+ }), DifferentInvokdedUserReasons.continue);
1188
1357
  }
1189
- return Promise.resolve(false);
1358
+ return DifferentInvokdedUserReasons.cancel;
1190
1359
  });
1191
1360
  }
1192
1361
  getTermsAndCond(hotelRoom, hotelQuery) {
@@ -1233,7 +1402,12 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
1233
1402
  this.no_of_rooms = fav.rooms;
1234
1403
  this.distance = fav.distance;
1235
1404
  this.currency = fav.currency;
1236
- let location = { latitude: fav.latitude, longitude: fav.longitude, countryCode: fav.countryCode, name: fav.cityName };
1405
+ let location = {
1406
+ latitude: fav.latitude,
1407
+ longitude: fav.longitude,
1408
+ countryCode: fav.countryCode,
1409
+ name: fav.cityName
1410
+ };
1237
1411
  if (fav.trainStationCode)
1238
1412
  location.type = LocationTypes.TrainStation;
1239
1413
  else if (fav.officeId)
@@ -1255,4 +1429,4 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
1255
1429
  }
1256
1430
  HotelEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_hotel';
1257
1431
  HotelEnterpriseSearch.STORAGE_SESSION_RESULTS = 'results_hotel';
1258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsZUFBZSxFQUFRLEVBQUUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUlMLGFBQWEsRUFJYixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFPZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFLTCxhQUFhLEVBU2IsV0FBVyxFQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFpQmhDLE9BQU8sRUFJTCxZQUFZLEVBRVosU0FBUyxFQUVWLE1BQU0sd0NBQXdDLENBQUM7QUFpQmhELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixNQUFNLENBQU4sSUFBWSxjQUlYO0FBSkQsV0FBWSxjQUFjO0lBQ3hCLHVDQUFxQixDQUFBO0lBQ3JCLCtCQUFhLENBQUE7SUFDYixpQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxjQUFjLEtBQWQsY0FBYyxRQUl6QjtBQUVELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sT0FBTyxxQkFPWCxTQUFRLG9CQUlQO0lBaVRELFlBQ1UsWUFBeUMsRUFDakQs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RUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFBO1lBQ3hHLElBQUksR0FBRyxDQUFDLGdCQUFnQjtnQkFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUE7aUJBQy9ELElBQUksR0FBRyxDQUFDLFFBQVE7Z0JBQUUsUUFBUSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFBO2lCQUN0RCxJQUFJLEdBQUcsQ0FBQyxJQUFJO2dCQUFFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQTtpQkFDbkQsSUFBSSxHQUFHLENBQUMsYUFBYTtnQkFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUE7O2dCQUM3RCxRQUFRLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUE7WUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFBO1lBQy9CLElBQUksR0FBRyxDQUFDLFNBQVM7Z0JBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7O2dCQUFNLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQzdGLENBQUM7S0FBQTs7QUF6aERlLDRDQUFzQixHQUFHLGNBQWMsQ0FBQztBQUN4Qyw2Q0FBdUIsR0FBRyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IEJhc2VFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi9iYXNlLWVudGVycHJpc2UnO1xyXG5pbXBvcnQgeyBCYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlSGVscGVyUm91dGluZXMgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIG9mLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQmFzZUVudmlyb25tZW50IH0gZnJvbSAnLi9lbnZpcm9tZW50JztcclxuaW1wb3J0IHsgQmFzZUhvdGVsQXZhbGliaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaG90ZWwtYXZhbGxpYmlsaXR5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVUkxTIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy91cmwuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ291bnRyeSxcclxuICBIb3RlbFF1b3RlUmVzdWx0LFxyXG4gIEhvdGVsUXVvdGVSZXN1bHRBcnJheSxcclxuICBMb2NhdGlvblR5cGVzLFxyXG4gIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgTG9jYXRpb25EZXRhaWxzLFxyXG4gIEhvdGVsQXZhbGliaWxpdHlRdW90ZVJlc3VsdCxcclxuICBpbmNsdWRlZEV4cHJlc3Npb24sXHJcbiAgZXhjbHVkZWRFeHByZXNzaW9uLFxyXG4gIFNlYXJjaEhhbmRsZXIsXHJcbiAgUmVjZW50U2VhcmNoLFxyXG4gIEFpcnBvcnRTZWFyY2hSZXN1bHRzLFxyXG4gIEhvdGVsRGV0YWlscyxcclxuICBIb3RlbERldGFpbHNBcnJheSxcclxuICBTYXZlRmF2b3VyaXRlU2VhcmNoUmVzdWx0LFxyXG4gIE9CVEFpcnBvcnREZXRhaWxzXHJcbn0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2tldEl0ZW0sXHJcbiAgQ29uZmVybWFPZmZpY2VOYW1lcyxcclxuICBDb25mZXJtYU9mZmljZUluZm8sXHJcbiAgQ3VycmVuY3lDb2RlLFxyXG4gIERpc3RhbmNlVHlwZXMsXHJcbiAgSG90ZWxMb2NhdGlvbixcclxuICBIb3RlbFJvb20sXHJcbiAgSG90ZWxUYWcsXHJcbiAgUmFpbFN0YXRpb24sXHJcbiAgU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzLFxyXG4gIFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlYXJjaFJhaWxRdWVyeVZhcmlhYmxlcyxcclxuICBTZXJ2aWNlVHlwZVxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VIb3RlbFF1b3RlRmV0Y2hlcixcclxuICBIb3RlbFF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9ob3RlbC1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBGdWxsVXNlckRldGFpbHMsXHJcbiAgVXNlclNlcnZpY2VJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0l1c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXNlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RIdHRwQ2FsbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9odHRwLWNhbGwuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBIb3RlbEF2YWxpbmlsaXR5RmV0Y2hlclR5cGUgfSBmcm9tICcuLi9mZXRjaGVycy9ob3RlbC1hdmFsaWFiaWxpdHktZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0llbnRlcnByaXNlLWJhc2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBBdmFpbGFiaWxpdHlPYmplY3QsXHJcbiAgRGlzcGxheUZpbHRlclNldHRpbmdzLFxyXG4gIEhvdGVsRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZSxcclxuICBIb3RlbEZpbHRlcnMsXHJcbiAgSG90ZWxUZW1wUGFyYW1zLFxyXG4gIEhvdGVsVmlldyxcclxuICBSZXN1bHREZXRhaWxzXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBJQ2hlYXBlc3RQcmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlYXBlc3QtcHJpY2UnO1xyXG5pbXBvcnQgeyBUcmF2ZWxsZXIgfSBmcm9tICcuLi9tb2RlbHMvdHJhdmVsbGVyLm9iamVjdCc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlcixcclxuICBDb25mZXJtYVF1aWNrbGlzdEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvY29uZmVybWEtcXVpY2tsaXN0LmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRSYWlsU3RhdGlvbkZldGNoZXIsXHJcbiAgR2V0UmFpbFN0YXRpb25GZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC1yYWlsLXN0YXRpb24uZmV0Y2hlcic7XHJcbmltcG9ydCB7IEhvdGVsUmVjZW50U2VhcmNoQXJncyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaG90ZWwtcmVjZW50LXNlYXJjaC1hcmdzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IHJlc3VsdCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7XHJcbiAgQXBwbHlIb3RlbFJ1bGVzRmV0Y2hlclR5cGUsXHJcbiAgQmFzZUhvdGVsUnVsZXNGZXRjaGVyXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvYXBwbHktSklULWhvdGVsLXJ1bGVzLmZldGNoZXInO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuZXhwb3J0IGVudW0gU29ydFR5cGVzSG90ZWwge1xyXG4gIGRpc3RhbmNlID0gJ2Rpc3RhbmNlJyxcclxuICBuYW1lID0gJ25hbWUnLFxyXG4gIHByaWNlID0gJ3ByaWNlJ1xyXG59XHJcblxyXG5jb25zdCBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFID0gMTtcclxuY29uc3QgQUdFTlRfUFJFRkVSUkVEX1ZBTFVFID0gMjtcclxuXHJcbmV4cG9ydCBjbGFzcyBIb3RlbEVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBIUV9RIGV4dGVuZHMgSG90ZWxRdW90ZUZldGNoZXJUeXBlLFxyXG4gICAgSEFfUSBleHRlbmRzIEhvdGVsQXZhbGluaWxpdHlGZXRjaGVyVHlwZSxcclxuICAgIFFMX1EgZXh0ZW5kcyBDb25mZXJtYVF1aWNrbGlzdEZldGNoZXJUeXBlLFxyXG4gICAgR1JTX1EgZXh0ZW5kcyBHZXRSYWlsU3RhdGlvbkZldGNoZXJUeXBlLFxyXG4gICAgSFJfUSBleHRlbmRzIEFwcGx5SG90ZWxSdWxlc0ZldGNoZXJUeXBlXHJcbiAgPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBIb3RlbFRlbXBQYXJhbXMsXHJcbiAgICBIb3RlbFF1b3RlUmVzdWx0QXJyYXksXHJcbiAgICBIb3RlbERldGFpbHNBcnJheVxyXG4gID5cclxuICBpbXBsZW1lbnRzIEhvdGVsRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZVxyXG57XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9QQVJBTVMgPSAnc2VhcmNoX2hvdGVsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAncmVzdWx0c19ob3RlbCc7XHJcblxyXG4gIHB1YmxpYyB0eXBlOiBTZXJ2aWNlVHlwZSA9IFNlcnZpY2VUeXBlLkhvdGVsO1xyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcbiAgcHVibGljIGxvY2F0aW9uX3R5cGVzOiBCZWhhdmlvclN1YmplY3Q8TG9jYXRpb25UeXBlc1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XHJcbiAgICBMb2NhdGlvblR5cGVzW11cclxuICA+KFtdKTtcclxuICBwdWJsaWMgb2ZmaWNlczogQmVoYXZpb3JTdWJqZWN0PExvY2F0aW9uVHlwZXNbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgTG9jYXRpb25UeXBlc1tdXHJcbiAgPihbXSk7XHJcbiAgcHVibGljIGxhc3RBY3RpdmVQYWdlOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XHJcblxyXG4gIHJlYWRvbmx5IGdhbGxlcmllczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgcHJpdmF0ZSBvY2N1cGllZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHJlc3VsdHNfZGV0YWlsczogUmVzdWx0RGV0YWlscyA9IHtcclxuICAgIGNoYWluczogbmV3IFNldDxzdHJpbmc+KCksXHJcbiAgICBhbWVuaXRpZXM6IFtdLFxyXG4gICAgbWF4RGlzdGFuY2U6IDBcclxuICB9O1xyXG4gIHByaXZhdGUgX2NoZWNraW5fZGF0ZV9uZ2I6IE5nYkRhdGVTdHJ1Y3Q7XHJcbiAgcHJpdmF0ZSBfY2hlY2tvdXRfZGF0ZV9uZ2I6IE5nYkRhdGVTdHJ1Y3Q7XHJcbiAgcHJpdmF0ZSBfYm9va2VkVHJhdmVsbGVyczogVHJhdmVsbGVyW10gPSBbXTtcclxuXHJcbiAgZ2V0IGNoYWlucygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWluc107XHJcbiAgfVxyXG5cclxuICBnZXQgYW1lbml0aWVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5yZXN1bHRzX2RldGFpbHMuYW1lbml0aWVzXTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhEaXN0YW5jZSgpOiBudW1iZXIge1xyXG4gICAgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4ID0gTWF0aC5jZWlsKFxyXG4gICAgICBNYXRoLm1heC5hcHBseShcclxuICAgICAgICBNYXRoLFxyXG4gICAgICAgIHRoaXMucmVzdWx0cy52YWx1ZS5tYXAoKG8pID0+IG8ubG9jYXRpb24uZGlzdGFuY2UpXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSA9IHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlLm1heDtcclxuICAgIHJldHVybiB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhQcmljZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmZpbHRlcnMucHJpY2VSYW5nZS5tYXgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGN1cnJlbmN5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeSA9IHZhbHVlO1xyXG4gIH1cclxuICAvLyBFdmVudCBFbWl0dGVyc1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2U6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHVibGljIHNlbGVjdEl0ZW1NYXBWaWV3OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwdWJsaWMgZGlzcGxheTogRGlzcGxheUZpbHRlclNldHRpbmdzID0ge1xyXG4gICAgbWlucHJpY2U6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcclxuICAgIG1heHByaWNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICBmaWx0ZXJzOiB7XHJcbiAgICAgIGJyZWFrZmFzdFR5cGU6IFtdXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy8gcHVibGljIHZhcmlhYmxlc1xyXG4gIHB1YmxpYyBtaW5fZGF0ZSA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSwgLy8gbmdiRGF0ZSBtb250aHMgYXJlIG5vdCAwIGluZGV4ZWRcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIG1pbl9yZXR1cm5fZGF0ZSA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSwgLy8gbmdiRGF0ZSBtb250aHMgYXJlIG5vdCAwIGluZGV4ZWRcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpICsgMSAvLyBtaW4gMSBuaWdodCBzdGF5XHJcbiAgfTtcclxuXHJcbiAgLy8gcHJpdmF0ZSB2YXJpYWJsZXNcclxuICAvLyBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRpbWVzIGhlcmUgLSBtYXliZSBub3JtYWxpc2UgdGhlc2UgaW4gdGhlIHJlcXVlc3QgYm9keT9cclxuXHJcbiAgcHJpdmF0ZSBsb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50VmlldzogSG90ZWxWaWV3ID0gSG90ZWxWaWV3LkxJU1Q7XHJcblxyXG4gIC8vIEZvciBOZ0ZvcmluZyBvdmVyIGluIHRoZSB0ZW1wbGF0ZXNcclxuICBwcml2YXRlIF9tYXhfbm9fb2Zfcm9vbXMgPSA0O1xyXG4gIHByaXZhdGUgX21heF9yb29tc19hcnJheSA9IG5ldyBBcnJheSh0aGlzLl9tYXhfbm9fb2Zfcm9vbXMpLmZpbGwoMCk7XHJcbiAgcHJpdmF0ZSBfbWF4X25vX29mX29jY3VwYW50cyA9IDg7XHJcbiAgcHJpdmF0ZSBfbWF4X29jY3VwYW50X2FycmF5ID0gbmV3IEFycmF5KHRoaXMuX21heF9ub19vZl9vY2N1cGFudHMpLmZpbGwoMCk7XHJcbiAgcHJpdmF0ZSBfZGlzdGFuY2VfbGlzdCA9IFsxLCAyLCA1LCAxMCwgMjAsIDI1XTsgLy8gY29waWVkIGZyb20gb2xkIGZyb250ZW5kIGZvciBub3dcclxuICBwcml2YXRlIF9kZWZhdWx0X2N1cnJlbmN5OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gIGdldCBjaGVja2luX2RhdGVfbmdiKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWNraW5fZGF0ZV9uZ2I7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hlY2tpbl9kYXRlX25nYih2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5fY2hlY2tpbl9kYXRlX25nYiA9IHZhbHVlO1xyXG5cclxuICAgIHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy5jaGVja2luX2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNrb3V0X2RhdGVfbmdiKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWNrb3V0X2RhdGVfbmdiO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNrb3V0X2RhdGVfbmdiKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9jaGVja291dF9kYXRlX25nYiA9IHZhbHVlO1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNraW5fZGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNraW5fZGF0ZShuZXdEYXRlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICBpZiAobmV3RGF0ZSAmJiBuZXdEYXRlLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlID0gbW9tZW50KG5ld0RhdGUpO1xyXG4gICAgICB0aGlzLl9jaGVja2luX2RhdGVfbmdiID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGUpO1xyXG4gICAgICBpZiAobmV3RGF0ZS5pc1NhbWVPckJlZm9yZSh0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZSkpIHtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgPSBtb21lbnQobmV3RGF0ZSkuYWRkKDEsICdkYXknKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY2hlY2tvdXRfZGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBjaGVja291dF9kYXRlKG5ld0RhdGU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIC8vIGlmIChuZXdEYXRlLmlzU2FtZU9yQmVmb3JlKHRoaXMuY2hlY2tpbl9kYXRlKSkgeyAgLy8gbm90IGFsbG93ZWRcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKG5ld0RhdGUgJiYgbmV3RGF0ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUgPSBuZXdEYXRlO1xyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGVfbmdiID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGUpO1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbm9fb2Zfcm9vbXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXM7XHJcbiAgfVxyXG5cclxuICBzZXQgbm9fb2Zfcm9vbXMobmV3Um9vbXM6IG51bWJlcikge1xyXG4gICAgaWYgKG5ld1Jvb21zID4gNCB8fCBuZXdSb29tcyA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyA9IG5ld1Jvb21zO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vX29mX29jY3VwYW50cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHM7XHJcbiAgfVxyXG5cclxuICBzZXQgbm9fb2Zfb2NjdXBhbnRzKG5ld09jYzogbnVtYmVyKSB7XHJcbiAgICBpZiAobmV3T2NjIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50cyA9IG5ld09jYztcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBkZWZhdWx0X2N1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGRlZmF1bHRfY3VycmVuY3koY3VycmVuY3k6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5ID0gY3VycmVuY3k7XHJcbiAgfVxyXG5cclxuICAvLyBtYXkgaGF2ZSB0byBtb2RpZnkgdGhlc2VcclxuICBnZXQgbG9jYXRpb24oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb247XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb24obmV3TG9jOiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbiA9IG5ld0xvYztcclxuXHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9ybWF0dGVkX2xvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uXHJcbiAgICAgID8gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uLmRlc3RpbmF0aW9uXHJcbiAgICAgIDogJ05vIExvY2F0aW9uIFNldCc7IC8vIFRPRE8gLSAgZXhwYW5kIHRoaXMgZm9yIGRpZmZlcmVudCB0eXBlc1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3RhbmNlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmRpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRpc3RhbmNlKG5ld0Rpc3Q6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmRpc3RhbmNlID0gbmV3RGlzdDtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBwcmVmZXJlZF9ob3RlbHNfb25seSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJlZmVyZWRfaG90ZWxzX29ubHk7XHJcbiAgfVxyXG5cclxuICBzZXQgcHJlZmVyZWRfaG90ZWxzX29ubHkobmV3UHJlZjogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnByZWZlcmVkX2hvdGVsc19vbmx5ID0gbmV3UHJlZjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBjb3VudHJ5KCk6IENvdW50cnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jb3VudHJ5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGNvdW50cnkobmV3Q29udDogQ291bnRyeSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNvdW50cnkgPSBuZXdDb250O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc3Rjb2RlKCk6IExvY2F0aW9uRGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnBvc3Rjb2RlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBvc3Rjb2RlKHBvc3Rjb2RlOiBMb2NhdGlvbkRldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wb3N0Y29kZSA9IHBvc3Rjb2RlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRyYWluc1N0YXRpb24oKTogTG9jYXRpb25EZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCB0cmFpbnNTdGF0aW9uKHN0YXRpb246IExvY2F0aW9uRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnRyYWluc1N0YXRpb24gPSBzdGF0aW9uO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9mZmljZSgpOiBDb25mZXJtYU9mZmljZU5hbWVzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMub2ZmaWNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IG9mZmljZShvZmZpY2U6IENvbmZlcm1hT2ZmaWNlTmFtZXMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vZmZpY2UgPSBvZmZpY2U7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICAvLyBBZGRpdGlvbmFsIFZhcmlhYmxlc1xyXG4gIGdldCBob3RlbF9uYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmhvdGVsX25hbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgaG90ZWxfbmFtZShuZXdOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9uYW1lID0gbmV3TmFtZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBob3RlbF9jaGFpbigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9jaGFpbjtcclxuICB9XHJcblxyXG4gIHNldCBob3RlbF9jaGFpbihuZXdDaGFpbjogYW55KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaG90ZWxfY2hhaW4gPSBuZXdDaGFpbjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlcnMgT25seVxyXG5cclxuICBnZXQgbWF4X3Jvb21zX2FycmF5KCk6IG51bWJlcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhfcm9vbXNfYXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4X29jY3VwYW50X2FycmF5KCk6IG51bWJlcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhfb2NjdXBhbnRfYXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4X25vX29mX3Jvb21zKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4X25vX29mX3Jvb21zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3RhbmNlX2xpc3QoKTogbnVtYmVyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3RhbmNlX2xpc3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgbG9jYXRpb25fdHlwZV9zZWxlY3QoKTogTG9jYXRpb25UeXBlcyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0O1xyXG4gIH1cclxuXHJcbiAgc2V0IGxvY2F0aW9uX3R5cGVfc2VsZWN0KHZhbHVlOiBMb2NhdGlvblR5cGVzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJzKCk6IEhvdGVsRmlsdGVycyB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaG90ZWxGZXRjaGVyOiBCYXNlSG90ZWxRdW90ZUZldGNoZXI8SFFfUT4sXHJcbiAgICBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgZW52aXJvbm1lbnQ6IEJhc2VFbnZpcm9ubWVudCxcclxuICAgIHByaXZhdGUgYXZhbGlhYmlsaXR5U2VydmljZTogQmFzZUhvdGVsQXZhbGliaWxpdHlTZXJ2aWNlPEhBX1E+LFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRTZXJ2aWNlOiBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICAgIHN0b3JhZ2VTZXJ2aWNlOiBCYXNlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwQ2FsbFNlcnZpY2U6IEFic3RyYWN0SHR0cENhbGxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBxdWlja0xpc3RGZXRjaGVyOiBCYXNlU2VhcmNoQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyPFFMX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRSYWlsU3RhdGlvbkZldGNoZXI6IEJhc2VHZXRSYWlsU3RhdGlvbkZldGNoZXI8R1JTX1E+LFxyXG4gICAgcHJpdmF0ZSBhcHBseUhvdGVsUnVsZXNGZXRjaGVyOiBCYXNlSG90ZWxSdWxlc0ZldGNoZXI8SFJfUT5cclxuICApIHtcclxuICAgIHN1cGVyKHN0b3JhZ2VTZXJ2aWNlLCBoZWxwZXJzKTtcclxuICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgY29uc3QgZGF0YToge1xyXG4gICAgICB0ZW1wUGFyYW1zOiBIb3RlbFRlbXBQYXJhbXM7XHJcbiAgICB9ID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEhvdGVsRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgdGVtcFBhcmFtczoge30gYXMgSG90ZWxUZW1wUGFyYW1zXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGVmYXVsdF9jdXJyZW5jeSA9IHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeVxyXG4gICAgICA/IHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeVxyXG4gICAgICA6IHRoaXMuX2RlZmF1bHRfY3VycmVuY3k7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXMoc2VhcmNoU2VydmljZS5tYWtlSG90ZWxRdWVyeShkYXRhLnRlbXBQYXJhbXMpKTtcclxuXHJcbiAgICBpZiAoc2VhcmNoU2VydmljZS5zaG91bGRBZGRUcmF2ZWxsZXJTdWJzY3JpcHRpb24oKSkge1xyXG4gICAgICBzZWFyY2hTZXJ2aWNlLnRyYXZlbGxlckluZm9ybWF0aW9uLnN1YnNjcmliZShcclxuICAgICAgICAodHJhdmVsbGVyczogVHJhdmVsbGVyW10pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICBjb25zdCBzcGxpdFRyYXZlbGxlcnMgPSB0aGlzLmhlbHBlcnMuc2VsZWN0ZWRUcmF2ZWxsZXJzKFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXJzLFxyXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5Ib3RlbFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHMgPSBzcGxpdFRyYXZlbGxlcnMuYWR1bHRzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdHMgPVxyXG4gICAgICBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbUFzTGlzdDxIb3RlbERldGFpbHNBcnJheT4oXHJcbiAgICAgICAgdGhpcy5yZXN1bHRzU2Vzc2lvbk5hbWVcclxuICAgICAgKSB8fCBbXTtcclxuICAgIHJlc3VsdHNcclxuICAgICAgLnNsaWNlKDAsIHRoaXMuZW52aXJvbm1lbnQubnVtYmVySG90ZWxUb1ByZWxvYWQpXHJcbiAgICAgIC5mb3JFYWNoKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoU2VydmljZS5jYW5Cb29rKFNlcnZpY2VUeXBlLkhvdGVsKSkge1xyXG4gICAgICAgICAgLy8gbmVlZCB0aGlzIGNoZWNrIGJlY2F1c2Ugb24gcmVmcmVzaCB3ZSBhcmUgZ2V0dGluZyBlcnJvcnMgLSB0aGVvcnkgdGhhdCB1c2VyIGhhc24ndCBmdWxseSBsb2FkZWQgaW4geWV0XHJcbiAgICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5Rm9ySWQoXHJcbiAgICAgICAgICAgIHRoaXMubWFrZUhvdGVsQXZhbGlsaXR5T2JqZWN0KGhvdGVsKSxcclxuICAgICAgICAgICAgaG90ZWxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKGhvdGVsUmVzdWx0OiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zLmFkZChob3RlbFJlc3VsdC5ncm91cCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZnVsbFJlc3VsdHMgPSByZXN1bHRzO1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcblxyXG4gICAgdGhpcy51c2VyU2VydmljZS5jaGFuZ2VVc2VyLnN1YnNjcmliZSgodXNlcjogUGFydGlhbDxGdWxsVXNlckRldGFpbHM+KSA9PiB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25fdHlwZXMubmV4dChbXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5BaXJwb3J0LFxyXG4gICAgICAgIExvY2F0aW9uVHlwZXMuQ2l0eSxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLk9mZmljZSxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLlNob3J0bGlzdCxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvblxyXG4gICAgICBdKTtcclxuICAgICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkRmV0Y2hBbGxPZmZpY2VzKCkpIHtcclxuICAgICAgICB0aGlzLm9mZmljZXMubmV4dChbXSk7IC8vIFRPRE8gZmV0Y2ggb2ZmaWNlc1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycyA9IG5ldyBIb3RlbEZpbHRlcnMoKTtcclxuXHJcbiAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZmV0Y2hpbmcuc3Vic2NyaWJlKChpc0ZldGNoaW5nOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIGlmICghaXNGZXRjaGluZykge1xyXG4gICAgICAgIC8vIFdlJ3ZlIGp1c3QgZmluaXNoZWQgZmV0Y2hpbmcgYXZhbGliaWxpdHkgc28gdXBkYXRlIGZpbHRlcnMuXHJcblxyXG4gICAgICAgIGNvbnN0IG1heE51bWJlciA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5tYXhQcmljZUZvckN1cnJlbmN5KCdHQlAnKTtcclxuICAgICAgICBpZiAobWF4TnVtYmVyID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UubWF4ID0gbWF4TnVtYmVyO1xyXG4gICAgICAgICAgdGhpcy5sb2NhbEZpbHRlcnMucHJpY2VSYW5nZS5tYXggPSBtYXhOdW1iZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NoZWFwZXN0UmVzdWx0UHJpY2UgPSB0aGlzLnVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHMpO1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFNlcnZpY2UuY2FuQm9vayhTZXJ2aWNlVHlwZS5Ib3RlbCkpIHtcclxuICAgICAgICAgIC8vIG5lZWQgdGhpcyBjaGVjayBiZWNhdXNlIG9uIHJlZnJlc2ggd2UgYXJlIGdldHRpbmcgZXJyb3JzIC0gdGhlb3J5IHRoYXQgdXNlciBoYXNuJ3QgZnVsbHkgbG9hZGVkIGluIHlldFxyXG4gICAgICAgICAgdGhpcy5fYXBwbHlUcmF2ZWxSdWxlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcHJvY2Vzc1Jlc3VsdHMocmVzdWx0c1RvTWFwOiBIb3RlbFF1b3RlUmVzdWx0QXJyYXkpIHtcclxuICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlID0gMDtcclxuICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgcmV0dXJuIHJlc3VsdHNUb01hcC5tYXAoXHJcbiAgICAgIChob3RlbFJlc3VsdDogSG90ZWxRdW90ZVJlc3VsdCwgaW5kZXg6IG51bWJlcik6IEhvdGVsRGV0YWlscyA9PiB7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2UgPSBNYXRoLm1heChcclxuICAgICAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlLFxyXG4gICAgICAgICAgaG90ZWxSZXN1bHQubG9jYXRpb24uZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlLm1heCA9IHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlO1xyXG4gICAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucy5hZGQoaG90ZWxSZXN1bHQuZ3JvdXApO1xyXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuZW52aXJvbm1lbnQubnVtYmVySG90ZWxUb1ByZWxvYWQpIHtcclxuICAgICAgICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlGb3JJZChcclxuICAgICAgICAgICAgdGhpcy5tYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWxSZXN1bHQpLFxyXG4gICAgICAgICAgICBob3RlbFJlc3VsdFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5nZXRIb3RlbEF2YWlsYWJpbGl0eShob3RlbFJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNvcnRlZFRhZ3M6IHRoaXMuc29ydFRhZ3MoaG90ZWxSZXN1bHQudGFncyksXHJcbiAgICAgICAgICBEZXRhaWxzOiB7XHJcbiAgICAgICAgICAgIGRpc3RhbmNlX2FpcnBvcnQ6IDAsXHJcbiAgICAgICAgICAgIGRpc3RhbmNlX21ldHJvOiAwLFxyXG4gICAgICAgICAgICBkaXN0YW5jZV9yYWlsOiAwLFxyXG4gICAgICAgICAgICBhaXJwb3J0X2RldGFpbHM6IHsgbmFtZTogJ05vdCByZXR1cm5lZCcgfSxcclxuICAgICAgICAgICAgbWV0cm9fZGV0YWlsczogeyBuYW1lOiAnTm90IHJldHVybmVkJyB9LFxyXG4gICAgICAgICAgICByYWlsX2RldGFpbHM6IHsgbmFtZTogJ05vdCByZXR1cm5lZCcgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC8vIGF2aWxhYmlsaXR5OiB0aGlzLmhvdGVsX2F2YWlsYWJpbGl0eSxcclxuICAgICAgICAgIC4uLmhvdGVsUmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHJlc3VsdHNTZXNzaW9uTmFtZSA9IEhvdGVsRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUkVTVUxUUztcclxuICBwcm90ZWN0ZWQgbXVsdGlSZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG5cclxuICBwcml2YXRlIHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyA9IHt9IGFzIFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzO1xyXG5cclxuICBwcml2YXRlIF9hcHBseVRyYXZlbFJ1bGVzKCkge1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuaGVscGVyc1xyXG4gICAgICAuY2xvbmUodGhpcy5mdWxsUmVzdWx0cyB8fCBbXSlcclxuICAgICAgLm1hcCgoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UudXBkYXRlSG90ZWwoaG90ZWwpO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGhvdGVsLmF2YWlsYWJsZVJhdGVzIHx8IHt9KS5sZW5ndGggPiAwO1xyXG4gICAgICB9KTtcclxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGx5SG90ZWxSdWxlc0ZldGNoZXJcclxuICAgICAgLmZldGNoS2V5ZWRPYmplY3QoJ2lkJywge1xyXG4gICAgICAgIGRhdGFcclxuICAgICAgfSlcclxuICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTE6IFJlY29yZDxzdHJpbmcsIEhvdGVsRGV0YWlscz4pID0+IHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJSZXN1bHRzID0gdGhpcy5yZXN1bHRzRmlsdGVyTWV0aG9kKHRoaXMuZnVsbFJlc3VsdHMpO1xyXG4gICAgICAgIGNvbnN0IHRyYXZsZVJlc3VsdHMgPSBmaWx0ZXJSZXN1bHRzLm1hcCgoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGExW2hvdGVsLmlkXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLnNldEhvdGVsQXZhbGFiaWxpdHkoXHJcbiAgICAgICAgICAgICAgZGF0YTFbaG90ZWwuaWRdXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gaG90ZWw7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVzdWx0cy5uZXh0KHRyYXZsZVJlc3VsdHMpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgbWFrZUxvY2F0aW9ucyhsb2NhdGlvbjogSG90ZWxMb2NhdGlvbltdKTogeyBba2V5OiBzdHJpbmddOiBIb3RlbExvY2F0aW9uW10gfSB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLmFycmF5VG9PYmplY3RBcnJheTxcclxuICAgICAgSG90ZWxMb2NhdGlvbixcclxuICAgICAgUmVjb3JkPHN0cmluZywgSG90ZWxMb2NhdGlvbltdPlxyXG4gICAgPihsb2NhdGlvbiwgWydkaXN0YW5jZVR5cGUnXSk7XHJcbiAgfVxyXG5cclxuICBzb3J0VGFncyh0YWdzOiBIb3RlbFRhZ1tdKTogYW55W10ge1xyXG4gICAgaWYgKHRhZ3MpIHtcclxuICAgICAgcmV0dXJuIFsuLi50YWdzXVxyXG4gICAgICAgIC5zb3J0KChhOiBIb3RlbFRhZywgYjogSG90ZWxUYWcpID0+IHtcclxuICAgICAgICAgIGlmIChhLm5hbWUgPCBiLm5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLm5hbWUgPiBiLm5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5tYXAoKHRhZzogSG90ZWxUYWcpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnRhZyxcclxuICAgICAgICAgICAgaWNvbjogdGhpcy5lbnZpcm9ubWVudC50YWdNYXBbdGFnLm5hbWVdIHx8IHRhZy5pY29uXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0UXVlcnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXModGhpcy5zZWFyY2hTZXJ2aWNlLm1ha2VIb3RlbFF1ZXJ5KCkpO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscyA9IHtcclxuICAgICAgY2hhaW5zOiBuZXcgU2V0PHN0cmluZz4oKSxcclxuICAgICAgYW1lbml0aWVzOiBbXSxcclxuICAgICAgbWF4RGlzdGFuY2U6IDBcclxuICAgIH07XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZhbGlkKCkge1xyXG4gICAgaWYgKCF0aGlzLmRvQ2hlY2tzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBIb3RlbEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAge1xyXG4gICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtc1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMubWluX3JldHVybl9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKFxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlXHJcbiAgICApO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlLmlzU2FtZU9yQWZ0ZXIodGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jaGVja291dF9kYXRlID0gbW9tZW50KHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUpLmFkZCgxLCAnZGF5Jyk7IC8vIGVuc3VyZSB0aGF0IGNoZWNrb3V0IGRhdGUgaXMgbWluIDEgZGF5IGFmdGVyIGNoZWNraW4gZGF0ZVxyXG4gICAgfVxyXG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQ2l0eTpcclxuICAgICAgICBpZiAoIXRoaXMuY291bnRyeSkge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIHNlbGVjdCBjb3VudHJ5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5sb2NhdGlvbiAmJiAhdGhpcy5wb3N0Y29kZSkge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAgICAgJ1BsZWFzZSBzZWxlY3QgYSBob3RlbCBsb2NhdGlvbiBvciBlbnRlciBhIHBvc3Rjb2RlLidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTpcclxuICAgICAgICBpZiAodGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uPy50eXBlICE9PSAnT2ZmaWNlJyAmJiAhdGhpcy5vZmZpY2UpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYW4gb2ZmaWNlLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5BaXJwb3J0OlxyXG4gICAgICAgIGlmICh0aGlzLnRlbXBQYXJhbXM/LmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbi5haXJwb3J0Py5nYXRld2F5KSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSBhaXJwb3J0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSBhaXJwb3J0LicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICF0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24/LnJhaWxzdGF0aW9uPy5zdGF0aW9uQ29kZSAmJlxyXG4gICAgICAgICAgIXRoaXMudHJhaW5zU3RhdGlvbj8uc3RhdGlvbkNvZGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSB0cmFpbiBzdGF0aW9uLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q6XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnkpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgY291bnRyeScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGUuaXNTYW1lT3JCZWZvcmUodGhpcy5jaGVja2luX2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnQ2hlY2tvdXQgZGF0ZSBtdXN0IGJlIGFmdGVyIGNoZWNraW4gZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoZWNrb3V0X2RhdGUgJiYgdGhpcy5jaGVja291dF9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja291dCBkYXRlIG11c3Qgbm90IGJlIGluIHRoZSBwYXN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hlY2tpbl9kYXRlICYmIHRoaXMuY2hlY2tpbl9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja2luIGRhdGUgbXVzdCBub3QgYmUgaW4gdGhlIHBhc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZS5pc0FmdGVyKHRoaXMuY2hlY2tvdXRfZGF0ZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdDaGVja291dCBkYXRhIG11c3QgYmUgYWZ0ZXIgdGhlIGNoZWNraW4gZGF0ZSdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjdWxhdGluZyBPY2N1cGFuY3lcclxuICAgIGNvbnN0IG9jY3VwYW5jeSA9IHRoaXMubm9fb2Zfb2NjdXBhbnRzIC8gdGhpcy5ub19vZl9yb29tcztcclxuICAgIGlmICghKG9jY3VwYW5jeSA9PT0gMSB8fCBvY2N1cGFuY3kgPT09IDIpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgJ09jY3VwYW50cyBwZXIgcm9vbSBtdXN0IGJlIDEgb3IgMiwgaWYgeW91IGhhdmUgYW4gb2RkIG51bWJlciBvZiB0cmF2ZWxsZXJzIChncmVhdGVyIHRoYW4gb25lKSwgdGhlIG5vIG9mIHJvb21zIG11c3QgYmUgZXF1YWwnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2codGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gICAgdGhpcy5pc1ZhbGlkLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID09PSAwKTtcclxuICAgIHRoaXMubWVzc2FnZXMubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgfVxyXG5cclxuICBzdGFydFNlYXJjaCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFtdKTtcclxuICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5yZXNldCgpO1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbFVzZXJTZWFyY2ggPSBPYmplY3QuZnJlZXplKFxyXG4gICAgICAgIHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLnRlbXBQYXJhbXMpXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIGJ1aWxkIHRoZSBxdWVyeVxyXG4gICAgICB0aGlzLmJ1aWxkUXVlcnkoKTtcclxuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zYXZlUmVjZW50U2VhcmNoKFxyXG4gICAgICAgIHRoaXMuZ2V0UmVjZW50U2VhcmNoUXVlcnkodGhpcy5nZXRTZWFyY2hRdWVyeSgpKVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWFyY2goXHJcbiAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID09PSBMb2NhdGlvblR5cGVzLlNob3J0bGlzdFxyXG4gICAgICAgICAgPyB0aGlzLnF1aWNrTGlzdEZldGNoZXIuZmV0Y2hMaXN0KHsgY291bnRyeUNvZGU6IHRoaXMuY291bnRyeS5jQ29kZSB9KVxyXG4gICAgICAgICAgOiB0aGlzLmhvdGVsRmV0Y2hlci5mZXRjaExpc3QocXVlcnkpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzXHJcbiAgKTogU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHJlY2VudFNlYXJjaFF1ZXJ5ID0gdGhpcy51cGRhdGVTZXJjaFF1ZXJ5KHF1ZXJ5KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuSG90ZWwsXHJcbiAgICAgIHNlYXJjaEFyZ3M6IHJlY2VudFNlYXJjaFF1ZXJ5LFxyXG4gICAgICB0cmF2ZWxEYXRlOiB0aGlzLmNoZWNraW5fZGF0ZS5mb3JtYXQoKSxcclxuICAgICAgdHJhdmVsbGVyczogdGhpcy5oZWxwZXJzLmdldFRyYXZlbGxlcnNJZCh0aGlzLnRyYXZlbGxlcnMpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTZXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzXHJcbiAgKTogSG90ZWxSZWNlbnRTZWFyY2hBcmdzIHtcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5OiBIb3RlbFJlY2VudFNlYXJjaEFyZ3MgPSBxdWVyeTtcclxuICAgIHNlYXJjaFF1ZXJ5LmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdDtcclxuICAgIGlmICh0aGlzLmxvY2F0aW9uPy5uYW1lKSB7XHJcbiAgICAgIHNlYXJjaFF1ZXJ5LmNpdHlOYW1lID0gdGhpcy5sb2NhdGlvbi5uYW1lO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoIChzZWFyY2hRdWVyeS5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuT2ZmaWNlOlxyXG4gICAgICAgIHNlYXJjaFF1ZXJ5Lm9mZmljZU5hbWUgPSB0aGlzLm9mZmljZS5uYW1lO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIHNlYXJjaFF1ZXJ5LnRyYWluc1N0YXRpb25EZXRhaWwgPSB0aGlzLnRyYWluc1N0YXRpb247XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5BaXJwb3J0OlxyXG4gICAgICAgIHNlYXJjaFF1ZXJ5LmFpcnBvcnREZXRhaWwgPSB0aGlzLmxvY2F0aW9uLmFpcnBvcnQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0UmVjZW50U2VhcmNoKHJlY2VudFNlYXJjaDogUmVjZW50U2VhcmNoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9jYXRpb25fdHlwZV9zZWxlY3Q7XHJcbiAgICB0aGlzLmN1cnJlbmN5ID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY3VycmVuY3k7XHJcbiAgICB0aGlzLmRpc3RhbmNlID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZGlzdGFuY2U7XHJcbiAgICB0aGlzLm5vX29mX3Jvb21zID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mucm9vbXM7XHJcbiAgICB0aGlzLmNoZWNraW5fZGF0ZSA9IG1vbWVudChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5zdGFydERhdGUpO1xyXG4gICAgdGhpcy5jaGVja291dF9kYXRlID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmVuZERhdGUpO1xyXG4gICAgdGhpcy5ob3RlbF9uYW1lID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuaG90ZWxOYW1lO1xyXG5cclxuICAgIGlmIChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5ncm91cE5hbWUpIHtcclxuICAgICAgdGhpcy5ob3RlbF9jaGFpbiA9IHtcclxuICAgICAgICBuYW1lOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5ncm91cE5hbWVcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgbG9jYXRpb25fdHlwZV9zZWxlY3RcclxuICAgIHN3aXRjaCAodGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgICAgIC5nZXRBaXJwb3J0QnlDb2RlKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmlhdGEpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChpYXRhOiBBaXJwb3J0U2VhcmNoUmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhaXJwb3J0ID0ge1xyXG4gICAgICAgICAgICAgIGFpcnBvcnQ6IHtcclxuICAgICAgICAgICAgICAgIGdhdGV3YXk6IGlhdGEuaWF0YU1hdGNoLmlhdGFcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMubG9jYXRpb24gPSB7IC4uLmFpcnBvcnQsIC4uLmlhdGEuaWF0YU1hdGNoIH07XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkNpdHk6XHJcbiAgICAgICAgdGhpcy5jb3VudHJ5ID0ge1xyXG4gICAgICAgICAgY0NvZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgY05hbWU6ICcnXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBzaG91bGQgYmUgb25lIHNlYXJjaCBtZXRvZCBmb3IgdGhlIGNpdHkgc2VhcmNoOiBsb2NhdGlvbiBvciBwb3N0Y29kZVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxhdGl0dWRlICYmXHJcbiAgICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sb25naXR1ZGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMubG9jYXRpb24gPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmNpdHlOYW1lLFxyXG4gICAgICAgICAgICBsYXRpdHVkZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubGF0aXR1ZGUsXHJcbiAgICAgICAgICAgIGxvbmdpdHVkZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9uZ2l0dWRlXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucG9zdE9yWmlwQ29kZSkge1xyXG4gICAgICAgICAgdGhpcy5wb3N0Y29kZSA9IHtcclxuICAgICAgICAgICAgbmFtZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucG9zdE9yWmlwQ29kZSxcclxuICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5Qb3N0Y29kZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTpcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgICAgIC5nZXRPZmZpY2UocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub2ZmaWNlSWQpXHJcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgob2ZmaWNlOiBDb25mZXJtYU9mZmljZUluZm8pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vZmZpY2UgPSB7XHJcbiAgICAgICAgICAgICAgaWQ6IG9mZmljZS5pZCxcclxuICAgICAgICAgICAgICBuYW1lOiBvZmZpY2UubmFtZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb246XHJcbiAgICAgICAgdGhpcy5nZXRSYWlsU3RhdGlvbkJ5Q29kZShcclxuICAgICAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRyYWluU3RhdGlvbkNvZGVcclxuICAgICAgICApLnN1YnNjcmliZSgodHJhaW5zU3RhdGlvbjogUmFpbFN0YXRpb24pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhaW5zU3RhdGlvbiA9IHtcclxuICAgICAgICAgICAgLi4udHJhaW5zU3RhdGlvbixcclxuICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb25cclxuICAgICAgICAgIH0gYXMgTG9jYXRpb25EZXRhaWxzO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlNob3J0bGlzdDpcclxuICAgICAgICB0aGlzLmNvdW50cnkgPSB7XHJcbiAgICAgICAgICBjQ29kZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY291bnRyeUNvZGUsXHJcbiAgICAgICAgICBjTmFtZTogJydcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJhaWxTdGF0aW9uQnlDb2RlKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8UmFpbFN0YXRpb24+IHtcclxuICAgIGlmIChjb2RlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFJhaWxTdGF0aW9uRmV0Y2hlclxyXG4gICAgICAgIC5mZXRjaExpc3QoeyBpZDogbnVsbCwgY29kZSB9KVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hRdWVyeShvZ1NlYXJjaCA9IGZhbHNlKTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMge1xyXG4gICAgdGhpcy5idWlsZFF1ZXJ5KG9nU2VhcmNoKTtcclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHM8U2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXM+KHRoaXMucXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgYnVpbGRRdWVyeShvZ1NlYXJjaCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBjb25zdCB0ZW1wUGFyYW1zID0gb2dTZWFyY2ggPyB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaCA6IHRoaXMudGVtcFBhcmFtcztcclxuXHJcbiAgICBjb25zdCBxdWVyeTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMgPSB7XHJcbiAgICAgIHN0YXJ0RGF0ZTogdGVtcFBhcmFtcy5jaGVja2luX2RhdGUuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIGVuZERhdGU6IHRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgcm9vbXM6IHRlbXBQYXJhbXMubm9fb2Zfcm9vbXMsXHJcbiAgICAgIGFkdWx0czogdGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHMsXHJcbiAgICAgIGN1cnJlbmN5OiB0ZW1wUGFyYW1zLmN1cnJlbmN5ID8gdGVtcFBhcmFtcy5jdXJyZW5jeSA6IG51bGwsXHJcbiAgICAgIGRpc3RhbmNlOiB0ZW1wUGFyYW1zLmRpc3RhbmNlLFxyXG4gICAgICBkaXN0YW5jZVR5cGU6IERpc3RhbmNlVHlwZXMuTSxcclxuICAgICAgbWF4UmVzdWx0czogMTAwXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ2V0Um9vbU51bWJlcigpO1xyXG4gICAgc3dpdGNoICh0ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0KSB7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5BaXJwb3J0OlxyXG4gICAgICAgIHF1ZXJ5LmlhdGEgPSB0ZW1wUGFyYW1zLmxvY2F0aW9uLmFpcnBvcnQuZ2F0ZXdheTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5DaXR5OlxyXG4gICAgICAgIHF1ZXJ5LmNvdW50cnlDb2RlID0gdGVtcFBhcmFtcy5jb3VudHJ5LmNDb2RlO1xyXG4gICAgICAgIC8vIHNob3VsZCBiZSBvbmUgc2VhcmNoIG1ldG9kIGZvciB0aGUgY2l0eSBzZWFyY2g6IGxvY2F0aW9uIG9yIHBvc3Rjb2RlXHJcbiAgICAgICAgaWYgKHRoaXMubG9jYXRpb24pIHtcclxuICAgICAgICAgIHF1ZXJ5LmxhdGl0dWRlID0gdGVtcFBhcmFtcy5sb2NhdGlvbi5sYXRpdHVkZTtcclxuICAgICAgICAgIHF1ZXJ5LmxvbmdpdHVkZSA9IHRlbXBQYXJhbXMubG9jYXRpb24ubG9uZ2l0dWRlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGVtcFBhcmFtcy5wb3N0Y29kZSkge1xyXG4gICAgICAgICAgcXVlcnkucG9zdE9yWmlwQ29kZSA9IHRlbXBQYXJhbXMucG9zdGNvZGUubmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIGlmICh0ZW1wUGFyYW1zLmxvY2F0aW9uPy5yYWlsc3RhdGlvbj8uc3RhdGlvbkNvZGUpIHtcclxuICAgICAgICAgIHF1ZXJ5LnRyYWluU3RhdGlvbkNvZGUgPSB0ZW1wUGFyYW1zLmxvY2F0aW9uLnJhaWxzdGF0aW9uLnN0YXRpb25Db2RlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGVtcFBhcmFtcy50cmFpbnNTdGF0aW9uPy5zdGF0aW9uQ29kZSkge1xyXG4gICAgICAgICAgcXVlcnkudHJhaW5TdGF0aW9uQ29kZSA9IHRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbi5zdGF0aW9uQ29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuT2ZmaWNlOiAvLyBOZWVkcyB0byBmaXggaW4gbmV4dCBQUlxyXG4gICAgICAgIGlmICh0ZW1wUGFyYW1zLmxvY2F0aW9uPy5pZCkge1xyXG4gICAgICAgICAgcXVlcnkub2ZmaWNlSWQgPSArdGVtcFBhcmFtcy5sb2NhdGlvbi5pZDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRlbXBQYXJhbXMub2ZmaWNlPy5pZCkge1xyXG4gICAgICAgICAgcXVlcnkub2ZmaWNlSWQgPSArdGVtcFBhcmFtcy5vZmZpY2UuaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlNob3J0bGlzdDpcclxuICAgICAgICBxdWVyeS5jb3VudHJ5Q29kZSA9IHRlbXBQYXJhbXMuY291bnRyeS5jQ29kZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5Qb3N0Y29kZTpcclxuICAgICAgICBxdWVyeS5jb3VudHJ5Q29kZSA9IHRlbXBQYXJhbXMuY291bnRyeS5jQ29kZTtcclxuICAgICAgICBxdWVyeS5wb3N0T3JaaXBDb2RlID0gdGVtcFBhcmFtcy5sb2NhdGlvbi5uYW1lO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCBob3RlbCBuYW1lIGluIHRoZSBxdWVyeVxyXG4gICAgaWYgKHRlbXBQYXJhbXMuaG90ZWxfbmFtZSkge1xyXG4gICAgICBxdWVyeS5ob3RlbE5hbWUgPSB0ZW1wUGFyYW1zLmhvdGVsX25hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWRkIGNoYWluIG9yIGdyb3VwIG5hbWUgaW50IGhlIHF1ZXJ5XHJcbiAgICBpZiAodGVtcFBhcmFtcy5ob3RlbF9jaGFpbikge1xyXG4gICAgICBxdWVyeS5ncm91cE5hbWUgPSB0ZW1wUGFyYW1zLmhvdGVsX2NoYWluPy5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcclxuICB9XHJcblxyXG4gIG1ha2VIb3RlbEF2YWxpbGl0eU9iamVjdChob3RlbDogSG90ZWxRdW90ZVJlc3VsdCk6IEF2YWlsYWJpbGl0eU9iamVjdCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBob3RlbDogaG90ZWwuaWQsXHJcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGUodGhpcy5jaGVja2luX2RhdGUpLFxyXG4gICAgICBlbmREYXRlOiB0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZSh0aGlzLmNoZWNrb3V0X2RhdGUpLFxyXG4gICAgICByb29tczogdGhpcy5ub19vZl9yb29tcyxcclxuICAgICAgb2NjdXBhbnRzOiB0aGlzLm5vX29mX29jY3VwYW50cyxcclxuICAgICAgY3VycmVuY3k6ICdHQlAnXHJcbiAgICB9O1xyXG4gIH1cclxuICByZXN1bHRzRmlsdGVyTWV0aG9kOiAocmVzdWx0czogSG90ZWxEZXRhaWxzQXJyYXkpID0+IEhvdGVsRGV0YWlsc0FycmF5O1xyXG5cclxuICBwdWJsaWMgZmlsdGVyUmVzdWx0cyA9ICgpID0+IHtcclxuICAgIHRoaXMucmVzdWx0c0ZpbHRlck1ldGhvZCA9IChyZXN1bHRzOiBIb3RlbERldGFpbHNBcnJheSkgPT5cclxuICAgICAgcmVzdWx0cy5maWx0ZXIoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgdGhpcy5pblByaWNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmluRGlzdGFuY2VSYW5nZShob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuY29udGFpbnNIb3RlbG5hbWUoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmhhc0NoYWluKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5icmVha2Zhc3RUeXBlRmlsdGVyKGhvdGVsKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQodGhpcy5yZXN1bHRzRmlsdGVyTWV0aG9kKHRoaXMuZnVsbFJlc3VsdHMpKTtcclxuICB9O1xyXG5cclxuICAvLyBMaWdodGVuaW5nIEZpbHRlcnNcclxuICBwdWJsaWMgZmlsdGVyTGlnaHRlbmluZ1Jlc3VsdHMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnJlc3VsdHNGaWx0ZXJNZXRob2QgPSAocmVzdWx0czogSG90ZWxEZXRhaWxzQXJyYXkpID0+XHJcbiAgICAgIHJlc3VsdHMuZmlsdGVyKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIHRoaXMuaW5MaWdodGVuaW5nUHJpY2VSYW5nZShob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuY29udGFpbnNIb3RlbG5hbWUoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmhhc0NoYWluKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5oYXNQcmVmZXJyZWQoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmJyZWFrZmFzdFR5cGVGaWx0ZXIoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmdldEV4dHJhRmlsdGVyKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5nZXRBbWVuaXRpZXNGaWx0ZXIoaG90ZWwpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dCh0aGlzLnJlc3VsdHNGaWx0ZXJNZXRob2QodGhpcy5mdWxsUmVzdWx0cykpO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyByZXN1bHRzSGF2ZVRhZyhzZWFyY2hUYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdHNDb250YWluVGFnOiBib29sZWFuO1xyXG4gICAgbGV0IGZpbHRlcmVkUmVzdWx0cyA9IHRoaXMuZnVsbFJlc3VsdHMuZmlsdGVyKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZFRhZ3M6IGFueSA9IGhvdGVsLnRhZ3MuZmlsdGVyKCh0YWc6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMuY29udmVydFRvT25lU3RyaW5nKHRhZy5uYW1lKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXModGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcoc2VhcmNoVGFnKS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgY29udGFpbnNTZWFyY2hUYWcgPVxyXG4gICAgICAgIGZpbHRlcmVkVGFncyAmJiBmaWx0ZXJlZFRhZ3MubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coYEhvdGVsICR7aG90ZWwubmFtZX0gd2l0aCBmaWx0ZXIgYXBwbGllZGAsIGhvdGVsPy50YWdzLCBpc1RydWUpO1xyXG4gICAgICByZXR1cm4gY29udGFpbnNTZWFyY2hUYWc7XHJcbiAgICB9KTtcclxuICAgIHJlc3VsdHNDb250YWluVGFnID1cclxuICAgICAgZmlsdGVyZWRSZXN1bHRzICYmIGZpbHRlcmVkUmVzdWx0cy5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgcmV0dXJuIHJlc3VsdHNDb250YWluVGFnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpblByaWNlUmFuZ2UoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYXZhaWxhYmlsaXR5ID0gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eVZhbHVlKGhvdGVsKTtcclxuICAgIGlmIChhdmFpbGFiaWxpdHkpIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLmhlbHBlcnMuaW5SYW5nZShhdmFpbGFiaWxpdHkubWF4cHJpY2UsIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlKSAmJlxyXG4gICAgICAgIHRoaXMuaGVscGVycy5pblJhbmdlKGF2YWlsYWJpbGl0eS5taW5wcmljZSwgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbkRpc3RhbmNlUmFuZ2UoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4ID09PSAwIHx8XHJcbiAgICAgIHRoaXMuaGVscGVycy5pblJhbmdlKGhvdGVsLmxvY2F0aW9uLmRpc3RhbmNlLCB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnRhaW5zSG90ZWxuYW1lKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRvY2hlY2sgPSB0aGlzLmZpbHRlcnMuaG90ZWxOYW1lLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRvY2hlY2sgJiYgdG9jaGVjay5sZW5ndGggPiAwXHJcbiAgICAgID8gaG90ZWwubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRvY2hlY2spXHJcbiAgICAgIDogdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5MaWdodGVuaW5nUHJpY2VSYW5nZShob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhdmFpbGFiaWxpdHkgPSB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoaG90ZWwpO1xyXG4gICAgaWYgKGF2YWlsYWJpbGl0eSAmJiBPYmplY3Qua2V5cyhhdmFpbGFiaWxpdHkpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBsZXQgbWF4UmFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgbGV0IGZpbmRNYXg6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBtaW5SYW5nZSA9IHRoaXMuaGVscGVycy5pblJhbmdlKFxyXG4gICAgICAgIGF2YWlsYWJpbGl0eS5wcnBuLFxyXG4gICAgICAgIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChhdmFpbGFiaWxpdHk/Lm1heHByaWNlKSB7XHJcbiAgICAgICAgZmluZE1heCA9IGF2YWlsYWJpbGl0eS5tYXhwcmljZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmaW5kTWF4ID0gYXZhaWxhYmlsaXR5Py5yb29tcy5yZWR1Y2UoXHJcbiAgICAgICAgICAob3AsIGl0ZW0pID0+IChvcCA9IG9wID4gaXRlbS50b3RhbCA/IG9wIDogaXRlbS50b3RhbCksXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBtYXhSYW5nZSA9IHRoaXMuaGVscGVycy5pblJhbmdlKGZpbmRNYXgsIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlKTtcclxuICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IG1pblJhbmdlICYmIG1heFJhbmdlO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0NoYWluKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRvY2hlY2sgPSAodGhpcy5maWx0ZXJzLmNoYWluIHx8IFtdKS5tYXAoKGNoYWluOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gICAgICByZXR1cm4gY2hhaW4udG9Mb3dlckNhc2UoKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRvY2hlY2sgJiYgdG9jaGVjay5sZW5ndGhcclxuICAgICAgPyAhIXRvY2hlY2suZmluZCgoY2hhaW46IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGhvdGVsLmdyb3VwLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY2hhaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIDogdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVycy5icmVha2Zhc3RUeXBlLmxlbmd0aCkgcmV0dXJuIHRydWU7XHJcbiAgICBjb25zdCBob3RlbE9iamVjdCA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlGb3JJZChcclxuICAgICAgdGhpcy5tYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWwpLFxyXG4gICAgICBob3RlbFxyXG4gICAgKTtcclxuICAgIGlmICghaG90ZWxPYmplY3QgJiYgIWhvdGVsT2JqZWN0LnZhbHVlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBob3RlbE9iamVjdFZhbHVlOiBIb3RlbEF2YWxpYmlsaXR5UXVvdGVSZXN1bHQgPSBob3RlbE9iamVjdC52YWx1ZTtcclxuICAgIGNvbnN0IGlzQnJlYWtmYXN0SW5jbHVkZWQgPSB0aGlzLmZpbHRlcnMuYnJlYWtmYXN0VHlwZS5pbmNsdWRlcyhcclxuICAgICAgU2VhcmNoSGFuZGxlci5CUkVBS0ZBU1RfSU5DTFVERURcclxuICAgICk7XHJcbiAgICBjb25zdCBpc0JyZWFrZmFzdEV4Y2x1ZGVkID0gdGhpcy5maWx0ZXJzLmJyZWFrZmFzdFR5cGUuaW5jbHVkZXMoXHJcbiAgICAgIFNlYXJjaEhhbmRsZXIuQlJFQUtGQVNUX05PVF9JTkNMVURFRFxyXG4gICAgKTtcclxuICAgIGlmIChob3RlbE9iamVjdFZhbHVlPy5yb29tcykge1xyXG4gICAgICBjb25zdCBicmVha2Zhc3RNYXRjaGVzID0gaG90ZWxPYmplY3RWYWx1ZS5yb29tcy5maWx0ZXIoKHJvb21zOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoaXNCcmVha2Zhc3RJbmNsdWRlZCAmJiBpc0JyZWFrZmFzdEV4Y2x1ZGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gcm9vbXM7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0JyZWFrZmFzdEluY2x1ZGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICByb29tcy5yYXRlRGVzY3JpcHRpb24ubWF0Y2goaW5jbHVkZWRFeHByZXNzaW9uKSAmJlxyXG4gICAgICAgICAgICAhcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGV4Y2x1ZGVkRXhwcmVzc2lvbilcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0JyZWFrZmFzdEV4Y2x1ZGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAhcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGluY2x1ZGVkRXhwcmVzc2lvbikgfHxcclxuICAgICAgICAgICAgcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGV4Y2x1ZGVkRXhwcmVzc2lvbilcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuICEhYnJlYWtmYXN0TWF0Y2hlcy5sZW5ndGg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBieU1vc3RFeHBlbnNpdmUoKSB7XHJcbiAgICB0aGlzLnNvcnRCeVByaWNlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbWluXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBkZWJ1ZyBzZXQgdGhpcyB0byB0cnVlIHRvIG91dHB1dCBjb25zb2xlIGxvZ3NcclxuICAgKiBAZGVzY3JpcHRpb24gc29ydHMgcmVzdWx0cyBieSBwcmljZSBhY2NvcmRpbmcgdG8gdGhlICdtaW4nIHBhcmFtYXRlci4gbWluID0gdHJ1ZSAobG93ZXN0IHByaWNlIGZpcnN0KSwgbWluID0gZmFsc2UgKGhpZ2hlc3QgcHJpY2UgZmlyc3QpXHJcbiAgICogSW4gc3VtbWFyeSwgdGhpcyBtZXRob2QgY3JlYXRlcyBhIHNvcnRlZCBhcnJheSBvZiBob3RlbHMgd2l0aCBwcmljZXMgYW5kIGFuIGFycmF5IG9mIGhvdGVscyBXSVRIT1VUIHByaWNlcyxcclxuICAgKiB0aGVuIGZpbmFsbHkgam9pbnMgdGhlc2UgMiB0ZW1wb3JhcnkgYXJyYXlzIHRvZ2V0aGVyIGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBuZXh0IG9ic2VydmFibGUuXHJcbiAgICovXHJcblxyXG4gIHNvcnRCeVByaWNlKG1pbiA9IHRydWUsIGRlYnVnID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIC8vIHN0b3JlIGFsbCByZXN1bHRzXHJcbiAgICBjb25zdCBob3RlbHM6IEhvdGVsRGV0YWlsc0FycmF5ID0gdGhpcy5mdWxsUmVzdWx0cztcclxuXHJcbiAgICAvLyBnZXQgaG90ZWxzIHdpdGggYW5kIHdpdGhvdXQgcHJpY2VzXHJcbiAgICBjb25zdCBob3RlbHNXaXRoUHJpY2VzOiBIb3RlbERldGFpbHNBcnJheSA9IFtdO1xyXG4gICAgY29uc3QgaG90ZWxzV2l0aG91dFByaWNlczogSG90ZWxEZXRhaWxzQXJyYXkgPSBbXTtcclxuICAgIGhvdGVscy5tYXAoKGhvdGVsUmVzdWx0KSA9PiB7XHJcbiAgICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShob3RlbFJlc3VsdCk/LnBycG5cclxuICAgICAgICA/IGhvdGVsc1dpdGhQcmljZXMucHVzaChob3RlbFJlc3VsdClcclxuICAgICAgICA6IGhvdGVsc1dpdGhvdXRQcmljZXMucHVzaChob3RlbFJlc3VsdCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzb3J0IGhvdGVscyB3aXRoIHByaWNlcyBhY2NvcmRpbmcgdG8gdGhlICdtaW4nIHBhcmFtZXRlciBmb3IgdGhlIG9yZGVyXHJcbiAgICBob3RlbHNXaXRoUHJpY2VzLnNvcnQoKGZpcnN0OiBIb3RlbERldGFpbHMsIHNlY29uZDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpcnN0UHJpY2UgPVxyXG4gICAgICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShmaXJzdCk/LnBycG47XHJcbiAgICAgIGNvbnN0IHNlY29uZFByaWNlID1cclxuICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoc2Vjb25kKT8ucHJwbjtcclxuICAgICAgcmV0dXJuIG1pblxyXG4gICAgICAgID8gZmlyc3RQcmljZSA+IHNlY29uZFByaWNlXHJcbiAgICAgICAgICA/IDFcclxuICAgICAgICAgIDogc2Vjb25kUHJpY2UgPiBmaXJzdFByaWNlXHJcbiAgICAgICAgICA/IC0xXHJcbiAgICAgICAgICA6IDBcclxuICAgICAgICA6IGZpcnN0UHJpY2UgPCBzZWNvbmRQcmljZVxyXG4gICAgICAgID8gMVxyXG4gICAgICAgIDogc2Vjb25kUHJpY2UgPCBmaXJzdFByaWNlXHJcbiAgICAgICAgPyAtMVxyXG4gICAgICAgIDogMDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGpvaW4gaG90ZWxzIHdpdGggcHJpY2VzIHRvIGhvdGVscyBXSVRIT1VUIHByaWNlc1xyXG4gICAgY29uc3Qgc29ydGVkSG90ZWxzID0gWy4uLmhvdGVsc1dpdGhQcmljZXMsIC4uLmhvdGVsc1dpdGhvdXRQcmljZXNdO1xyXG5cclxuICAgIC8vIHRyaWdnZXIgbmV4dCBvYnNlcnZhYmxlXHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChzb3J0ZWRIb3RlbHMpO1xyXG5cclxuICAgIC8vIGRpc3BsYXkgY29uc29sZSBsb2dzIGlmIGRlYnVnIGlzIHRydWUgKGNvdWxkIHByb3ZlIHVzZWZ1bCBpbiBmdXR1cmUpXHJcbiAgICBpZiAoZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJysrIHNvcnRCeVByaWNlKCkgY2FsbGVkICsrJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBob3RlbCArKycsIGhvdGVscyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBob3RlbHNXaXRoUHJpY2VzICsrJywgaG90ZWxzV2l0aFByaWNlcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBob3RlbHNXaXRob3V0UHJpY2VzICsrJywgaG90ZWxzV2l0aG91dFByaWNlcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBzb3J0ZWRIb3RlbHMgKysnLCBzb3J0ZWRIb3RlbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc29ydEJ5TmFtZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFxyXG4gICAgICB0aGlzLmhlbHBlcnNcclxuICAgICAgICAuY2xvbmUodGhpcy5mdWxsUmVzdWx0cylcclxuICAgICAgICAuc29ydCgoZnN0OiBIb3RlbERldGFpbHMsIHNuZDogSG90ZWxEZXRhaWxzKTogbnVtYmVyID0+IHtcclxuICAgICAgICAgIHJldHVybiBmc3QubmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoc25kLm5hbWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzb3J0QnlEaXN0YW5jZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFxyXG4gICAgICB0aGlzLmhlbHBlcnMuY2xvbmUodGhpcy5mdWxsUmVzdWx0cykuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIoYS5sb2NhdGlvbi5kaXN0YW5jZSkgLSBOdW1iZXIoYi5sb2NhdGlvbi5kaXN0YW5jZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYnlQcmVmZXJyZWQoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IHRoaXMucmVzdWx0cy52YWx1ZSB8fCBbXTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNvcnQoKGE6IEhvdGVsRGV0YWlscywgYjogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlZmVycmVkVG9JbnQoYikgLSB0aGlzLnByZWZlcnJlZFRvSW50KGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJysrKyBFcnJvciBzb3J0aW5nIGJ5IHByZWZlcnJlZDogJywgZXJyb3IsICcgKysrJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZWZlcnJlZFRvSW50KGhvdGVsOiBIb3RlbERldGFpbHMpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgKGhvdGVsLnByZWZlcnJlZC5jbGllbnQgPyBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFIDogMCkgK1xyXG4gICAgICAoaG90ZWwucHJlZmVycmVkLmNvbnN1bWVyID8gQUdFTlRfUFJFRkVSUkVEX1ZBTFVFIDogMClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludFRvUHJlZmVycmVkKHByZWZlcnJlZDogMCB8IDEgfCAyIHwgMykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXHJcbiAgICAgIGNsaWVudDogKHByZWZlcnJlZCAmIENMSUVOVF9QUkVGRVJSRURfVkFMVUUpID09PSBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFLFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWJpdHdpc2VcclxuICAgICAgY29uc3VtZXI6IChwcmVmZXJyZWQgJiBBR0VOVF9QUkVGRVJSRURfVkFMVUUpID09PSBBR0VOVF9QUkVGRVJSRURfVkFMVUVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhZGRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcsIHR5cGU6IGtleW9mIEhvdGVsRmlsdGVycyk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsdDogYW55ID0gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgICBmaWx0W3R5cGVdLnB1c2goZmlsdGVyKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZpbHRlcihmaWx0ZXI6IHN0cmluZywgdHlwZToga2V5b2YgSG90ZWxGaWx0ZXJzKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWx0ID0gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0W3R5cGVdKSkge1xyXG4gICAgICAoZmlsdFt0eXBlXSBhcyBzdHJpbmdbXSkgPSAoZmlsdFt0eXBlXSBhcyBzdHJpbmdbXSkuZmlsdGVyKFxyXG4gICAgICAgIChjaGFpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZmlsdGVyICE9PSBjaGFpbjtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5jaGFpbiA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuYW1lbml0eXR5cGUgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLnByZWZlcnJlZCA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuZXh0cmEgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmhvdGVsTmFtZSA9ICcnO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuYnJlYWtmYXN0VHlwZSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRnJvbVByZXZpb3VzU2VhcmNoZXMoXHJcbiAgICBwcmV2aW91c0l0ZW1zOiBSZWNvcmQ8U2VydmljZVR5cGUsIEJhc2tldEl0ZW0+XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygnUFJFUE9QVUxBVElORyBIT1RFTCBGT1JNJyk7XHJcbiAgICBjb25zdCBmbGlnaHRJdGVtOiBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyA9XHJcbiAgICAgIHByZXZpb3VzSXRlbXNbU2VydmljZVR5cGUuRmxpZ2h0XT8uc2VhcmNoUXVlcnk7XHJcbiAgICBjb25zdCByYWlsSXRlbTogU2VhcmNoUmFpbFF1ZXJ5VmFyaWFibGVzID1cclxuICAgICAgcHJldmlvdXNJdGVtc1tTZXJ2aWNlVHlwZS5SYWlsXT8uc2VhcmNoUXVlcnk7XHJcbiAgICBpZiAoZmxpZ2h0SXRlbSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ7XHJcbiAgICAgICAgdGhpcy5jaGVja2luX2RhdGUgPVxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkZsaWdodF0ub3V0Qm91bmREYXRlO1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XS5pbmJvdW5kRGF0ZTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uID0ge1xyXG4gICAgICAgICAgbmFtZTogKFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XVxyXG4gICAgICAgICAgICAgIC5hcnJpdmVMb2NhdGlvbiBhcyBPQlRBaXJwb3J0RGV0YWlsc1xyXG4gICAgICAgICAgKS5kZXN0aW5hdGlvbixcclxuICAgICAgICAgIHR5cGU6ICdBaXJwb3J0JyxcclxuICAgICAgICAgIGFpcnBvcnQ6XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdLmFycml2ZUxvY2F0aW9uXHJcbiAgICAgICAgfSBhcyBhbnk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHRyeWluZyB0byBwcmVwb3B1bGF0ZSBob3RlbCBmcm9tIGZsaWdodCBpdGVtJyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAocmFpbEl0ZW0pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb247XHJcbiAgICAgICAgdGhpcy5jaGVja2luX2RhdGUgPVxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlJhaWxdLm91dEJvdW5kRGF0ZVRpbWU7XHJcbiAgICAgICAgdGhpcy5jaGVja291dF9kYXRlID1cclxuICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5SYWlsXS5pbkJvdW5kRGF0ZVRpbWU7XHJcbiAgICAgICAgdGhpcy50cmFpbnNTdGF0aW9uID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlJhaWxdXHJcbiAgICAgICAgICAudHJhdmVsbGluZ1RvIGFzIExvY2F0aW9uRGV0YWlscztcclxuICAgICAgICB0aGlzLmxvY2F0aW9uID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlJhaWxdXHJcbiAgICAgICAgICAudHJhdmVsbGluZ1RvIGFzIExvY2F0aW9uRGV0YWlscztcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdHJ5aW5nIHRvIHByZXBvcHVsYXRlIGhvdGVsIGZyb20gcmFpbCBpdGVtJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzUHJlZmVycmVkKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHByZWZlcnJlZEZpbHRlcnMgPSB0aGlzLmZpbHRlcnMucHJlZmVycmVkO1xyXG5cclxuICAgIC8vIEVtcHR5IHByZWZlcnJlZCBmaWx0ZXJzIE9SIFwiQW55XCJcclxuICAgIGlmIChcclxuICAgICAgIXByZWZlcnJlZEZpbHRlcnMubGVuZ3RoIHx8XHJcbiAgICAgIHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5BTlkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWdlbmN5IChjb25zdW1lcikgJiYgQ2xpZW50XHJcbiAgICBpZiAoXHJcbiAgICAgIHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5BR0VOQ1kpICYmXHJcbiAgICAgIHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5DTElFTlQpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBob3RlbC5wcmVmZXJyZWQuY29uc3VtZXIgPT09IHRydWUgJiYgaG90ZWwucHJlZmVycmVkLmNsaWVudCA9PT0gdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFnZW5jeVxyXG4gICAgaWYgKHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5BR0VOQ1kpKSB7XHJcbiAgICAgIHJldHVybiBob3RlbC5wcmVmZXJyZWQuY29uc3VtZXIgPT09IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xpZW50XHJcbiAgICBpZiAocHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkNMSUVOVCkpIHtcclxuICAgICAgcmV0dXJuIGhvdGVsLnByZWZlcnJlZC5jbGllbnQgPT09IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0bWF4UHJpY2VGb3JDdXJyZW5jeShjdXJyZW5jeTogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UubWF4UHJpY2VGb3JDdXJyZW5jeShjdXJyZW5jeSk7XHJcbiAgfVxyXG5cclxuICAvLyBMaWdodGVuaW5nIEV4dHJhIEZpbHRlcnNcclxuICBwcml2YXRlIGdldEV4dHJhRmlsdGVyKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNoZWNrQXZhaWxhYmlsaXR5ID0gdGhpcy5maWx0ZXJzLmV4dHJhLmluY2x1ZGVzKFxyXG4gICAgICBTZWFyY2hIYW5kbGVyLkFWQUlMQUJJTElUWVxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja0F2YWlsYWJpbGl0eSkge1xyXG4gICAgICByZXR1cm4gaG90ZWwudW5hdmFpbGFibGUgPT09IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hlY2tGZW1hbGVGcmllbmRseSA9IHRoaXMuZmlsdGVycy5leHRyYS5pbmNsdWRlcyhcclxuICAgICAgU2VhcmNoSGFuZGxlci5GRU1BTEVfRlJJRU5ETFlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tGZW1hbGVGcmllbmRseSkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGhvdGVsLnRhZ3MuZmlsdGVyKCh0YWcpID0+IHtcclxuICAgICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcodGFnLm5hbWUpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lLmluY2x1ZGVzKFxyXG4gICAgICAgICAgICAgIHRoaXMuY29udmVydFRvT25lU3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgU2VhcmNoSGFuZGxlci5GRU1BTEVfRlJJRU5ETFlcclxuICAgICAgICAgICAgICApLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmxlbmd0aCA+IDBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gTGlnaHRlbmluZyBBbWVybml0aWVzIEZpbHRlcnNcclxuICBwcml2YXRlIGdldEFtZW5pdGllc0ZpbHRlcihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUcnVlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHRoaXMuZmlsdGVycy5hbWVuaXR5dHlwZS5mb3JFYWNoKChzZWFyY2gpID0+IHtcclxuICAgICAgbGV0IGZpbHRlcmVkUmVzdWx0czogYW55ID0gaG90ZWwudGFncy5maWx0ZXIoKHRhZykgPT4ge1xyXG4gICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMuY29udmVydFRvT25lU3RyaW5nKHRhZy5uYW1lKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXModGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcoc2VhcmNoKS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpc1RydWUgPSBmaWx0ZXJlZFJlc3VsdHMgJiYgZmlsdGVyZWRSZXN1bHRzLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBIb3RlbCAke2hvdGVsLm5hbWV9IHdpdGggZmlsdGVyIGFwcGxpZWRgLCBob3RlbD8udGFncywgaXNUcnVlKTtcclxuICAgICAgcmV0dXJuIGlzVHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGlzVHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29udmVydFRvT25lU3RyaW5nKGl0ZW06IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGl0ZW0ucmVwbGFjZSgvW15hLXpBLVpdL2csICcnKTtcclxuICB9XHJcblxyXG4gIGdldEltYWdlcyhIb2xpZGF5Q29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgdXJsID1cclxuICAgICAgdGhpcy5lbnZpcm9ubWVudC5ob3N0QmFzZVVybCArXHJcbiAgICAgIFVSTFMuQ09ORklSTUFfUEhPVE9fVVJMICtcclxuICAgICAgSG9saWRheUNvZGUuc3BsaXQoJywnKVswXTtcclxuICAgIGNvbnN0IGltZ1Byb3ZpZGVyID0gJ2h0dHBzOi8vd3d3LnZmbWlpLmNvbS8nOyAvLyBpbWcgcHJvdmlkZXIgdGhhdHMgaG9sZHMgaW1hZ2VzLCB1c2VkIHRvIG1hdGNoIHdoaWNoIGltYWdlcyBvbiBwYWdlIGJlbG9uZ3MgdG8gZ2FsbGVyeS5cclxuICAgIGlmICh0aGlzLmdhbGxlcmllc1tIb2xpZGF5Q29kZV0pIHtcclxuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2FsbGVyaWVzW0hvbGlkYXlDb2RlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENhbGxTZXJ2aWNlLmdldCh1cmwgYXMgVVJMUywgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KS5waXBlKFxyXG4gICAgICBtYXAoKGltYWdlc0hUTUwpID0+IHtcclxuICAgICAgICBpZiAoIWltYWdlc0hUTUwpIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKGBHYWxsZXJ5IGZvciAke0hvbGlkYXlDb2RlfSBjYW4gbm90IGJlIGxvYWRlZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRlbXAuaW5uZXJIVE1MID0gaW1hZ2VzSFRNTDtcclxuICAgICAgICBjb25zdCBpbWFnZXMgPSBBcnJheS5mcm9tKHRlbXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpKS5yZWR1Y2UoXHJcbiAgICAgICAgICAoYWNjLCBpbWcpID0+IHtcclxuICAgICAgICAgICAgaWYgKGltZy5zcmMuaW5jbHVkZXMoaW1nUHJvdmlkZXIpKSB7XHJcbiAgICAgICAgICAgICAgYWNjLnB1c2goaW1nLnNyYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBbXVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKCFpbWFnZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aHJvdyBFcnJvcihcclxuICAgICAgICAgICAgYFRoZXJlIGlzIG5vIG1lZGlhIGNvbnRlbnQgcHJvdmlkZWQgZm9yIHRoaXMgaG90ZWwgJHtIb2xpZGF5Q29kZX1gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKHRoaXMuZ2FsbGVyaWVzW0hvbGlkYXlDb2RlXSA9IGltYWdlcyk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYWRkUGFnaW5hdGlvblBhZ2UoY3VycmVudFBhZ2U6IG51bWJlcik6IGFueSB7XHJcbiAgICBjb25zdCBrZXkgPSAnUGFnaW5hdGlvblBhZ2VDb3VudCc7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKGtleSwgY3VycmVudFBhZ2UpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oa2V5KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVZpZXcoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gSG90ZWxWaWV3LkxJU1QpIHtcclxuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IEhvdGVsVmlldy5NQVA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gSG90ZWxWaWV3LkxJU1Q7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYWxjRGF5RGlmZigpOiBudW1iZXIge1xyXG4gICAgY29uc3QgY2hlY2tvdXQgPSBtb21lbnQodGhpcy5jaGVja291dF9kYXRlKTtcclxuICAgIGNvbnN0IGNoZWNraW4gPSBtb21lbnQodGhpcy5jaGVja2luX2RhdGUpO1xyXG4gICAgcmV0dXJuIGNoZWNrb3V0LnN0YXJ0T2YoJ2RheScpLmRpZmYoY2hlY2tpbi5zdGFydE9mKCdkYXknKSwgJ2RheXMnKTtcclxuICB9XHJcbiAgdXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0czogSG90ZWxEZXRhaWxzW10pOiBJQ2hlYXBlc3RQcmljZSB7XHJcbiAgICBjb25zdCBjdXJyZW5jaWVzS2V5ID0gT2JqZWN0LmtleXModGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmN1cnJlbmNpZXMpO1xyXG4gICAgaWYgKCghcmVzdWx0cy5sZW5ndGggJiYgIWN1cnJlbmNpZXNLZXkubGVuZ3RoKSB8fCAhY3VycmVuY2llc0tleS5sZW5ndGgpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbmNpZSA9IGN1cnJlbmNpZXNLZXlbMF07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYW1vdW50OiB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuY3VycmVuY2llc1tjdXJyZW5jaWVdLm1pbnByaWNlLFxyXG4gICAgICBjdXJyZW5jeUNvZGU6IGN1cnJlbmNpZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldFJvb21OdW1iZXIoKSB7XHJcbiAgICBsZXQgcm9vbXNPY2N1cGFuY3k6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE51bWJlcih0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMpOyBpKyspIHtcclxuICAgICAgY29uc3QgbmV3Um9vbU9jY3VwYW5jeSA9IHtcclxuICAgICAgICBBZHVsdHM6IHRoaXMuY2FsY1Jvb21PY2N1cGFuY3koXHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMsXHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzXHJcbiAgICAgICAgKSxcclxuICAgICAgICBDaGlsZHJlbjogMCxcclxuICAgICAgICBJbmZhbnRzOiAwXHJcbiAgICAgIH07XHJcbiAgICAgIHJvb21zT2NjdXBhbmN5LnB1c2gobmV3Um9vbU9jY3VwYW5jeSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJvb21zOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJvb21zT2NjdXBhbmN5Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvb21zT2NjdXBhbmN5W2luZGV4XS5BZHVsdHM7IGorKykge1xyXG4gICAgICAgIHJvb21zLnB1c2goaW5kZXggKyAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLSBzaG91bGQgd2UgYWRkIG5ldyBwcm9wZXJ0eSByb29tTnVtYmVyIGZvciB0cmF2ZWxsZXI/IC0tXHJcbiAgICAvLyBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50cmF2ZWxsZXJzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgLy8gICB0aGlzLnRyYXZlbGxlcnNbaW5kZXhdLnJvb21OdW1iZXIgPSByb29tc1tpbmRleF07XHJcbiAgICAvLyB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcdEBkZXNjIC0gcmV0dXJuIHRoZSBvY2N1cGFuY3kgZm9yIGEgcm9vbSAtIG5lZWQgdG8gY2FsY3VsYXRlIGJhc2VkIG9uIG5vIG9mIHJvb21zLCBubyBvZiB0cmF2ZWxsZXJzIGFuZCBjdXJyZW50bHkgb2NjdXBpZWQgcm9vbXM7XHJcbiAgICoqL1xyXG5cclxuICBjYWxjUm9vbU9jY3VwYW5jeShub19vZl9yb29tczogbnVtYmVyLCB0cmF2ZWxsZXJzOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgICdObyBvZiBUcmF2ZWxsZXJzOiAnICtcclxuICAgICAgICB0cmF2ZWxsZXJzICtcclxuICAgICAgICAnfCBObyBvZiByb29tczogJyArXHJcbiAgICAgICAgbm9fb2Zfcm9vbXMgK1xyXG4gICAgICAgICcgfCBBc3NpZ25lZDogJyArXHJcbiAgICAgICAgdGhpcy5vY2N1cGllZFxyXG4gICAgKTtcclxuICAgIGxldCByb29tT2NjdXBhbmN5OiBudW1iZXIgPSBNYXRoLmNlaWwodHJhdmVsbGVycyAvIG5vX29mX3Jvb21zKTtcclxuXHJcbiAgICBpZiAodHJhdmVsbGVycyAtIHRoaXMub2NjdXBpZWQgPCByb29tT2NjdXBhbmN5KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdXZSBoYXZlIHJ1biBvdXQgb2Ygb2NjdXBpZXJzIScpO1xyXG4gICAgICByb29tT2NjdXBhbmN5ID0gdHJhdmVsbGVycyAtIHRoaXMub2NjdXBpZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvb21PY2N1cGFuY3kgPD0gMCkge1xyXG4gICAgICByb29tT2NjdXBhbmN5ID0gMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9jY3VwaWVkICs9IHJvb21PY2N1cGFuY3k7XHJcbiAgICByZXR1cm4gcm9vbU9jY3VwYW5jeTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZEhvdGVsUm9vbVRvQmFza2V0KFxyXG4gICAgaG90ZWw6IEhvdGVsRGV0YWlscyxcclxuICAgIGhvdGVsUm9vbTogSG90ZWxSb29tLFxyXG4gICAgaG90ZWxRdWVyeTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMsXHJcbiAgICB0cmF2ZWxsZXJzPzogVHJhdmVsbGVyW11cclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKGhvdGVsKTtcclxuICAgIGNvbnNvbGUubG9nKGhvdGVsUm9vbSk7XHJcbiAgICBjb25zb2xlLmxvZyhob3RlbFF1ZXJ5KTtcclxuXHJcbiAgICBpZiAoaG90ZWwudW5hdmFpbGFibGUpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbW9kaWZ5IHRoZSAnc3RhcnREYXRlJyBhbmQgJ2VuZERhdGUnIHByb3BlcnRpZXMgdG8gaGF2ZSBJU08gZm9ybWF0XHJcbiAgICBob3RlbFF1ZXJ5LnN0YXJ0RGF0ZSA9IG5ldyBEYXRlKGhvdGVsUXVlcnkuc3RhcnREYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgaG90ZWxRdWVyeS5lbmREYXRlID0gbmV3IERhdGUoaG90ZWxRdWVyeS5lbmREYXRlKS50b0lTT1N0cmluZygpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBjb3B5IG9mIGhvdGVsUXVlcnkgYW5kIGRlbGV0ZSAnYWR1bHRzJyBwcm9wZXJ0eSBhcyBzZWFyY2hRdWVyeVNjaGVtYSBmb3IgaG90ZWwgKGNvbmZlcm1hKSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgaXQgYmVpbmcgYWRkZWRcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0geyAuLi5ob3RlbFF1ZXJ5IH07XHJcbiAgICBkZWxldGUgc2VhcmNoUXVlcnkuYWR1bHRzO1xyXG5cclxuICAgIGNvbnN0IGRldGFpbFJvb21zOiB7XHJcbiAgICAgIHJhdGVEZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gICAgICByb29tRGVzY3JpcHRpb246IHN0cmluZztcclxuICAgICAgcm9vbUlkOiBzdHJpbmc7XHJcbiAgICAgIHJvb21UeXBlOiBzdHJpbmc7XHJcbiAgICAgIHJhdGVDb2RlOiBzdHJpbmc7XHJcbiAgICAgIGNoZWNrSW46IGFueTtcclxuICAgICAgY2hlY2tPdXQ6IGFueTtcclxuICAgIH1bXSA9IFtdO1xyXG4gICAgZGV0YWlsUm9vbXMucHVzaCh7XHJcbiAgICAgIHJhdGVEZXNjcmlwdGlvbjogaG90ZWxSb29tLnJhdGVEZXNjcmlwdGlvbixcclxuICAgICAgcm9vbURlc2NyaXB0aW9uOiBob3RlbFJvb20ucm9vbURlc2NyaXB0aW9uLFxyXG4gICAgICByb29tSWQ6IGhvdGVsUm9vbS5yb29tSWQsXHJcbiAgICAgIHJvb21UeXBlOiBob3RlbFJvb20ucm9vbVR5cGUsXHJcbiAgICAgIHJhdGVDb2RlOiBob3RlbFJvb20ucmF0ZUNvZGUsXHJcbiAgICAgIGNoZWNrSW46IGhvdGVsUXVlcnkuc3RhcnREYXRlLFxyXG4gICAgICBjaGVja091dDogaG90ZWxRdWVyeS5lbmREYXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgLy8gRU5ULTI0NDcgYWRkIGluIGNodW5rcyB3aXRoIHBlb3BsZSBwZXIgcm9vbVxyXG4gICAgICBjb25zdCBwYXhQZXJSb29tOiBudW1iZXIgPSB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzO1xyXG5cclxuICAgICAgLy8gRU5ULTMwNDggVG8gYmUgY2hhbmdlZCB3aGVuIHRyYXZsbGVycyBmbG93IGFkZGVkXHJcbiAgICAgIGNvbnN0IHJvb21BcnJheSA9IG5ldyBBcnJheSh0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMpLmZpbGwoJ1RFU1QnKTtcclxuICAgICAgY29uc3QgbnVtYmVyVG9TcGxpdCA9IHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyA9PT0gcGF4UGVyUm9vbSA/IDEgOiAyO1xyXG4gICAgICBjb25zdCBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzID0gXy5jaHVuayh0aGlzLnRyYXZlbGxlcnMsIG51bWJlclRvU3BsaXQpO1xyXG4gICAgICBjb25zdCB7IGFkZHJlc3M6IGhvdGVsQWFkZHJlc3MgfSA9IGhvdGVsO1xyXG4gICAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChob3RlbFJvb20sIGhvdGVsUXVlcnkpO1xyXG4gICAgICAvLyBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzLmZvckVhY2goKGNodW5rOiBUcmF2ZWxsZXJbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICByb29tQXJyYXkuZm9yRWFjaCgoY2h1bms6IFRyYXZlbGxlcltdLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBhZHVsdHM6IG51bWJlclRvU3BsaXQsXHJcbiAgICAgICAgICAgIGJhc2tldDogYmFza2V0LmlkLFxyXG4gICAgICAgICAgICBzZXJ2aWNlOiBob3RlbC5zb3VyY2VJZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICBob3RlbEFkZHJlc3M6IHtcclxuICAgICAgICAgICAgICAgIHN0cmVldE5hbWU6IGhvdGVsQWFkZHJlc3MuYWRkcmVzc0xpbmUxLFxyXG4gICAgICAgICAgICAgICAgdG93bjogaG90ZWxBYWRkcmVzcy5hZGRyZXNzTGluZTIsXHJcbiAgICAgICAgICAgICAgICBjb3VudHk6IGhvdGVsQWFkZHJlc3MuYWRkcmVzc0xpbmUzLFxyXG4gICAgICAgICAgICAgICAgcG9zdGNvZGU6IGhvdGVsQWFkZHJlc3MucG9zdE9yWmlwQ29kZSxcclxuICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlOiBob3RlbEFhZGRyZXNzLmNvdW50cnlDb2RlXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBob3RlbERlc2NyaXB0aW9uOiBob3RlbC5ncm91cCxcclxuICAgICAgICAgICAgICBob3RlbElkOiBob3RlbC5pZCxcclxuICAgICAgICAgICAgICBob3RlbE5hbWU6IGhvdGVsLm5hbWUsXHJcbiAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgYWx3YXlzIGJlIDEgYXMgd2UgYm9vayAxIHJvb20gYXMgYSB0aW1lXHJcbiAgICAgICAgICAgICAgbnVtYmVyT2ZSb29tczogMSxcclxuICAgICAgICAgICAgICByb29tczogZGV0YWlsUm9vbXMsXHJcbiAgICAgICAgICAgICAgdGVybXNBbmRDb25kOiB0ZXJtc0FuZENvbmRpdGlvbnNcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLy8gbm8gbG9uZ2VyICogbm8gb2Ygcm9vbXMgYXMgZWFjaCByb29tIGlzIGFkZGVkIDEgYnkgMVxyXG4gICAgICAgICAgICBwcmljZTogaG90ZWxSb29tLnRvdGFsLCAvLyAqIGhvdGVsUXVlcnkucm9vbXMsXHJcbiAgICAgICAgICAgIGN1cnJlbmN5OiBob3RlbFJvb20uY3VycmVuY3lDb2RlIGFzIEN1cnJlbmN5Q29kZSxcclxuICAgICAgICAgICAgc2VhcmNoUXVlcnksXHJcbiAgICAgICAgICAgIG91dGJvdW5kRGF0ZTogaG90ZWxRdWVyeS5zdGFydERhdGVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpbnRCYXNrZXQsXHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2UsXHJcbiAgICAgICAgICAvLyB0aGlzIGlzIGFuIGFycmF5IG9mIDEgb3IgMiB0cmF2ZWxsZXJzIHdoaWNoIGdvIGluIDEgcm9vbVxyXG4gICAgICAgICAgLy8gY2h1bmtcclxuICAgICAgICAgIGJvb2tlZFRyYXZlbGxlcnNDaHVua3NbaW5kZXhdIHx8IFtdLFxyXG4gICAgICAgICAgaG90ZWxSb29tLnJlcXVpcmVzUmVhc29uXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBpZiAoaW5kZXggPT09IGJvb2tlZFRyYXZlbGxlcnNDaHVua3MubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGlmIChpbmRleCA9PT0gcm9vbUFycmF5Lmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVybXNBbmRDb25kKFxyXG4gICAgaG90ZWxSb29tOiBIb3RlbFJvb20sXHJcbiAgICBob3RlbFF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlc1xyXG4gICkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdSYXRlIEluZm9ybWF0aW9uJyxcclxuICAgICAgICB2YWx1ZTogaG90ZWxSb29tLnJhdGVEZXNjcmlwdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0NhbmNlbGxhdGlvbiBQb2xpY3knLFxyXG4gICAgICAgIHZhbHVlOiBob3RlbFJvb20ucG9saWNpZXMuY2FuY2VsbGF0aW9uXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnUmF0ZSBDb2RlJyxcclxuICAgICAgICB2YWx1ZTogaG90ZWxSb29tLnJhdGVDb2RlXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnUm9vbSBJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IGhvdGVsUm9vbS5yb29tRGVzY3JpcHRpb25cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdEZXBvc2l0IEFtb3VudCcsXHJcbiAgICAgICAgdmFsdWU6XHJcbiAgICAgICAgICAoaG90ZWxSb29tLnRvdGFsICogaG90ZWxRdWVyeS5yb29tcykudG9TdHJpbmcoKSArIGhvdGVsUXVlcnkuY3VycmVuY3lcclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHNhdmVTZWFyY2goaG90ZWxOYW1lOiBzdHJpbmcgPSBudWxsKTogT2JzZXJ2YWJsZTxTYXZlRmF2b3VyaXRlU2VhcmNoUmVzdWx0PiB7XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkLnZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICBjb25zdCBmYXZvdXJpdGVTZWFyY2hRdWVyeSA9IHRoaXMudXBkYXRlU2VyY2hRdWVyeShxdWVyeSk7XHJcbiAgICAgIGlmIChob3RlbE5hbWUpIGZhdm91cml0ZVNlYXJjaFF1ZXJ5LmhvdGVsTmFtZSA9IGhvdGVsTmFtZTtcclxuICAgICAgY29uc3Qgc2VhcmNoSW5mbyA9IHtcclxuICAgICAgICBuYW1lOiBgJHttb21lbnQoKX1gLFxyXG4gICAgICAgIHNlcnZpY2VUeXBlOiBTZXJ2aWNlVHlwZS5Ib3RlbCxcclxuICAgICAgICBzZWFyY2hBcmdzOiBmYXZvdXJpdGVTZWFyY2hRdWVyeVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlLnNhdmVGYXZvdXJpdGVTZWFyY2goc2VhcmNoSW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGFzeW5jIGFwcGx5RmF2b3VyaXRlKGZhdjogYW55KTogUHJvbWlzZTx2b2lkPntcclxuICAgIHRoaXMubm9fb2Zfb2NjdXBhbnRzID0gZmF2LmFkdWx0c1xyXG4gICAgdGhpcy5ub19vZl9yb29tcyA9IGZhdi5yb29tc1xyXG4gICAgdGhpcy5kaXN0YW5jZSA9IGZhdi5kaXN0YW5jZVxyXG4gICAgdGhpcy5jdXJyZW5jeSA9IGZhdi5jdXJyZW5jeVxyXG4gICAgbGV0IGxvY2F0aW9uOiB7bGF0aXR1ZGU6IG51bWJlciwgbG9uZ2l0dWRlOiBudW1iZXIsIGNvdW50cnlDb2RlOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmd9ID0gXHJcbiAgICAgIHsgbGF0aXR1ZGU6IGZhdi5sYXRpdHVkZSwgbG9uZ2l0dWRlOiBmYXYubG9uZ2l0dWRlLCBjb3VudHJ5Q29kZTogZmF2LmNvdW50cnlDb2RlLCBuYW1lOiBmYXYuY2l0eU5hbWUgfVxyXG4gICAgaWYgKGZhdi50cmFpblN0YXRpb25Db2RlKSBsb2NhdGlvbi50eXBlID0gTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb25cclxuICAgIGVsc2UgaWYgKGZhdi5vZmZpY2VJZCkgbG9jYXRpb24udHlwZSA9IExvY2F0aW9uVHlwZXMuT2ZmaWNlXHJcbiAgICBlbHNlIGlmIChmYXYuaWF0YSkgbG9jYXRpb24udHlwZSA9IExvY2F0aW9uVHlwZXMuQWlycG9ydFxyXG4gICAgZWxzZSBpZiAoZmF2LnBvc3RPclppcENvZGUpIGxvY2F0aW9uLnR5cGUgPSBMb2NhdGlvblR5cGVzLlBvc3Rjb2RlXHJcbiAgICBlbHNlIGxvY2F0aW9uLnR5cGUgPSBMb2NhdGlvblR5cGVzLkNpdHlcclxuICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvblxyXG4gICAgdGhpcy5ob3RlbF9uYW1lID0gZmF2LmhvdGVsTmFtZVxyXG4gICAgaWYgKGZhdi5ncm91cE5hbWUpIHRoaXMuaG90ZWxfY2hhaW4gPSB7IG5hbWU6IGZhdi5ncm91cE5hbWUgfTsgZWxzZSB0aGlzLmhvdGVsX2NoYWluID0gbnVsbFxyXG4gIH1cclxufVxyXG4iXX0=
1432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsZUFBZSxFQUFRLEVBQUUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUlMLGFBQWEsRUFJYixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFPYiwrQkFBK0IsRUFDL0IsNEJBQTRCLEVBQzdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUtMLGFBQWEsRUFVYixXQUFXLEVBQ1osTUFBTSx3QkFBd0IsQ0FBQztBQWlCaEMsT0FBTyxFQUlMLFlBQVksRUFFWixTQUFTLEVBRVYsTUFBTSx3Q0FBd0MsQ0FBQztBQWlCaEQsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxNQUFNLENBQU4sSUFBWSxjQUlYO0FBSkQsV0FBWSxjQUFjO0lBQ3hCLHVDQUFxQixDQUFBO0lBQ3JCLCtCQUFhLENBQUE7SUFDYixpQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxjQUFjLEtBQWQsY0FBYyxRQUl6QjtBQUVELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0scUJBQXFCLEdB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QzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUM3QixJQUFJLFFBQVEsR0FNUjtnQkFDRixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7Z0JBQ3RCLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztnQkFDeEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO2dCQUM1QixJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVE7YUFDbkIsQ0FBQztZQUNGLElBQUksR0FBRyxDQUFDLGdCQUFnQjtnQkFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUM7aUJBQ2hFLElBQUksR0FBRyxDQUFDLFFBQVE7Z0JBQUUsUUFBUSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO2lCQUN2RCxJQUFJLEdBQUcsQ0FBQyxJQUFJO2dCQUFFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztpQkFDcEQsSUFBSSxHQUFHLENBQUMsYUFBYTtnQkFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7O2dCQUM5RCxRQUFRLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQ2hDLElBQUksR0FBRyxDQUFDLFNBQVM7Z0JBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7O2dCQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO0tBQUE7O0FBanVEZSw0Q0FBc0IsR0FBRyxjQUFjLENBQUM7QUFDeEMsNkNBQXVCLEdBQUcsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBCYXNlRW50ZXJwcmlzZVNlYXJjaCB9IGZyb20gJy4vYmFzZS1lbnRlcnByaXNlJztcclxuaW1wb3J0IHsgQmFzZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZUhlbHBlclJvdXRpbmVzIH0gZnJvbSAnLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tLCBvZiwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJhc2VFbnZpcm9ubWVudCB9IGZyb20gJy4vZW52aXJvbWVudCc7XHJcbmltcG9ydCB7IEJhc2VIb3RlbEF2YWxpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2hvdGVsLWF2YWxsaWJpbGl0eS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVVJMUyB9IGZyb20gJy4vLi4vc2VydmljZXMvdXJsLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIENvdW50cnksXHJcbiAgSG90ZWxRdW90ZVJlc3VsdCxcclxuICBIb3RlbFF1b3RlUmVzdWx0QXJyYXksXHJcbiAgTG9jYXRpb25UeXBlcyxcclxuICBOZ2JEYXRlU3RydWN0LFxyXG4gIExvY2F0aW9uRGV0YWlscyxcclxuICBIb3RlbEF2YWxpYmlsaXR5UXVvdGVSZXN1bHQsXHJcbiAgaW5jbHVkZWRFeHByZXNzaW9uLFxyXG4gIGV4Y2x1ZGVkRXhwcmVzc2lvbixcclxuICBTZWFyY2hIYW5kbGVyLFxyXG4gIFJlY2VudFNlYXJjaCxcclxuICBBaXJwb3J0U2VhcmNoUmVzdWx0cyxcclxuICBIb3RlbERldGFpbHMsXHJcbiAgSG90ZWxEZXRhaWxzQXJyYXksXHJcbiAgU2F2ZUZhdm91cml0ZVNlYXJjaFJlc3VsdCxcclxuICBPQlRBaXJwb3J0RGV0YWlscyxcclxuICBpbmNsdWRlZEFjY2Vzc2liaWxpdHlFeHByZXNzaW9uLFxyXG4gIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnNcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQmFza2V0SXRlbSxcclxuICBDb25mZXJtYU9mZmljZU5hbWVzLFxyXG4gIENvbmZlcm1hT2ZmaWNlSW5mbyxcclxuICBDdXJyZW5jeUNvZGUsXHJcbiAgRGlzdGFuY2VUeXBlcyxcclxuICBIb3RlbExvY2F0aW9uLFxyXG4gIEhvdGVsUm9vbSxcclxuICBIb3RlbFRhZyxcclxuICBSYWlsU3RhdGlvbixcclxuICBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VhcmNoUmFpbFF1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlcnZpY2VUeXBlXHJcbn0gZnJvbSAnLi4vdHlwZXMvZ3JhcGhxbC50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUhvdGVsUXVvdGVGZXRjaGVyLFxyXG4gIEhvdGVsUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2hvdGVsLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEZ1bGxVc2VyRGV0YWlscyxcclxuICBVc2VyU2VydmljZUludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSXVzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdEh0dHBDYWxsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2h0dHAtY2FsbC5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCB7IEhvdGVsQXZhbGluaWxpdHlGZXRjaGVyVHlwZSB9IGZyb20gJy4uL2ZldGNoZXJzL2hvdGVsLWF2YWxpYWJpbGl0eS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICBJbnRlcm5hbEJhc2tldEludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWVudGVycHJpc2UtYmFza2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEF2YWlsYWJpbGl0eU9iamVjdCxcclxuICBEaXNwbGF5RmlsdGVyU2V0dGluZ3MsXHJcbiAgSG90ZWxFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlLFxyXG4gIEhvdGVsRmlsdGVycyxcclxuICBIb3RlbFRlbXBQYXJhbXMsXHJcbiAgSG90ZWxWaWV3LFxyXG4gIFJlc3VsdERldGFpbHNcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lob3RlbC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IElDaGVhcGVzdFByaWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVhcGVzdC1wcmljZSc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyLFxyXG4gIENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9jb25mZXJtYS1xdWlja2xpc3QuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldFJhaWxTdGF0aW9uRmV0Y2hlcixcclxuICBHZXRSYWlsU3RhdGlvbkZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LXJhaWwtc3RhdGlvbi5mZXRjaGVyJztcclxuaW1wb3J0IHsgSG90ZWxSZWNlbnRTZWFyY2hBcmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ob3RlbC1yZWNlbnQtc2VhcmNoLWFyZ3MuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgcmVzdWx0IH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHtcclxuICBBcHBseUhvdGVsUnVsZXNGZXRjaGVyVHlwZSxcclxuICBCYXNlSG90ZWxSdWxlc0ZldGNoZXJcclxufSBmcm9tICcuLi9mZXRjaGVycy9hcHBseS1KSVQtaG90ZWwtcnVsZXMuZmV0Y2hlcic7XHJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IFVzZXJGYXZvcnVyaXRlIH0gZnJvbSAnLi91c2VyLWZhdm91cml0ZS5lbnVtJztcclxuXHJcbmV4cG9ydCBlbnVtIFNvcnRUeXBlc0hvdGVsIHtcclxuICBkaXN0YW5jZSA9ICdkaXN0YW5jZScsXHJcbiAgbmFtZSA9ICduYW1lJyxcclxuICBwcmljZSA9ICdwcmljZSdcclxufVxyXG5cclxuY29uc3QgQ0xJRU5UX1BSRUZFUlJFRF9WQUxVRSA9IDI7XHJcbmNvbnN0IEFHRU5UX1BSRUZFUlJFRF9WQUxVRSA9IDE7XHJcblxyXG5leHBvcnQgY2xhc3MgSG90ZWxFbnRlcnByaXNlU2VhcmNoPFxyXG4gIEhRX1EgZXh0ZW5kcyBIb3RlbFF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgSEFfUSBleHRlbmRzIEhvdGVsQXZhbGluaWxpdHlGZXRjaGVyVHlwZSxcclxuICBRTF9RIGV4dGVuZHMgQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyVHlwZSxcclxuICBHUlNfUSBleHRlbmRzIEdldFJhaWxTdGF0aW9uRmV0Y2hlclR5cGUsXHJcbiAgSFJfUSBleHRlbmRzIEFwcGx5SG90ZWxSdWxlc0ZldGNoZXJUeXBlXHJcbiAgPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgSG90ZWxUZW1wUGFyYW1zLFxyXG4gIEhvdGVsUXVvdGVSZXN1bHRBcnJheSxcclxuICBIb3RlbERldGFpbHNBcnJheVxyXG4gID5cclxuICBpbXBsZW1lbnRzIEhvdGVsRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZSB7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9QQVJBTVMgPSAnc2VhcmNoX2hvdGVsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAncmVzdWx0c19ob3RlbCc7XHJcblxyXG4gIHB1YmxpYyB0eXBlOiBTZXJ2aWNlVHlwZSA9IFNlcnZpY2VUeXBlLkhvdGVsO1xyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcbiAgcHVibGljIGxvY2F0aW9uX3R5cGVzOiBCZWhhdmlvclN1YmplY3Q8TG9jYXRpb25UeXBlc1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XHJcbiAgICBMb2NhdGlvblR5cGVzW11cclxuICA+KFtdKTtcclxuICBwdWJsaWMgb2ZmaWNlczogQmVoYXZpb3JTdWJqZWN0PExvY2F0aW9uVHlwZXNbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgTG9jYXRpb25UeXBlc1tdXHJcbiAgPihbXSk7XHJcbiAgcHVibGljIGxhc3RBY3RpdmVQYWdlOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XHJcbiAgcHVibGljIGppdFJ1bGVzUmVjZWl2ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwdWJsaWMgcmVhcHBseVNvcnRpbmcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgcmVhZG9ubHkgZ2FsbGVyaWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcclxuICBwcml2YXRlIG9jY3VwaWVkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgcmVzdWx0c19kZXRhaWxzOiBSZXN1bHREZXRhaWxzID0ge1xyXG4gICAgY2hhaW5zOiBuZXcgU2V0PHN0cmluZz4oKSxcclxuICAgIGFtZW5pdGllczogW10sXHJcbiAgICBtYXhEaXN0YW5jZTogMFxyXG4gIH07XHJcbiAgcHJpdmF0ZSBfY2hlY2tpbl9kYXRlX25nYjogTmdiRGF0ZVN0cnVjdDtcclxuICBwcml2YXRlIF9jaGVja291dF9kYXRlX25nYjogTmdiRGF0ZVN0cnVjdDtcclxuICBwcml2YXRlIF9ib29rZWRUcmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXSA9IFtdO1xyXG5cclxuICBnZXQgY2hhaW5zKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zXTtcclxuICB9XHJcblxyXG4gIGdldCBhbWVuaXRpZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnJlc3VsdHNfZGV0YWlscy5hbWVuaXRpZXNdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1heERpc3RhbmNlKCk6IG51bWJlciB7XHJcbiAgICB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZS5tYXggPSBNYXRoLmNlaWwoXHJcbiAgICAgIE1hdGgubWF4LmFwcGx5KFxyXG4gICAgICAgIE1hdGgsXHJcbiAgICAgICAgdGhpcy5yZXN1bHRzLnZhbHVlLm1hcCgobykgPT4gby5sb2NhdGlvbi5kaXN0YW5jZSlcclxuICAgICAgKVxyXG4gICAgKTtcclxuICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlID0gdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4O1xyXG4gICAgcmV0dXJuIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1heFByaWNlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuZmlsdGVycy5wcmljZVJhbmdlLm1heCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVuY3koKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3k7XHJcbiAgfVxyXG5cclxuICBzZXQgY3VycmVuY3kodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5ID0gdmFsdWU7XHJcbiAgfVxyXG4gIC8vIEV2ZW50IEVtaXR0ZXJzXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZTogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuICBwdWJsaWMgc2VsZWN0SXRlbU1hcFZpZXc6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHB1YmxpYyBkaXNwbGF5OiBEaXNwbGF5RmlsdGVyU2V0dGluZ3MgPSB7XHJcbiAgICBtaW5wcmljZTogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFxyXG4gICAgbWF4cHJpY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcclxuICAgIGZpbHRlcnM6IHtcclxuICAgICAgYnJlYWtmYXN0VHlwZTogW11cclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyBwdWJsaWMgdmFyaWFibGVzXHJcbiAgcHVibGljIG1pbl9kYXRlID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLCAvLyBuZ2JEYXRlIG1vbnRocyBhcmUgbm90IDAgaW5kZXhlZFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKClcclxuICB9O1xyXG5cclxuICBwdWJsaWMgbWluX3JldHVybl9kYXRlID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLCAvLyBuZ2JEYXRlIG1vbnRocyBhcmUgbm90IDAgaW5kZXhlZFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKCkgKyAxIC8vIG1pbiAxIG5pZ2h0IHN0YXlcclxuICB9O1xyXG5cclxuICAvLyBwcml2YXRlIHZhcmlhYmxlc1xyXG4gIC8vIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGltZXMgaGVyZSAtIG1heWJlIG5vcm1hbGlzZSB0aGVzZSBpbiB0aGUgcmVxdWVzdCBib2R5P1xyXG5cclxuICBwcml2YXRlIGxvY2FsRmlsdGVycyA9IG5ldyBIb3RlbEZpbHRlcnMoKTtcclxuXHJcbiAgcHVibGljIGN1cnJlbnRWaWV3OiBIb3RlbFZpZXcgPSBIb3RlbFZpZXcuTElTVDtcclxuICBwcml2YXRlIHVzZXJDdXJyZW5jeTogc3RyaW5nO1xyXG4gIC8vIEZvciBOZ0ZvcmluZyBvdmVyIGluIHRoZSB0ZW1wbGF0ZXNcclxuICBwcml2YXRlIF9tYXhfbm9fb2Zfcm9vbXMgPSA0O1xyXG4gIHByaXZhdGUgX21heF9yb29tc19hcnJheSA9IG5ldyBBcnJheSh0aGlzLl9tYXhfbm9fb2Zfcm9vbXMpLmZpbGwoMCk7XHJcbiAgcHJpdmF0ZSBfbWF4X25vX29mX29jY3VwYW50cyA9IDg7XHJcbiAgcHJpdmF0ZSBfbWF4X29jY3VwYW50X2FycmF5ID0gbmV3IEFycmF5KHRoaXMuX21heF9ub19vZl9vY2N1cGFudHMpLmZpbGwoMCk7XHJcbiAgcHJpdmF0ZSBfZGlzdGFuY2VfbGlzdCA9IFsxLCAyLCA1LCAxMCwgMjAsIDI1XTsgLy8gY29waWVkIGZyb20gb2xkIGZyb250ZW5kIGZvciBub3dcclxuICBwcml2YXRlIF9kZWZhdWx0X2N1cnJlbmN5OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gIGdldCBjaGVja2luX2RhdGVfbmdiKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWNraW5fZGF0ZV9uZ2I7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hlY2tpbl9kYXRlX25nYih2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5fY2hlY2tpbl9kYXRlX25nYiA9IHZhbHVlO1xyXG5cclxuICAgIHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy5jaGVja2luX2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNrb3V0X2RhdGVfbmdiKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWNrb3V0X2RhdGVfbmdiO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNrb3V0X2RhdGVfbmdiKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9jaGVja291dF9kYXRlX25nYiA9IHZhbHVlO1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNraW5fZGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNraW5fZGF0ZShuZXdEYXRlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICBpZiAobmV3RGF0ZSAmJiBuZXdEYXRlLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlID0gbW9tZW50KG5ld0RhdGUpO1xyXG4gICAgICB0aGlzLl9jaGVja2luX2RhdGVfbmdiID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGUpO1xyXG4gICAgICBpZiAobmV3RGF0ZS5pc1NhbWVPckJlZm9yZSh0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZSkpIHtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgPSBtb21lbnQobmV3RGF0ZSkuYWRkKDEsICdkYXknKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY2hlY2tvdXRfZGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBjaGVja291dF9kYXRlKG5ld0RhdGU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIC8vIGlmIChuZXdEYXRlLmlzU2FtZU9yQmVmb3JlKHRoaXMuY2hlY2tpbl9kYXRlKSkgeyAgLy8gbm90IGFsbG93ZWRcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKG5ld0RhdGUgJiYgbmV3RGF0ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUgPSBuZXdEYXRlO1xyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGVfbmdiID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGUpO1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbm9fb2Zfcm9vbXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXM7XHJcbiAgfVxyXG5cclxuICBzZXQgbm9fb2Zfcm9vbXMobmV3Um9vbXM6IG51bWJlcikge1xyXG4gICAgaWYgKG5ld1Jvb21zID4gNCB8fCBuZXdSb29tcyA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyA9IG5ld1Jvb21zO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vX29mX29jY3VwYW50cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHM7XHJcbiAgfVxyXG5cclxuICBzZXQgbm9fb2Zfb2NjdXBhbnRzKG5ld09jYzogbnVtYmVyKSB7XHJcbiAgICBpZiAobmV3T2NjIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50cyA9IG5ld09jYztcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBkZWZhdWx0X2N1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGRlZmF1bHRfY3VycmVuY3koY3VycmVuY3k6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5ID0gY3VycmVuY3k7XHJcbiAgfVxyXG5cclxuICAvLyBtYXkgaGF2ZSB0byBtb2RpZnkgdGhlc2VcclxuICBnZXQgbG9jYXRpb24oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb247XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb24obmV3TG9jOiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbiA9IG5ld0xvYztcclxuXHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9ybWF0dGVkX2xvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uXHJcbiAgICAgID8gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uLmRlc3RpbmF0aW9uXHJcbiAgICAgIDogJ05vIExvY2F0aW9uIFNldCc7IC8vIFRPRE8gLSAgZXhwYW5kIHRoaXMgZm9yIGRpZmZlcmVudCB0eXBlc1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3RhbmNlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmRpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRpc3RhbmNlKG5ld0Rpc3Q6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmRpc3RhbmNlID0gbmV3RGlzdDtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBwcmVmZXJlZF9ob3RlbHNfb25seSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJlZmVyZWRfaG90ZWxzX29ubHk7XHJcbiAgfVxyXG5cclxuICBzZXQgcHJlZmVyZWRfaG90ZWxzX29ubHkobmV3UHJlZjogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnByZWZlcmVkX2hvdGVsc19vbmx5ID0gbmV3UHJlZjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBjb3VudHJ5KCk6IENvdW50cnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jb3VudHJ5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGNvdW50cnkobmV3Q29udDogQ291bnRyeSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNvdW50cnkgPSBuZXdDb250O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc3Rjb2RlKCk6IExvY2F0aW9uRGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnBvc3Rjb2RlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBvc3Rjb2RlKHBvc3Rjb2RlOiBMb2NhdGlvbkRldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wb3N0Y29kZSA9IHBvc3Rjb2RlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRyYWluc1N0YXRpb24oKTogTG9jYXRpb25EZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCB0cmFpbnNTdGF0aW9uKHN0YXRpb246IExvY2F0aW9uRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnRyYWluc1N0YXRpb24gPSBzdGF0aW9uO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9mZmljZSgpOiBDb25mZXJtYU9mZmljZU5hbWVzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMub2ZmaWNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IG9mZmljZShvZmZpY2U6IENvbmZlcm1hT2ZmaWNlTmFtZXMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vZmZpY2UgPSBvZmZpY2U7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICAvLyBBZGRpdGlvbmFsIFZhcmlhYmxlc1xyXG4gIGdldCBob3RlbF9uYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmhvdGVsX25hbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgaG90ZWxfbmFtZShuZXdOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9uYW1lID0gbmV3TmFtZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBob3RlbF9jaGFpbigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9jaGFpbjtcclxuICB9XHJcblxyXG4gIHNldCBob3RlbF9jaGFpbihuZXdDaGFpbjogYW55KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaG90ZWxfY2hhaW4gPSBuZXdDaGFpbjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlcnMgT25seVxyXG5cclxuICBnZXQgbWF4X3Jvb21zX2FycmF5KCk6IG51bWJlcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhfcm9vbXNfYXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4X29jY3VwYW50X2FycmF5KCk6IG51bWJlcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhfb2NjdXBhbnRfYXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4X25vX29mX3Jvb21zKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4X25vX29mX3Jvb21zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3RhbmNlX2xpc3QoKTogbnVtYmVyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3RhbmNlX2xpc3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgbG9jYXRpb25fdHlwZV9zZWxlY3QoKTogTG9jYXRpb25UeXBlcyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0O1xyXG4gIH1cclxuXHJcbiAgc2V0IGxvY2F0aW9uX3R5cGVfc2VsZWN0KHZhbHVlOiBMb2NhdGlvblR5cGVzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJzKCk6IEhvdGVsRmlsdGVycyB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaG90ZWxGZXRjaGVyOiBCYXNlSG90ZWxRdW90ZUZldGNoZXI8SFFfUT4sXHJcbiAgICBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgZW52aXJvbm1lbnQ6IEJhc2VFbnZpcm9ubWVudCxcclxuICAgIHByaXZhdGUgYXZhbGlhYmlsaXR5U2VydmljZTogQmFzZUhvdGVsQXZhbGliaWxpdHlTZXJ2aWNlPEhBX1E+LFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRTZXJ2aWNlOiBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICAgIHN0b3JhZ2VTZXJ2aWNlOiBCYXNlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBzZWFyY2hTZXJ2aWNlOiBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgaHR0cENhbGxTZXJ2aWNlOiBBYnN0cmFjdEh0dHBDYWxsU2VydmljZSxcclxuICAgIHByaXZhdGUgcXVpY2tMaXN0RmV0Y2hlcjogQmFzZVNlYXJjaENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlcjxRTF9RPixcclxuICAgIHByaXZhdGUgZ2V0UmFpbFN0YXRpb25GZXRjaGVyOiBCYXNlR2V0UmFpbFN0YXRpb25GZXRjaGVyPEdSU19RPixcclxuICAgIHByaXZhdGUgYXBwbHlIb3RlbFJ1bGVzRmV0Y2hlcjogQmFzZUhvdGVsUnVsZXNGZXRjaGVyPEhSX1E+XHJcbiAgKSB7XHJcbiAgICBzdXBlcihzdG9yYWdlU2VydmljZSwgaGVscGVycywgc2VhcmNoU2VydmljZSwgdXNlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IEhvdGVsVGVtcFBhcmFtcztcclxuICAgIH0gPSBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShcclxuICAgICAgSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVNcclxuICAgICkgfHwge1xyXG4gICAgICAgIHRlbXBQYXJhbXM6IHt9IGFzIEhvdGVsVGVtcFBhcmFtc1xyXG4gICAgICB9O1xyXG5cclxuICAgIHRoaXMuZGVmYXVsdF9jdXJyZW5jeSA9IHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeVxyXG4gICAgICA/IHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeVxyXG4gICAgICA6IHRoaXMuX2RlZmF1bHRfY3VycmVuY3k7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXMoc2VhcmNoU2VydmljZS5tYWtlSG90ZWxRdWVyeShkYXRhLnRlbXBQYXJhbXMpKTtcclxuICAgIHVzZXJTZXJ2aWNlLmZ1bGxVc2VyRGV0YWlscy51c2VyQ29uZmlncy5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIC8vIHRoaXMudXNlckNvbmZpZy5uZXh0KGRhdGEpO1xyXG4gICAgICBjb25zb2xlLmxvZyhkYXRhKTtcclxuICAgICAgaWYgKGRhdGEgJiYgZGF0YT8uaG90ZWxfZGVmYXVsdHMpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXMoc2VhcmNoU2VydmljZS5tYWtlSG90ZWxRdWVyeShkYXRhPy5ob3RlbF9kZWZhdWx0cz8uY29uZmlnKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KVxyXG4gICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkQWRkVHJhdmVsbGVyU3Vic2NyaXB0aW9uKCkpIHtcclxuICAgICAgc2VhcmNoU2VydmljZS50cmF2ZWxsZXJJbmZvcm1hdGlvbi5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgICAgICAgY29uc3Qgc3BsaXRUcmF2ZWxsZXJzID0gdGhpcy5oZWxwZXJzLnNlbGVjdGVkVHJhdmVsbGVycyhcclxuICAgICAgICAgICAgdHJhdmVsbGVycyxcclxuICAgICAgICAgICAgU2VydmljZVR5cGUuSG90ZWxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzID0gc3BsaXRUcmF2ZWxsZXJzLmFkdWx0cy5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXN1bHRzID1cclxuICAgICAgc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW1Bc0xpc3Q8SG90ZWxEZXRhaWxzQXJyYXk+KFxyXG4gICAgICAgIHRoaXMucmVzdWx0c1Nlc3Npb25OYW1lXHJcbiAgICAgICkgfHwgW107XHJcbiAgICByZXN1bHRzXHJcbiAgICAgIC5zbGljZSgwLCB0aGlzLmVudmlyb25tZW50Lm51bWJlckhvdGVsVG9QcmVsb2FkKVxyXG4gICAgICAuZm9yRWFjaCgoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFNlcnZpY2UuY2FuQm9vayhTZXJ2aWNlVHlwZS5Ib3RlbCkpIHtcclxuICAgICAgICAgIC8vIG5lZWQgdGhpcyBjaGVjayBiZWNhdXNlIG9uIHJlZnJlc2ggd2UgYXJlIGdldHRpbmcgZXJyb3JzIC0gdGhlb3J5IHRoYXQgdXNlciBoYXNuJ3QgZnVsbHkgbG9hZGVkIGluIHlldFxyXG4gICAgICAgICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eUZvcklkKFxyXG4gICAgICAgICAgICB0aGlzLm1ha2VIb3RlbEF2YWxpbGl0eU9iamVjdChob3RlbCksXHJcbiAgICAgICAgICAgIGhvdGVsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChob3RlbFJlc3VsdDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucy5hZGQoaG90ZWxSZXN1bHQuZ3JvdXApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZ1bGxSZXN1bHRzID0gcmVzdWx0cztcclxuICAgIHRoaXMuaml0UnVsZXNSZWNlaXZlZC5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG5cclxuICAgIHRoaXMudXNlclNlcnZpY2UuY2hhbmdlVXNlci5zdWJzY3JpYmUoKHVzZXI6IFBhcnRpYWw8RnVsbFVzZXJEZXRhaWxzPikgPT4ge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVzLm5leHQoW1xyXG4gICAgICAgIExvY2F0aW9uVHlwZXMuQWlycG9ydCxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLkNpdHksXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5PZmZpY2UsXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3QsXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb25cclxuICAgICAgXSk7XHJcbiAgICAgIGlmIChzZWFyY2hTZXJ2aWNlLnNob3VsZEZldGNoQWxsT2ZmaWNlcygpKSB7XHJcbiAgICAgICAgdGhpcy5vZmZpY2VzLm5leHQoW10pOyAvLyBUT0RPIGZldGNoIG9mZmljZXNcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcblxyXG4gICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmZldGNoaW5nLnN1YnNjcmliZSgoaXNGZXRjaGluZzogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpZiAoIWlzRmV0Y2hpbmcpIHtcclxuICAgICAgICAvLyBXZSd2ZSBqdXN0IGZpbmlzaGVkIGZldGNoaW5nIGF2YWxpYmlsaXR5IHNvIHVwZGF0ZSBmaWx0ZXJzLlxyXG5cclxuICAgICAgICBjb25zdCBtYXhOdW1iZXIgPSB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UubWF4UHJpY2VGb3JDdXJyZW5jeSgnR0JQJyk7XHJcbiAgICAgICAgaWYgKG1heE51bWJlciA+IDApIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlLm1heCA9IG1heE51bWJlcjtcclxuICAgICAgICAgIHRoaXMubG9jYWxGaWx0ZXJzLnByaWNlUmFuZ2UubWF4ID0gbWF4TnVtYmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGVhcGVzdFJlc3VsdFByaWNlID0gdGhpcy51cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzKTtcclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hTZXJ2aWNlLmNhbkJvb2soU2VydmljZVR5cGUuSG90ZWwpKSB7XHJcbiAgICAgICAgICAvLyBuZWVkIHRoaXMgY2hlY2sgYmVjYXVzZSBvbiByZWZyZXNoIHdlIGFyZSBnZXR0aW5nIGVycm9ycyAtIHRoZW9yeSB0aGF0IHVzZXIgaGFzbid0IGZ1bGx5IGxvYWRlZCBpbiB5ZXRcclxuICAgICAgICAgIHRoaXMuX2FwcGx5VHJhdmVsUnVsZXMoKTtcclxuICAgICAgICAgIHRoaXMucmVhcHBseVNvcnRpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHByb2Nlc3NSZXN1bHRzKHJlc3VsdHNUb01hcDogSG90ZWxRdW90ZVJlc3VsdEFycmF5KSB7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSA9IDA7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5jaGFpbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIHJldHVybiByZXN1bHRzVG9NYXAubWFwKFxyXG4gICAgICAoaG90ZWxSZXN1bHQ6IEhvdGVsUXVvdGVSZXN1bHQsIGluZGV4OiBudW1iZXIpOiBIb3RlbERldGFpbHMgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSxcclxuICAgICAgICAgIGhvdGVsUmVzdWx0LmxvY2F0aW9uLmRpc3RhbmNlXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZS5tYXggPSB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZTtcclxuICAgICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5jaGFpbnMuYWRkKGhvdGVsUmVzdWx0Lmdyb3VwKTtcclxuICAgICAgICBpZiAoaW5kZXggPCB0aGlzLmVudmlyb25tZW50Lm51bWJlckhvdGVsVG9QcmVsb2FkKSB7XHJcbiAgICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5Rm9ySWQoXHJcbiAgICAgICAgICAgIHRoaXMubWFrZUhvdGVsQXZhbGlsaXR5T2JqZWN0KGhvdGVsUmVzdWx0KSxcclxuICAgICAgICAgICAgaG90ZWxSZXN1bHRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuZ2V0SG90ZWxBdmFpbGFiaWxpdHkoaG90ZWxSZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzb3J0ZWRUYWdzOiB0aGlzLnNvcnRUYWdzKGhvdGVsUmVzdWx0LnRhZ3MpLFxyXG4gICAgICAgICAgRGV0YWlsczoge1xyXG4gICAgICAgICAgICBkaXN0YW5jZV9haXJwb3J0OiAwLFxyXG4gICAgICAgICAgICBkaXN0YW5jZV9tZXRybzogMCxcclxuICAgICAgICAgICAgZGlzdGFuY2VfcmFpbDogMCxcclxuICAgICAgICAgICAgYWlycG9ydF9kZXRhaWxzOiB7IG5hbWU6ICdOb3QgcmV0dXJuZWQnIH0sXHJcbiAgICAgICAgICAgIG1ldHJvX2RldGFpbHM6IHsgbmFtZTogJ05vdCByZXR1cm5lZCcgfSxcclxuICAgICAgICAgICAgcmFpbF9kZXRhaWxzOiB7IG5hbWU6ICdOb3QgcmV0dXJuZWQnIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAvLyBhdmlsYWJpbGl0eTogdGhpcy5ob3RlbF9hdmFpbGFiaWxpdHksXHJcbiAgICAgICAgICAuLi5ob3RlbFJlc3VsdFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPSBIb3RlbEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcbiAgcHJvdGVjdGVkIG11bHRpUmVzdWx0c1Nlc3Npb25OYW1lID1cclxuICAgIEhvdGVsRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUkVTVUxUUztcclxuXHJcbiAgcHJpdmF0ZSBxdWVyeTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMgPSB7fSBhcyBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcztcclxuXHJcbiAgcHJpdmF0ZSBfYXBwbHlUcmF2ZWxSdWxlcygpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmhlbHBlcnNcclxuICAgICAgLmNsb25lKHRoaXMuZnVsbFJlc3VsdHMgfHwgW10pXHJcbiAgICAgIC5tYXAoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLnVwZGF0ZUhvdGVsKGhvdGVsKTtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcigoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhob3RlbC5hdmFpbGFibGVSYXRlcyB8fCB7fSkubGVuZ3RoID4gMDtcclxuICAgICAgfSk7XHJcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hcHBseUhvdGVsUnVsZXNGZXRjaGVyXHJcbiAgICAgIC5mZXRjaEtleWVkT2JqZWN0KCdpZCcsIHtcclxuICAgICAgICBkYXRhXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGExOiBSZWNvcmQ8c3RyaW5nLCBIb3RlbERldGFpbHM+KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyUmVzdWx0cyA9IHRoaXMucmVzdWx0c0ZpbHRlck1ldGhvZCA/IHRoaXMucmVzdWx0c0ZpbHRlck1ldGhvZCh0aGlzLmZ1bGxSZXN1bHRzKSA6IFtdO1xyXG4gICAgICAgIGNvbnN0IHRyYXZsZVJlc3VsdHMgPSBmaWx0ZXJSZXN1bHRzLm1hcCgoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGExW2hvdGVsLmlkXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLnNldEhvdGVsQXZhbGFiaWxpdHkoXHJcbiAgICAgICAgICAgICAgZGF0YTFbaG90ZWwuaWRdXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gaG90ZWw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdHJhdmxlUmVzdWx0cy5mb3JFYWNoKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaG90ZWwuYXZhaWxhYmxlUmF0ZXMpIHtcclxuICAgICAgICAgICAgaG90ZWwuaml0UmVtb3ZlUmVzdWx0UnVsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaG90ZWwuaml0UmVtb3ZlUmVzdWx0UnVsZSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5qaXRSdWxlc1JlY2VpdmVkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRzLm5leHQodHJhdmxlUmVzdWx0cyk7XHJcbiAgICAgICAgdGhpcy5yZWFwcGx5U29ydGluZy5uZXh0KHRydWUpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgbWFrZUxvY2F0aW9ucyhsb2NhdGlvbjogSG90ZWxMb2NhdGlvbltdKTogeyBba2V5OiBzdHJpbmddOiBIb3RlbExvY2F0aW9uW10gfSB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLmFycmF5VG9PYmplY3RBcnJheTxcclxuICAgICAgSG90ZWxMb2NhdGlvbixcclxuICAgICAgUmVjb3JkPHN0cmluZywgSG90ZWxMb2NhdGlvbltdPlxyXG4gICAgPihsb2NhdGlvbiwgWydkaXN0YW5jZVR5cGUnXSk7XHJcbiAgfVxyXG5cclxuICBzb3J0VGFncyh0YWdzOiBIb3RlbFRhZ1tdKTogYW55W10ge1xyXG4gICAgaWYgKHRhZ3MpIHtcclxuICAgICAgcmV0dXJuIFsuLi50YWdzXVxyXG4gICAgICAgIC5zb3J0KChhOiBIb3RlbFRhZywgYjogSG90ZWxUYWcpID0+IHtcclxuICAgICAgICAgIGlmIChhLm5hbWUgPCBiLm5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLm5hbWUgPiBiLm5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5tYXAoKHRhZzogSG90ZWxUYWcpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnRhZyxcclxuICAgICAgICAgICAgaWNvbjogdGhpcy5lbnZpcm9ubWVudC50YWdNYXBbdGFnLm5hbWVdIHx8IHRhZy5pY29uXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0UXVlcnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXModGhpcy5zZWFyY2hTZXJ2aWNlLm1ha2VIb3RlbFF1ZXJ5KCkpO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscyA9IHtcclxuICAgICAgY2hhaW5zOiBuZXcgU2V0PHN0cmluZz4oKSxcclxuICAgICAgYW1lbml0aWVzOiBbXSxcclxuICAgICAgbWF4RGlzdGFuY2U6IDBcclxuICAgIH07XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZhbGlkKCkge1xyXG4gICAgaWYgKCF0aGlzLmRvQ2hlY2tzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBIb3RlbEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAge1xyXG4gICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtc1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMubWluX3JldHVybl9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKFxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlXHJcbiAgICApO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlLmlzU2FtZU9yQWZ0ZXIodGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jaGVja291dF9kYXRlID0gbW9tZW50KHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUpLmFkZCgxLCAnZGF5Jyk7IC8vIGVuc3VyZSB0aGF0IGNoZWNrb3V0IGRhdGUgaXMgbWluIDEgZGF5IGFmdGVyIGNoZWNraW4gZGF0ZVxyXG4gICAgfVxyXG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQ2l0eTpcclxuICAgICAgICBpZiAoIXRoaXMuY291bnRyeSkge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIHNlbGVjdCBjb3VudHJ5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5sb2NhdGlvbiAmJiAhdGhpcy5wb3N0Y29kZSkge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAgICAgJ1BsZWFzZSBzZWxlY3QgYSBob3RlbCBsb2NhdGlvbiBvciBlbnRlciBhIHBvc3Rjb2RlLidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTpcclxuICAgICAgICBpZiAodGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uPy50eXBlICE9PSAnT2ZmaWNlJyAmJiAhdGhpcy5vZmZpY2UpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYW4gb2ZmaWNlLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5BaXJwb3J0OlxyXG4gICAgICAgIGlmICh0aGlzLnRlbXBQYXJhbXM/LmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbi5haXJwb3J0Py5nYXRld2F5KSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSBhaXJwb3J0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSBhaXJwb3J0LicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICF0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24/LnJhaWxzdGF0aW9uPy5zdGF0aW9uQ29kZSAmJlxyXG4gICAgICAgICAgIXRoaXMudHJhaW5zU3RhdGlvbj8uc3RhdGlvbkNvZGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSB0cmFpbiBzdGF0aW9uLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q6XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnkpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgY291bnRyeScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGUuaXNTYW1lT3JCZWZvcmUodGhpcy5jaGVja2luX2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnQ2hlY2tvdXQgZGF0ZSBtdXN0IGJlIGFmdGVyIGNoZWNraW4gZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoZWNrb3V0X2RhdGUgJiYgdGhpcy5jaGVja291dF9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja291dCBkYXRlIG11c3Qgbm90IGJlIGluIHRoZSBwYXN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hlY2tpbl9kYXRlICYmIHRoaXMuY2hlY2tpbl9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja2luIGRhdGUgbXVzdCBub3QgYmUgaW4gdGhlIHBhc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZS5pc0FmdGVyKHRoaXMuY2hlY2tvdXRfZGF0ZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdDaGVja291dCBkYXRhIG11c3QgYmUgYWZ0ZXIgdGhlIGNoZWNraW4gZGF0ZSdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjdWxhdGluZyBPY2N1cGFuY3lcclxuICAgIGNvbnN0IG9jY3VwYW5jeSA9IHRoaXMubm9fb2Zfb2NjdXBhbnRzIC8gdGhpcy5ub19vZl9yb29tcztcclxuICAgIGlmICghKG9jY3VwYW5jeSA9PT0gMSB8fCBvY2N1cGFuY3kgPT09IDIpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgJ09jY3VwYW50cyBwZXIgcm9vbSBtdXN0IGJlIDEgb3IgMjsgaWYgeW91IGhhdmUgYW4gb2RkIG51bWJlciBvZiB0cmF2ZWxsZXJzIChncmVhdGVyIHRoYW4gb25lKTsgdGhlIG5vIG9mIHJvb21zIG11c3QgYmUgZXF1YWwnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2codGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gICAgdGhpcy5pc1ZhbGlkLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID09PSAwKTtcclxuICAgIHRoaXMubWVzc2FnZXMubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgfVxyXG5cclxuICBzdGFydFNlYXJjaCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFtdKTtcclxuICAgIHRoaXMuaml0UnVsZXNSZWNlaXZlZC5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5yZXNldCgpO1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbFVzZXJTZWFyY2ggPSBPYmplY3QuZnJlZXplKFxyXG4gICAgICAgIHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLnRlbXBQYXJhbXMpXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIGJ1aWxkIHRoZSBxdWVyeVxyXG4gICAgICB0aGlzLmJ1aWxkUXVlcnkoKTtcclxuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zYXZlUmVjZW50U2VhcmNoKFxyXG4gICAgICAgIHRoaXMuZ2V0UmVjZW50U2VhcmNoUXVlcnkodGhpcy5nZXRTZWFyY2hRdWVyeSgpKVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWFyY2goXHJcbiAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID09PSBMb2NhdGlvblR5cGVzLlNob3J0bGlzdFxyXG4gICAgICAgICAgPyB0aGlzLnF1aWNrTGlzdEZldGNoZXIuZmV0Y2hMaXN0KHsgY291bnRyeUNvZGU6IHRoaXMuY291bnRyeS5jQ29kZSB9KVxyXG4gICAgICAgICAgOiB0aGlzLmhvdGVsRmV0Y2hlci5mZXRjaExpc3QocXVlcnkpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzXHJcbiAgKTogU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHJlY2VudFNlYXJjaFF1ZXJ5ID0gdGhpcy51cGRhdGVTZXJjaFF1ZXJ5KHF1ZXJ5KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuSG90ZWwsXHJcbiAgICAgIHNlYXJjaEFyZ3M6IHJlY2VudFNlYXJjaFF1ZXJ5LFxyXG4gICAgICB0cmF2ZWxEYXRlOiB0aGlzLmNoZWNraW5fZGF0ZS5mb3JtYXQoKSxcclxuICAgICAgdHJhdmVsbGVyczogdGhpcy5oZWxwZXJzLmdldFRyYXZlbGxlcnNJZCh0aGlzLnRyYXZlbGxlcnMpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTZXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzXHJcbiAgKTogSG90ZWxSZWNlbnRTZWFyY2hBcmdzIHtcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5OiBIb3RlbFJlY2VudFNlYXJjaEFyZ3MgPSBxdWVyeTtcclxuICAgIHNlYXJjaFF1ZXJ5LmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdDtcclxuICAgIGlmICh0aGlzLmxvY2F0aW9uPy5uYW1lKSB7XHJcbiAgICAgIHNlYXJjaFF1ZXJ5LmNpdHlOYW1lID0gdGhpcy5sb2NhdGlvbi5uYW1lO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoIChzZWFyY2hRdWVyeS5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuT2ZmaWNlOlxyXG4gICAgICAgIHNlYXJjaFF1ZXJ5Lm9mZmljZU5hbWUgPSB0aGlzLm9mZmljZS5uYW1lO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIHNlYXJjaFF1ZXJ5LnRyYWluc1N0YXRpb25EZXRhaWwgPSB0aGlzLnRyYWluc1N0YXRpb247XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5BaXJwb3J0OlxyXG4gICAgICAgIHNlYXJjaFF1ZXJ5LmFpcnBvcnREZXRhaWwgPSB0aGlzLmxvY2F0aW9uLmFpcnBvcnQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0UmVjZW50U2VhcmNoKHJlY2VudFNlYXJjaDogUmVjZW50U2VhcmNoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9jYXRpb25fdHlwZV9zZWxlY3Q7XHJcbiAgICB0aGlzLmN1cnJlbmN5ID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY3VycmVuY3k7XHJcbiAgICB0aGlzLmRpc3RhbmNlID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZGlzdGFuY2U7XHJcbiAgICB0aGlzLm5vX29mX3Jvb21zID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mucm9vbXM7XHJcbiAgICB0aGlzLmNoZWNraW5fZGF0ZSA9IG1vbWVudChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5zdGFydERhdGUpO1xyXG4gICAgdGhpcy5jaGVja291dF9kYXRlID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmVuZERhdGUpO1xyXG4gICAgdGhpcy5ob3RlbF9uYW1lID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuaG90ZWxOYW1lO1xyXG5cclxuICAgIGlmIChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5ncm91cE5hbWUpIHtcclxuICAgICAgdGhpcy5ob3RlbF9jaGFpbiA9IHtcclxuICAgICAgICBuYW1lOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5ncm91cE5hbWVcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgbG9jYXRpb25fdHlwZV9zZWxlY3RcclxuICAgIHN3aXRjaCAodGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgICAgIC5nZXRBaXJwb3J0QnlDb2RlKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmlhdGEpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChpYXRhOiBBaXJwb3J0U2VhcmNoUmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhaXJwb3J0ID0ge1xyXG4gICAgICAgICAgICAgIGFpcnBvcnQ6IHtcclxuICAgICAgICAgICAgICAgIGdhdGV3YXk6IGlhdGEuaWF0YU1hdGNoLmlhdGFcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMubG9jYXRpb24gPSB7IC4uLmFpcnBvcnQsIC4uLmlhdGEuaWF0YU1hdGNoIH07XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkNpdHk6XHJcbiAgICAgICAgdGhpcy5jb3VudHJ5ID0ge1xyXG4gICAgICAgICAgY0NvZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgY05hbWU6ICcnXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBzaG91bGQgYmUgb25lIHNlYXJjaCBtZXRvZCBmb3IgdGhlIGNpdHkgc2VhcmNoOiBsb2NhdGlvbiBvciBwb3N0Y29kZVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxhdGl0dWRlICYmXHJcbiAgICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sb25naXR1ZGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMubG9jYXRpb24gPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmNpdHlOYW1lLFxyXG4gICAgICAgICAgICBsYXRpdHVkZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubGF0aXR1ZGUsXHJcbiAgICAgICAgICAgIGxvbmdpdHVkZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9uZ2l0dWRlXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucG9zdE9yWmlwQ29kZSkge1xyXG4gICAgICAgICAgdGhpcy5wb3N0Y29kZSA9IHtcclxuICAgICAgICAgICAgbmFtZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucG9zdE9yWmlwQ29kZSxcclxuICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5Qb3N0Y29kZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTpcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgICAgIC5nZXRPZmZpY2UocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub2ZmaWNlSWQpXHJcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgob2ZmaWNlOiBDb25mZXJtYU9mZmljZUluZm8pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vZmZpY2UgPSB7XHJcbiAgICAgICAgICAgICAgaWQ6IG9mZmljZS5pZCxcclxuICAgICAgICAgICAgICBuYW1lOiBvZmZpY2UubmFtZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb246XHJcbiAgICAgICAgdGhpcy5nZXRSYWlsU3RhdGlvbkJ5Q29kZShcclxuICAgICAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRyYWluU3RhdGlvbkNvZGVcclxuICAgICAgICApLnN1YnNjcmliZSgodHJhaW5zU3RhdGlvbjogUmFpbFN0YXRpb24pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhaW5zU3RhdGlvbiA9IHtcclxuICAgICAgICAgICAgLi4udHJhaW5zU3RhdGlvbixcclxuICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb25cclxuICAgICAgICAgIH0gYXMgTG9jYXRpb25EZXRhaWxzO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlNob3J0bGlzdDpcclxuICAgICAgICB0aGlzLmNvdW50cnkgPSB7XHJcbiAgICAgICAgICBjQ29kZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY291bnRyeUNvZGUsXHJcbiAgICAgICAgICBjTmFtZTogJydcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJhaWxTdGF0aW9uQnlDb2RlKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8UmFpbFN0YXRpb24+IHtcclxuICAgIGlmIChjb2RlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFJhaWxTdGF0aW9uRmV0Y2hlclxyXG4gICAgICAgIC5mZXRjaExpc3QoeyBpZDogbnVsbCwgY29kZSB9KVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hRdWVyeShvZ1NlYXJjaCA9IGZhbHNlKTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMge1xyXG4gICAgdGhpcy5idWlsZFF1ZXJ5KG9nU2VhcmNoKTtcclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHM8U2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXM+KHRoaXMucXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgYnVpbGRRdWVyeShvZ1NlYXJjaCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBjb25zdCB0ZW1wUGFyYW1zID0gb2dTZWFyY2ggPyB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaCA6IHRoaXMudGVtcFBhcmFtcztcclxuICAgIGlmICghdGhpcy51c2VyQ3VycmVuY3kpIHRoaXMudXNlckN1cnJlbmN5ID0gdGhpcy51c2VyU2VydmljZS5nZXRVc2VyRmF2b3JpdGVPYmplY3Q8eyBjdXJyZW5jeTogc3RyaW5nIH0+KFVzZXJGYXZvcnVyaXRlLkxvY2FsQ3VycmVuY3kpPy5jdXJyZW5jeTtcclxuICAgIGNvbnN0IHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyA9IHtcclxuICAgICAgc3RhcnREYXRlOiB0ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgZW5kRGF0ZTogdGVtcFBhcmFtcy5jaGVja291dF9kYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxyXG4gICAgICByb29tczogdGVtcFBhcmFtcy5ub19vZl9yb29tcyxcclxuICAgICAgYWR1bHRzOiB0ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50cyxcclxuICAgICAgY3VycmVuY3k6IHRoaXMudXNlckN1cnJlbmN5IHx8IHRlbXBQYXJhbXMuY3VycmVuY3kgfHwgbnVsbCxcclxuICAgICAgZGlzdGFuY2U6IHRlbXBQYXJhbXMuZGlzdGFuY2UsXHJcbiAgICAgIGRpc3RhbmNlVHlwZTogRGlzdGFuY2VUeXBlcy5NLFxyXG4gICAgICBtYXhSZXN1bHRzOiAxMDBcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5nZXRSb29tTnVtYmVyKCk7XHJcbiAgICBzd2l0Y2ggKHRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3QpIHtcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ6XHJcbiAgICAgICAgcXVlcnkuaWF0YSA9IHRlbXBQYXJhbXMubG9jYXRpb24uYWlycG9ydC5nYXRld2F5O1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkNpdHk6XHJcbiAgICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSB0ZW1wUGFyYW1zLmNvdW50cnkuY0NvZGU7XHJcbiAgICAgICAgLy8gc2hvdWxkIGJlIG9uZSBzZWFyY2ggbWV0b2QgZm9yIHRoZSBjaXR5IHNlYXJjaDogbG9jYXRpb24gb3IgcG9zdGNvZGVcclxuICAgICAgICBpZiAodGhpcy5sb2NhdGlvbikge1xyXG4gICAgICAgICAgcXVlcnkubGF0aXR1ZGUgPSB0ZW1wUGFyYW1zLmxvY2F0aW9uLmxhdGl0dWRlO1xyXG4gICAgICAgICAgcXVlcnkubG9uZ2l0dWRlID0gdGVtcFBhcmFtcy5sb2NhdGlvbi5sb25naXR1ZGU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wUGFyYW1zLnBvc3Rjb2RlKSB7XHJcbiAgICAgICAgICBxdWVyeS5wb3N0T3JaaXBDb2RlID0gdGVtcFBhcmFtcy5wb3N0Y29kZS5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb246XHJcbiAgICAgICAgaWYgKHRlbXBQYXJhbXMubG9jYXRpb24/LnJhaWxzdGF0aW9uPy5zdGF0aW9uQ29kZSkge1xyXG4gICAgICAgICAgcXVlcnkudHJhaW5TdGF0aW9uQ29kZSA9IHRlbXBQYXJhbXMubG9jYXRpb24ucmFpbHN0YXRpb24uc3RhdGlvbkNvZGU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wUGFyYW1zLnRyYWluc1N0YXRpb24/LnN0YXRpb25Db2RlKSB7XHJcbiAgICAgICAgICBxdWVyeS50cmFpblN0YXRpb25Db2RlID0gdGVtcFBhcmFtcy50cmFpbnNTdGF0aW9uLnN0YXRpb25Db2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5PZmZpY2U6IC8vIE5lZWRzIHRvIGZpeCBpbiBuZXh0IFBSXHJcbiAgICAgICAgaWYgKHRlbXBQYXJhbXMubG9jYXRpb24/LmlkKSB7XHJcbiAgICAgICAgICBxdWVyeS5vZmZpY2VJZCA9ICt0ZW1wUGFyYW1zLmxvY2F0aW9uLmlkO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGVtcFBhcmFtcy5vZmZpY2U/LmlkKSB7XHJcbiAgICAgICAgICBxdWVyeS5vZmZpY2VJZCA9ICt0ZW1wUGFyYW1zLm9mZmljZS5pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuU2hvcnRsaXN0OlxyXG4gICAgICAgIHF1ZXJ5LmNvdW50cnlDb2RlID0gdGVtcFBhcmFtcy5jb3VudHJ5LmNDb2RlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlBvc3Rjb2RlOlxyXG4gICAgICAgIHF1ZXJ5LmNvdW50cnlDb2RlID0gdGVtcFBhcmFtcy5jb3VudHJ5LmNDb2RlO1xyXG4gICAgICAgIHF1ZXJ5LnBvc3RPclppcENvZGUgPSB0ZW1wUGFyYW1zLmxvY2F0aW9uLm5hbWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIGhvdGVsIG5hbWUgaW4gdGhlIHF1ZXJ5XHJcbiAgICBpZiAodGVtcFBhcmFtcy5ob3RlbF9uYW1lKSB7XHJcbiAgICAgIHF1ZXJ5LmhvdGVsTmFtZSA9IHRlbXBQYXJhbXMuaG90ZWxfbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhZGQgY2hhaW4gb3IgZ3JvdXAgbmFtZSBpbnQgaGUgcXVlcnlcclxuICAgIGlmICh0ZW1wUGFyYW1zLmhvdGVsX2NoYWluKSB7XHJcbiAgICAgIHF1ZXJ5Lmdyb3VwTmFtZSA9IHRlbXBQYXJhbXMuaG90ZWxfY2hhaW4/Lm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xyXG4gIH1cclxuXHJcbiAgbWFrZUhvdGVsQXZhbGlsaXR5T2JqZWN0KGhvdGVsOiBIb3RlbFF1b3RlUmVzdWx0KTogQXZhaWxhYmlsaXR5T2JqZWN0IHtcclxuICAgIGlmICghdGhpcy51c2VyQ3VycmVuY3kpIHRoaXMudXNlckN1cnJlbmN5ID0gdGhpcy51c2VyU2VydmljZS5nZXRVc2VyRmF2b3JpdGVPYmplY3Q8eyBjdXJyZW5jeTogc3RyaW5nIH0+KFVzZXJGYXZvcnVyaXRlLkxvY2FsQ3VycmVuY3kpPy5jdXJyZW5jeTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGhvdGVsOiBob3RlbC5pZCxcclxuICAgICAgc3RhcnREYXRlOiB0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZSh0aGlzLmNoZWNraW5fZGF0ZSksXHJcbiAgICAgIGVuZERhdGU6IHRoaXMuaGVscGVycy5mb3JtYXRJc29EYXRlKHRoaXMuY2hlY2tvdXRfZGF0ZSksXHJcbiAgICAgIHJvb21zOiB0aGlzLm5vX29mX3Jvb21zLFxyXG4gICAgICBvY2N1cGFudHM6IHRoaXMubm9fb2Zfb2NjdXBhbnRzLFxyXG4gICAgICBjdXJyZW5jeTogdGhpcy51c2VyQ3VycmVuY3kgfHwgJ0dCUCdcclxuICAgIH07XHJcbiAgfVxyXG4gIHJlc3VsdHNGaWx0ZXJNZXRob2Q6IChyZXN1bHRzOiBIb3RlbERldGFpbHNBcnJheSkgPT4gSG90ZWxEZXRhaWxzQXJyYXk7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJSZXN1bHRzID0gKCkgPT4ge1xyXG4gICAgdGhpcy5yZXN1bHRzRmlsdGVyTWV0aG9kID0gKHJlc3VsdHM6IEhvdGVsRGV0YWlsc0FycmF5KSA9PlxyXG4gICAgICByZXN1bHRzLmZpbHRlcigoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICB0aGlzLmluUHJpY2VSYW5nZShob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuaW5EaXN0YW5jZVJhbmdlKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5jb250YWluc0hvdGVsbmFtZShob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuaGFzQ2hhaW4oaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmJyZWFrZmFzdFR5cGVGaWx0ZXIoaG90ZWwpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZygnbm9ydG1hbCBzb3J0IHJlc3VsdHMnKTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHRoaXMucmVzdWx0c0ZpbHRlck1ldGhvZCh0aGlzLmZ1bGxSZXN1bHRzKSk7XHJcbiAgfTtcclxuXHJcbiAgLy8gTGlnaHRlbmluZyBGaWx0ZXJzXHJcbiAgcHVibGljIGZpbHRlckxpZ2h0ZW5pbmdSZXN1bHRzID0gKCkgPT4ge1xyXG4gICAgdGhpcy5yZXN1bHRzRmlsdGVyTWV0aG9kID0gKHJlc3VsdHM6IEhvdGVsRGV0YWlsc0FycmF5KSA9PlxyXG4gICAgICByZXN1bHRzLmZpbHRlcigoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICB0aGlzLmluTGlnaHRlbmluZ1ByaWNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5zSG90ZWxuYW1lKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5oYXNDaGFpbihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuaGFzUHJlZmVycmVkKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5icmVha2Zhc3RUeXBlRmlsdGVyKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5nZXRFeHRyYUZpbHRlcihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuZ2V0QW1lbml0aWVzRmlsdGVyKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5hY2Nlc3NpYmxlUm9vbVR5cGVGaWx0ZXIoaG90ZWwpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZygnbGlnaHRuaW5nIHNvcnQgcmVzdWx0cycpO1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQodGhpcy5yZXN1bHRzRmlsdGVyTWV0aG9kKHRoaXMuZnVsbFJlc3VsdHMpKTtcclxuICAgIHRoaXMucmVhcHBseVNvcnRpbmcubmV4dCh0cnVlKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgcmVzdWx0c0hhdmVUYWcoc2VhcmNoVGFnOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHRzQ29udGFpblRhZzogYm9vbGVhbjtcclxuICAgIGxldCBmaWx0ZXJlZFJlc3VsdHMgPSB0aGlzLmZ1bGxSZXN1bHRzLmZpbHRlcigoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICBsZXQgZmlsdGVyZWRUYWdzOiBhbnkgPSBob3RlbC50YWdzLmZpbHRlcigodGFnOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodGFnLm5hbWUpIHtcclxuICAgICAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnZlcnRUb09uZVN0cmluZyh0YWcubmFtZSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgIGlmIChuYW1lLmluY2x1ZGVzKHRoaXMuY29udmVydFRvT25lU3RyaW5nKHNlYXJjaFRhZykudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgbGV0IGNvbnRhaW5zU2VhcmNoVGFnID1cclxuICAgICAgICBmaWx0ZXJlZFRhZ3MgJiYgZmlsdGVyZWRUYWdzLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBIb3RlbCAke2hvdGVsLm5hbWV9IHdpdGggZmlsdGVyIGFwcGxpZWRgLCBob3RlbD8udGFncywgaXNUcnVlKTtcclxuICAgICAgcmV0dXJuIGNvbnRhaW5zU2VhcmNoVGFnO1xyXG4gICAgfSk7XHJcbiAgICByZXN1bHRzQ29udGFpblRhZyA9XHJcbiAgICAgIGZpbHRlcmVkUmVzdWx0cyAmJiBmaWx0ZXJlZFJlc3VsdHMubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgIHJldHVybiByZXN1bHRzQ29udGFpblRhZztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5QcmljZVJhbmdlKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShob3RlbCk7XHJcbiAgICBpZiAoYXZhaWxhYmlsaXR5KSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmluUmFuZ2UoYXZhaWxhYmlsaXR5Lm1heHByaWNlLCB0aGlzLmZpbHRlcnMucHJpY2VSYW5nZSkgJiZcclxuICAgICAgICB0aGlzLmhlbHBlcnMuaW5SYW5nZShhdmFpbGFiaWxpdHkubWlucHJpY2UsIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5EaXN0YW5jZVJhbmdlKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlLm1heCA9PT0gMCB8fFxyXG4gICAgICB0aGlzLmhlbHBlcnMuaW5SYW5nZShob3RlbC5sb2NhdGlvbi5kaXN0YW5jZSwgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb250YWluc0hvdGVsbmFtZShob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0b2NoZWNrID0gdGhpcy5maWx0ZXJzLmhvdGVsTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIHJldHVybiB0b2NoZWNrICYmIHRvY2hlY2subGVuZ3RoID4gMFxyXG4gICAgICA/IGhvdGVsLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0b2NoZWNrKVxyXG4gICAgICA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluTGlnaHRlbmluZ1ByaWNlUmFuZ2UoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYXZhaWxhYmlsaXR5ID0gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eVZhbHVlKGhvdGVsKTtcclxuICAgIGlmIChhdmFpbGFiaWxpdHkgJiYgT2JqZWN0LmtleXMoYXZhaWxhYmlsaXR5KS5sZW5ndGggIT09IDApIHtcclxuICAgICAgbGV0IG1heFJhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBmaW5kTWF4OiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgbWluUmFuZ2UgPSB0aGlzLmhlbHBlcnMuaW5SYW5nZShcclxuICAgICAgICBhdmFpbGFiaWxpdHkucHJwbixcclxuICAgICAgICB0aGlzLmZpbHRlcnMucHJpY2VSYW5nZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYXZhaWxhYmlsaXR5Py5tYXhwcmljZSkge1xyXG4gICAgICAgIGZpbmRNYXggPSBhdmFpbGFiaWxpdHkubWF4cHJpY2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZmluZE1heCA9IGF2YWlsYWJpbGl0eT8ucm9vbXMucmVkdWNlKFxyXG4gICAgICAgICAgKG9wLCBpdGVtKSA9PiAob3AgPSBvcCA+IGl0ZW0udG90YWwgPyBvcCA6IGl0ZW0udG90YWwpLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgbWF4UmFuZ2UgPSB0aGlzLmhlbHBlcnMuaW5SYW5nZShmaW5kTWF4LCB0aGlzLmZpbHRlcnMucHJpY2VSYW5nZSk7XHJcbiAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBtaW5SYW5nZSAmJiBtYXhSYW5nZTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNDaGFpbihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0b2NoZWNrID0gKHRoaXMuZmlsdGVycy5jaGFpbiB8fCBbXSkubWFwKChjaGFpbjogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgICAgcmV0dXJuIGNoYWluLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0b2NoZWNrICYmIHRvY2hlY2subGVuZ3RoXHJcbiAgICAgID8gISF0b2NoZWNrLmZpbmQoKGNoYWluOiBzdHJpbmcpID0+IHtcclxuICAgICAgICByZXR1cm4gaG90ZWwuZ3JvdXAudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhjaGFpbik7XHJcbiAgICAgIH0pXHJcbiAgICAgIDogdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVycy5icmVha2Zhc3RUeXBlLmxlbmd0aCkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgY29uc3QgaG90ZWxPYmplY3RWYWx1ZSA9IHRoaXMuZ2V0SG90ZWxPYmplY3RWYWx1ZShob3RlbCk7XHJcbiAgICBpZiAoIWhvdGVsT2JqZWN0VmFsdWUgfHwgIWhvdGVsT2JqZWN0VmFsdWU/LnJvb21zKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgaXNCcmVha2Zhc3RJbmNsdWRlZCA9IHRoaXMuZmlsdGVycy5icmVha2Zhc3RUeXBlLmluY2x1ZGVzKFxyXG4gICAgICBTZWFyY2hIYW5kbGVyLkJSRUFLRkFTVF9JTkNMVURFRFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGlzQnJlYWtmYXN0RXhjbHVkZWQgPSB0aGlzLmZpbHRlcnMuYnJlYWtmYXN0VHlwZS5pbmNsdWRlcyhcclxuICAgICAgU2VhcmNoSGFuZGxlci5CUkVBS0ZBU1RfTk9UX0lOQ0xVREVEXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGJyZWFrZmFzdE1hdGNoZXMgPSBob3RlbE9iamVjdFZhbHVlLnJvb21zLmZpbHRlcigocm9vbXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXNCcmVha2Zhc3RJbmNsdWRlZCAmJiBpc0JyZWFrZmFzdEV4Y2x1ZGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJvb21zO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzQnJlYWtmYXN0SW5jbHVkZWQpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGluY2x1ZGVkRXhwcmVzc2lvbikgJiZcclxuICAgICAgICAgICFyb29tcy5yYXRlRGVzY3JpcHRpb24ubWF0Y2goZXhjbHVkZWRFeHByZXNzaW9uKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNCcmVha2Zhc3RFeGNsdWRlZCkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAhcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGluY2x1ZGVkRXhwcmVzc2lvbikgfHxcclxuICAgICAgICAgIHJvb21zLnJhdGVEZXNjcmlwdGlvbi5tYXRjaChleGNsdWRlZEV4cHJlc3Npb24pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gISFicmVha2Zhc3RNYXRjaGVzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWNjZXNzaWJsZVJvb21UeXBlRmlsdGVyKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzLmFjY2Vzc2libGVSb29tVHlwZS5sZW5ndGgpIHJldHVybiB0cnVlO1xyXG4gICAgY29uc3QgaG90ZWxPYmplY3RWYWx1ZSA9IHRoaXMuZ2V0SG90ZWxPYmplY3RWYWx1ZShob3RlbCk7XHJcbiAgICBpZiAoIWhvdGVsT2JqZWN0VmFsdWUgfHwgIWhvdGVsT2JqZWN0VmFsdWU/LnJvb21zKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgbWF0Y2hlcyA9IGhvdGVsT2JqZWN0VmFsdWUucm9vbXMuZmlsdGVyKFxyXG4gICAgICAocm9vbXM6IGFueSkgPT5cclxuICAgICAgICByb29tcy5yYXRlRGVzY3JpcHRpb24ubWF0Y2goaW5jbHVkZWRBY2Nlc3NpYmlsaXR5RXhwcmVzc2lvbikgfHxcclxuICAgICAgICByb29tcy5yb29tRGVzY3JpcHRpb24ubWF0Y2goaW5jbHVkZWRBY2Nlc3NpYmlsaXR5RXhwcmVzc2lvbikgfHxcclxuICAgICAgICByb29tcy5yb29tVHlwZS5tYXRjaChpbmNsdWRlZEFjY2Vzc2liaWxpdHlFeHByZXNzaW9uKVxyXG4gICAgKTtcclxuICAgIHJldHVybiAhIW1hdGNoZXMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIb3RlbE9iamVjdFZhbHVlKFxyXG4gICAgaG90ZWw6IEhvdGVsRGV0YWlsc1xyXG4gICk6IEhvdGVsQXZhbGliaWxpdHlRdW90ZVJlc3VsdCB7XHJcbiAgICBjb25zdCBob3RlbE9iamVjdCA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlGb3JJZChcclxuICAgICAgdGhpcy5tYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWwpLFxyXG4gICAgICBob3RlbFxyXG4gICAgKTtcclxuICAgIHJldHVybiAhaG90ZWxPYmplY3QgJiYgIWhvdGVsT2JqZWN0LnZhbHVlID8gbnVsbCA6IGhvdGVsT2JqZWN0LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgYnlNb3N0RXhwZW5zaXZlKCkge1xyXG4gICAgdGhpcy5zb3J0QnlQcmljZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG1pblxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVidWcgc2V0IHRoaXMgdG8gdHJ1ZSB0byBvdXRwdXQgY29uc29sZSBsb2dzXHJcbiAgICogQGRlc2NyaXB0aW9uIHNvcnRzIHJlc3VsdHMgYnkgcHJpY2UgYWNjb3JkaW5nIHRvIHRoZSAnbWluJyBwYXJhbWF0ZXIuIG1pbiA9IHRydWUgKGxvd2VzdCBwcmljZSBmaXJzdCksIG1pbiA9IGZhbHNlIChoaWdoZXN0IHByaWNlIGZpcnN0KVxyXG4gICAqIEluIHN1bW1hcnksIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzb3J0ZWQgYXJyYXkgb2YgaG90ZWxzIHdpdGggcHJpY2VzIGFuZCBhbiBhcnJheSBvZiBob3RlbHMgV0lUSE9VVCBwcmljZXMsXHJcbiAgICogdGhlbiBmaW5hbGx5IGpvaW5zIHRoZXNlIDIgdGVtcG9yYXJ5IGFycmF5cyB0b2dldGhlciBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgbmV4dCBvYnNlcnZhYmxlLlxyXG4gICAqL1xyXG5cclxuICBzb3J0QnlQcmljZShtaW4gPSB0cnVlLCBkZWJ1ZyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAvLyBzdG9yZSBhbGwgcmVzdWx0c1xyXG4gICAgY29uc3QgaG90ZWxzOiBIb3RlbERldGFpbHNBcnJheSA9IHRoaXMuZnVsbFJlc3VsdHM7XHJcblxyXG4gICAgLy8gZ2V0IGhvdGVscyB3aXRoIGFuZCB3aXRob3V0IHByaWNlc1xyXG4gICAgY29uc3QgaG90ZWxzV2l0aFByaWNlczogSG90ZWxEZXRhaWxzQXJyYXkgPSBbXTtcclxuICAgIGNvbnN0IGhvdGVsc1dpdGhvdXRQcmljZXM6IEhvdGVsRGV0YWlsc0FycmF5ID0gW107XHJcbiAgICBob3RlbHMubWFwKChob3RlbFJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoaG90ZWxSZXN1bHQpPy5wcnBuXHJcbiAgICAgICAgPyBob3RlbHNXaXRoUHJpY2VzLnB1c2goaG90ZWxSZXN1bHQpXHJcbiAgICAgICAgOiBob3RlbHNXaXRob3V0UHJpY2VzLnB1c2goaG90ZWxSZXN1bHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc29ydCBob3RlbHMgd2l0aCBwcmljZXMgYWNjb3JkaW5nIHRvIHRoZSAnbWluJyBwYXJhbWV0ZXIgZm9yIHRoZSBvcmRlclxyXG4gICAgaG90ZWxzV2l0aFByaWNlcy5zb3J0KChmaXJzdDogSG90ZWxEZXRhaWxzLCBzZWNvbmQ6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICBjb25zdCBmaXJzdFByaWNlID1cclxuICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoZmlyc3QpPy5wcnBuO1xyXG4gICAgICBjb25zdCBzZWNvbmRQcmljZSA9XHJcbiAgICAgICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eVZhbHVlKHNlY29uZCk/LnBycG47XHJcbiAgICAgIHJldHVybiBtaW5cclxuICAgICAgICA/IGZpcnN0UHJpY2UgPiBzZWNvbmRQcmljZVxyXG4gICAgICAgICAgPyAxXHJcbiAgICAgICAgICA6IHNlY29uZFByaWNlID4gZmlyc3RQcmljZVxyXG4gICAgICAgICAgICA/IC0xXHJcbiAgICAgICAgICAgIDogMFxyXG4gICAgICAgIDogZmlyc3RQcmljZSA8IHNlY29uZFByaWNlXHJcbiAgICAgICAgICA/IDFcclxuICAgICAgICAgIDogc2Vjb25kUHJpY2UgPCBmaXJzdFByaWNlXHJcbiAgICAgICAgICAgID8gLTFcclxuICAgICAgICAgICAgOiAwO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gam9pbiBob3RlbHMgd2l0aCBwcmljZXMgdG8gaG90ZWxzIFdJVEhPVVQgcHJpY2VzXHJcbiAgICBjb25zdCBzb3J0ZWRIb3RlbHMgPSBbLi4uaG90ZWxzV2l0aFByaWNlcywgLi4uaG90ZWxzV2l0aG91dFByaWNlc107XHJcblxyXG4gICAgLy8gdHJpZ2dlciBuZXh0IG9ic2VydmFibGVcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHNvcnRlZEhvdGVscyk7XHJcblxyXG4gICAgLy8gZGlzcGxheSBjb25zb2xlIGxvZ3MgaWYgZGVidWcgaXMgdHJ1ZSAoY291bGQgcHJvdmUgdXNlZnVsIGluIGZ1dHVyZSlcclxuICAgIGlmIChkZWJ1Zykge1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgc29ydEJ5UHJpY2UoKSBjYWxsZWQgKysnKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIGhvdGVsICsrJywgaG90ZWxzKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIGhvdGVsc1dpdGhQcmljZXMgKysnLCBob3RlbHNXaXRoUHJpY2VzKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIGhvdGVsc1dpdGhvdXRQcmljZXMgKysnLCBob3RlbHNXaXRob3V0UHJpY2VzKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIHNvcnRlZEhvdGVscyArKycsIHNvcnRlZEhvdGVscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzb3J0QnlOYW1lKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoXHJcbiAgICAgIHRoaXMuaGVscGVyc1xyXG4gICAgICAgIC5jbG9uZSh0aGlzLmZ1bGxSZXN1bHRzKVxyXG4gICAgICAgIC5zb3J0KChmc3Q6IEhvdGVsRGV0YWlscywgc25kOiBIb3RlbERldGFpbHMpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGZzdC5uYW1lLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShzbmQubmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNvcnRCeURpc3RhbmNlKCk6IHZvaWQge1xyXG4gICAgbGV0IHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMudmFsdWUgfHwgW107XHJcbiAgICB0cnkge1xyXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcihhLmxvY2F0aW9uLmRpc3RhbmNlKSAtIE51bWJlcihiLmxvY2F0aW9uLmRpc3RhbmNlKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCcrKysgRXJyb3Igc29ydGluZyBieSBwcmVmZXJyZWQ6ICcsIGVycm9yLCAnICsrKycpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcblxyXG4gIH1cclxuXHJcbiAgYnlQcmVmZXJyZWQoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IHRoaXMucmVzdWx0cy52YWx1ZSB8fCBbXTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNvcnQoKGE6IEhvdGVsRGV0YWlscywgYjogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlZmVycmVkVG9JbnQoYikgLSB0aGlzLnByZWZlcnJlZFRvSW50KGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJysrKyBFcnJvciBzb3J0aW5nIGJ5IHByZWZlcnJlZDogJywgZXJyb3IsICcgKysrJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZWZlcnJlZFRvSW50KGhvdGVsOiBIb3RlbERldGFpbHMpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgKGhvdGVsLnByZWZlcnJlZC5jbGllbnQgPyBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFIDogMCkgK1xyXG4gICAgICAoaG90ZWwucHJlZmVycmVkLmNvbnN1bWVyID8gQUdFTlRfUFJFRkVSUkVEX1ZBTFVFIDogMClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludFRvUHJlZmVycmVkKHByZWZlcnJlZDogMCB8IDEgfCAyIHwgMykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXHJcbiAgICAgIGNsaWVudDogKHByZWZlcnJlZCAmIENMSUVOVF9QUkVGRVJSRURfVkFMVUUpID09PSBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFLFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWJpdHdpc2VcclxuICAgICAgY29uc3VtZXI6IChwcmVmZXJyZWQgJiBBR0VOVF9QUkVGRVJSRURfVkFMVUUpID09PSBBR0VOVF9QUkVGRVJSRURfVkFMVUVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhZGRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcsIHR5cGU6IGtleW9mIEhvdGVsRmlsdGVycyk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsdDogYW55ID0gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgICBmaWx0W3R5cGVdLnB1c2goZmlsdGVyKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZpbHRlcihmaWx0ZXI6IHN0cmluZywgdHlwZToga2V5b2YgSG90ZWxGaWx0ZXJzKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWx0ID0gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0W3R5cGVdKSkge1xyXG4gICAgICAoZmlsdFt0eXBlXSBhcyBzdHJpbmdbXSkgPSAoZmlsdFt0eXBlXSBhcyBzdHJpbmdbXSkuZmlsdGVyKFxyXG4gICAgICAgIChjaGFpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZmlsdGVyICE9PSBjaGFpbjtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5jaGFpbiA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuYW1lbml0eXR5cGUgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLnByZWZlcnJlZCA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuZXh0cmEgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmhvdGVsTmFtZSA9ICcnO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuYnJlYWtmYXN0VHlwZSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VhcmNoRnJvbUV4cGlyZWRCYXNrZXRJdGVtKGJhc2tldEl0ZW06IEJhc2tldEl0ZW0pOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlYXJjaEhvdGVsUXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzID0gYmFza2V0SXRlbS5zZWFyY2hRdWVyeTtcclxuICAgIHRoaXMuY3VycmVuY3kgPSBzZWFyY2hIb3RlbFF1ZXJ5LmN1cnJlbmN5O1xyXG4gICAgdGhpcy5kaXN0YW5jZSA9IHNlYXJjaEhvdGVsUXVlcnkuZGlzdGFuY2U7XHJcbiAgICB0aGlzLm5vX29mX3Jvb21zID0gc2VhcmNoSG90ZWxRdWVyeS5yb29tcztcclxuICAgIHRoaXMuY2hlY2tpbl9kYXRlID0gbW9tZW50KHNlYXJjaEhvdGVsUXVlcnkuc3RhcnREYXRlKTtcclxuICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9IG1vbWVudChzZWFyY2hIb3RlbFF1ZXJ5LmVuZERhdGUpO1xyXG4gICAgdGhpcy5ob3RlbF9uYW1lID0gc2VhcmNoSG90ZWxRdWVyeS5ob3RlbE5hbWU7XHJcblxyXG4gICAgaWYgKHNlYXJjaEhvdGVsUXVlcnkuZ3JvdXBOYW1lKSB7XHJcbiAgICAgIHRoaXMuaG90ZWxfY2hhaW4gPSB7XHJcbiAgICAgICAgbmFtZTogc2VhcmNoSG90ZWxRdWVyeS5ncm91cE5hbWVcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2VhcmNoSG90ZWxRdWVyeS5pYXRhKSB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ7XHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZVxyXG4gICAgICAgIC5nZXRBaXJwb3J0QnlDb2RlKHNlYXJjaEhvdGVsUXVlcnkuaWF0YSlcclxuICAgICAgICAuc3Vic2NyaWJlKChpYXRhOiBBaXJwb3J0U2VhcmNoUmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYWlycG9ydCA9IHtcclxuICAgICAgICAgICAgYWlycG9ydDoge1xyXG4gICAgICAgICAgICAgIGdhdGV3YXk6IGlhdGEuaWF0YU1hdGNoLmlhdGFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMubG9jYXRpb24gPSB7IC4uLmFpcnBvcnQsIC4uLmlhdGEuaWF0YU1hdGNoIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlYXJjaEhvdGVsUXVlcnkubGF0aXR1ZGUgJiYgc2VhcmNoSG90ZWxRdWVyeS5sb25naXR1ZGUpIHtcclxuICAgICAgdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IExvY2F0aW9uVHlwZXMuQ2l0eTtcclxuICAgICAgdGhpcy5sb2NhdGlvbiA9IHtcclxuICAgICAgICBuYW1lOiBiYXNrZXRJdGVtLmRldGFpbD8uaG90ZWxBYWRkcmVzcz8udG93blxyXG4gICAgICAgICAgPyBiYXNrZXRJdGVtLmRldGFpbD8uaG90ZWxBYWRkcmVzcz8udG93blxyXG4gICAgICAgICAgOiAnJyxcclxuICAgICAgICBsYXRpdHVkZTogc2VhcmNoSG90ZWxRdWVyeS5sYXRpdHVkZSxcclxuICAgICAgICBsb25naXR1ZGU6IHNlYXJjaEhvdGVsUXVlcnkubG9uZ2l0dWRlXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKHNlYXJjaEhvdGVsUXVlcnkucG9zdE9yWmlwQ29kZSkge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gTG9jYXRpb25UeXBlcy5Qb3N0Y29kZTtcclxuICAgICAgdGhpcy5wb3N0Y29kZSA9IHtcclxuICAgICAgICBuYW1lOiBzZWFyY2hIb3RlbFF1ZXJ5LnBvc3RPclppcENvZGUsXHJcbiAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5Qb3N0Y29kZVxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmIChzZWFyY2hIb3RlbFF1ZXJ5Lm9mZmljZUlkKSB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLk9mZmljZTtcclxuICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlXHJcbiAgICAgICAgLmdldE9mZmljZShzZWFyY2hIb3RlbFF1ZXJ5Lm9mZmljZUlkKVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgob2ZmaWNlOiBDb25mZXJtYU9mZmljZUluZm8pID0+IHtcclxuICAgICAgICAgIHRoaXMub2ZmaWNlID0ge1xyXG4gICAgICAgICAgICBpZDogb2ZmaWNlLmlkLFxyXG4gICAgICAgICAgICBuYW1lOiBvZmZpY2UubmFtZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoc2VhcmNoSG90ZWxRdWVyeS50cmFpblN0YXRpb25Db2RlKSB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjtcclxuICAgICAgdGhpcy5nZXRSYWlsU3RhdGlvbkJ5Q29kZShzZWFyY2hIb3RlbFF1ZXJ5LnRyYWluU3RhdGlvbkNvZGUpLnN1YnNjcmliZShcclxuICAgICAgICAodHJhaW5zU3RhdGlvbjogUmFpbFN0YXRpb24pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhaW5zU3RhdGlvbiA9IHtcclxuICAgICAgICAgICAgLi4udHJhaW5zU3RhdGlvbixcclxuICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb25cclxuICAgICAgICAgIH0gYXMgTG9jYXRpb25EZXRhaWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAoc2VhcmNoSG90ZWxRdWVyeS5jb3VudHJ5Q29kZSkge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q7XHJcbiAgICAgIHRoaXMuY291bnRyeSA9IHtcclxuICAgICAgICBjQ29kZTogc2VhcmNoSG90ZWxRdWVyeS5jb3VudHJ5Q29kZSxcclxuICAgICAgICBjTmFtZTogJydcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhZGQgVHJhdmVsbGVyc1xyXG4gICAgaWYgKGJhc2tldEl0ZW0udXNlcnMpIHtcclxuICAgICAgYmFza2V0SXRlbS51c2Vycy5mb3JFYWNoKCh1c2VyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2UuYWRkVHJhdmVsbGVyKHVzZXIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUZyb21QcmV2aW91c1NlYXJjaGVzKFxyXG4gICAgcHJldmlvdXNJdGVtczogUmVjb3JkPFNlcnZpY2VUeXBlLCBCYXNrZXRJdGVtPlxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ1BSRVBPUFVMQVRJTkcgSE9URUwgRk9STScpO1xyXG4gICAgY29uc3QgZmxpZ2h0SXRlbTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMgPVxyXG4gICAgICBwcmV2aW91c0l0ZW1zW1NlcnZpY2VUeXBlLkZsaWdodF0/LnNlYXJjaFF1ZXJ5O1xyXG4gICAgY29uc3QgcmFpbEl0ZW06IFNlYXJjaFJhaWxRdWVyeVZhcmlhYmxlcyA9XHJcbiAgICAgIHByZXZpb3VzSXRlbXNbU2VydmljZVR5cGUuUmFpbF0/LnNlYXJjaFF1ZXJ5O1xyXG4gICAgY29uc3QgaXJsSXRlbTogU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMgPSBcclxuICAgICAgcHJldmlvdXNJdGVtc1tTZXJ2aWNlVHlwZS5JbnRlcm5hdGlvbmFsUmFpbF0/LnNlYXJjaFF1ZXJ5XHJcbiAgICBpZiAoZmxpZ2h0SXRlbSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ7XHJcbiAgICAgICAgdGhpcy5jaGVja2luX2RhdGUgPVxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkZsaWdodF0ub3V0Qm91bmREYXRlO1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XS5pbmJvdW5kRGF0ZTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uID0ge1xyXG4gICAgICAgICAgbmFtZTogKFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XVxyXG4gICAgICAgICAgICAgIC5hcnJpdmVMb2NhdGlvbiBhcyBPQlRBaXJwb3J0RGV0YWlsc1xyXG4gICAgICAgICAgKS5kZXN0aW5hdGlvbixcclxuICAgICAgICAgIHR5cGU6ICdBaXJwb3J0JyxcclxuICAgICAgICAgIGFpcnBvcnQ6XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdLmFycml2ZUxvY2F0aW9uXHJcbiAgICAgICAgfSBhcyBhbnk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHRyeWluZyB0byBwcmVwb3B1bGF0ZSBob3RlbCBmcm9tIGZsaWdodCBpdGVtJyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAocmFpbEl0ZW0pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb247XHJcbiAgICAgICAgdGhpcy5jaGVja2luX2RhdGUgPVxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlJhaWxdLm91dEJvdW5kRGF0ZVRpbWU7XHJcbiAgICAgICAgdGhpcy5jaGVja291dF9kYXRlID1cclxuICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5SYWlsXS5pbkJvdW5kRGF0ZVRpbWU7XHJcbiAgICAgICAgdGhpcy50cmFpbnNTdGF0aW9uID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlJhaWxdXHJcbiAgICAgICAgICAudHJhdmVsbGluZ1RvIGFzIExvY2F0aW9uRGV0YWlscztcclxuICAgICAgICB0aGlzLmxvY2F0aW9uID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlJhaWxdXHJcbiAgICAgICAgICAudHJhdmVsbGluZ1RvIGFzIExvY2F0aW9uRGV0YWlscztcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdHJ5aW5nIHRvIHByZXBvcHVsYXRlIGhvdGVsIGZyb20gcmFpbCBpdGVtJyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoaXJsSXRlbSl7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uXHJcbiAgICAgICAgdGhpcy5jaGVja2luX2RhdGUgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWxdLm91dEJvdW5kRGF0ZVRpbWVcclxuICAgICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgPVxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkludGVybmF0aW9uYWxSYWlsXS5yZXR1cm5EZXBhcnR1cmVEYXRlVGltZTtcclxuICAgICAgICB0aGlzLnRyYWluc1N0YXRpb24gPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWxdXHJcbiAgICAgICAgICAudHJhdmVsbGluZ1RvIGFzIExvY2F0aW9uRGV0YWlscztcclxuICAgICAgICB0aGlzLmxvY2F0aW9uID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkludGVybmF0aW9uYWxSYWlsXVxyXG4gICAgICAgICAgLnRyYXZlbGxpbmdUbyBhcyBMb2NhdGlvbkRldGFpbHM7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHRyeWluZyB0byBwcmVwb3B1bGF0ZSBob3RlbCBmcm9tIGludGVybmF0aW9uYWwgcmFpbCBpdGVtJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzUHJlZmVycmVkKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHByZWZlcnJlZEZpbHRlcnMgPSB0aGlzLmZpbHRlcnMucHJlZmVycmVkO1xyXG5cclxuICAgIC8vIEVtcHR5IHByZWZlcnJlZCBmaWx0ZXJzIE9SIFwiQW55XCJcclxuICAgIGlmIChcclxuICAgICAgIXByZWZlcnJlZEZpbHRlcnMubGVuZ3RoIHx8XHJcbiAgICAgIHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5BTlkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWdlbmN5IChjb25zdW1lcikgJiYgQ2xpZW50XHJcbiAgICBpZiAoXHJcbiAgICAgIHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5BR0VOQ1kpICYmXHJcbiAgICAgIHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5DTElFTlQpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBob3RlbC5wcmVmZXJyZWQuY29uc3VtZXIgPT09IHRydWUgJiYgaG90ZWwucHJlZmVycmVkLmNsaWVudCA9PT0gdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFnZW5jeVxyXG4gICAgaWYgKHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5BR0VOQ1kpKSB7XHJcbiAgICAgIHJldHVybiBob3RlbC5wcmVmZXJyZWQuY29uc3VtZXIgPT09IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xpZW50XHJcbiAgICBpZiAocHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkNMSUVOVCkpIHtcclxuICAgICAgcmV0dXJuIGhvdGVsLnByZWZlcnJlZC5jbGllbnQgPT09IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdExlYXN0T25lUHJlZmVycmVkQWdlbnRIb3RlbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBhdExlYXN0T25lID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlc3VsdHMudmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMucmVzdWx0cy52YWx1ZVtpXS5wcmVmZXJyZWQuY29uc3VtZXIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGF0TGVhc3RPbmVQcmVmZXJyZWRDbGllbnRIb3RlbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBhdExlYXN0T25lID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlc3VsdHMudmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMucmVzdWx0cy52YWx1ZVtpXS5wcmVmZXJyZWQuY2xpZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0bWF4UHJpY2VGb3JDdXJyZW5jeShjdXJyZW5jeTogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UubWF4UHJpY2VGb3JDdXJyZW5jeShjdXJyZW5jeSk7XHJcbiAgfVxyXG5cclxuICAvLyBMaWdodGVuaW5nIEV4dHJhIEZpbHRlcnNcclxuICBwcml2YXRlIGdldEV4dHJhRmlsdGVyKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNoZWNrQXZhaWxhYmlsaXR5ID0gdGhpcy5maWx0ZXJzLmV4dHJhLmluY2x1ZGVzKFxyXG4gICAgICBTZWFyY2hIYW5kbGVyLkFWQUlMQUJJTElUWVxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja0F2YWlsYWJpbGl0eSkge1xyXG4gICAgICByZXR1cm4gaG90ZWwudW5hdmFpbGFibGUgPT09IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hlY2tGZW1hbGVGcmllbmRseSA9IHRoaXMuZmlsdGVycy5leHRyYS5pbmNsdWRlcyhcclxuICAgICAgU2VhcmNoSGFuZGxlci5GRU1BTEVfRlJJRU5ETFlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tGZW1hbGVGcmllbmRseSkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGhvdGVsLnRhZ3MuZmlsdGVyKCh0YWcpID0+IHtcclxuICAgICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcodGFnLm5hbWUpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lLmluY2x1ZGVzKFxyXG4gICAgICAgICAgICAgIHRoaXMuY29udmVydFRvT25lU3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgU2VhcmNoSGFuZGxlci5GRU1BTEVfRlJJRU5ETFlcclxuICAgICAgICAgICAgICApLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmxlbmd0aCA+IDBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gTGlnaHRlbmluZyBBbWVybml0aWVzIEZpbHRlcnNcclxuICBwcml2YXRlIGdldEFtZW5pdGllc0ZpbHRlcihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUcnVlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHRoaXMuZmlsdGVycy5hbWVuaXR5dHlwZS5mb3JFYWNoKChzZWFyY2gpID0+IHtcclxuICAgICAgbGV0IGZpbHRlcmVkUmVzdWx0czogYW55ID0gaG90ZWwudGFncy5maWx0ZXIoKHRhZykgPT4ge1xyXG4gICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMuY29udmVydFRvT25lU3RyaW5nKHRhZy5uYW1lKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXModGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcoc2VhcmNoKS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpc1RydWUgPSBmaWx0ZXJlZFJlc3VsdHMgJiYgZmlsdGVyZWRSZXN1bHRzLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBIb3RlbCAke2hvdGVsLm5hbWV9IHdpdGggZmlsdGVyIGFwcGxpZWRgLCBob3RlbD8udGFncywgaXNUcnVlKTtcclxuICAgICAgcmV0dXJuIGlzVHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGlzVHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29udmVydFRvT25lU3RyaW5nKGl0ZW06IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGl0ZW0ucmVwbGFjZSgvW15hLXpBLVpdL2csICcnKTtcclxuICB9XHJcblxyXG4gIGdldEltYWdlcyhIb2xpZGF5Q29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgdXJsID1cclxuICAgICAgdGhpcy5lbnZpcm9ubWVudC5ob3N0QmFzZVVybCArXHJcbiAgICAgIFVSTFMuQ09ORklSTUFfUEhPVE9fVVJMICtcclxuICAgICAgSG9saWRheUNvZGUuc3BsaXQoJywnKVswXTtcclxuICAgIGNvbnN0IGltZ1Byb3ZpZGVyID0gJ2h0dHBzOi8vd3d3LnZmbWlpLmNvbS8nOyAvLyBpbWcgcHJvdmlkZXIgdGhhdHMgaG9sZHMgaW1hZ2VzLCB1c2VkIHRvIG1hdGNoIHdoaWNoIGltYWdlcyBvbiBwYWdlIGJlbG9uZ3MgdG8gZ2FsbGVyeS5cclxuICAgIGlmICh0aGlzLmdhbGxlcmllc1tIb2xpZGF5Q29kZV0pIHtcclxuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2FsbGVyaWVzW0hvbGlkYXlDb2RlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENhbGxTZXJ2aWNlLmdldCh1cmwgYXMgVVJMUywgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KS5waXBlKFxyXG4gICAgICBtYXAoKGltYWdlc0hUTUwpID0+IHtcclxuICAgICAgICBpZiAoIWltYWdlc0hUTUwpIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKGBHYWxsZXJ5IGZvciAke0hvbGlkYXlDb2RlfSBjYW4gbm90IGJlIGxvYWRlZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRlbXAuaW5uZXJIVE1MID0gaW1hZ2VzSFRNTDtcclxuICAgICAgICBjb25zdCBpbWFnZXMgPSBBcnJheS5mcm9tKHRlbXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpKS5yZWR1Y2UoXHJcbiAgICAgICAgICAoYWNjLCBpbWcpID0+IHtcclxuICAgICAgICAgICAgaWYgKGltZy5zcmMuaW5jbHVkZXMoaW1nUHJvdmlkZXIpKSB7XHJcbiAgICAgICAgICAgICAgYWNjLnB1c2goaW1nLnNyYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBbXVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKCFpbWFnZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aHJvdyBFcnJvcihcclxuICAgICAgICAgICAgYFRoZXJlIGlzIG5vIG1lZGlhIGNvbnRlbnQgcHJvdmlkZWQgZm9yIHRoaXMgaG90ZWwgJHtIb2xpZGF5Q29kZX1gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKHRoaXMuZ2FsbGVyaWVzW0hvbGlkYXlDb2RlXSA9IGltYWdlcyk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYWRkUGFnaW5hdGlvblBhZ2UoY3VycmVudFBhZ2U6IG51bWJlcik6IGFueSB7XHJcbiAgICBjb25zdCBrZXkgPSAnUGFnaW5hdGlvblBhZ2VDb3VudCc7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKGtleSwgY3VycmVudFBhZ2UpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oa2V5KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVZpZXcoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gSG90ZWxWaWV3LkxJU1QpIHtcclxuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IEhvdGVsVmlldy5NQVA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gSG90ZWxWaWV3LkxJU1Q7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYWxjRGF5RGlmZigpOiBudW1iZXIge1xyXG4gICAgY29uc3QgY2hlY2tvdXQgPSBtb21lbnQodGhpcy5jaGVja291dF9kYXRlKTtcclxuICAgIGNvbnN0IGNoZWNraW4gPSBtb21lbnQodGhpcy5jaGVja2luX2RhdGUpO1xyXG4gICAgcmV0dXJuIGNoZWNrb3V0LnN0YXJ0T2YoJ2RheScpLmRpZmYoY2hlY2tpbi5zdGFydE9mKCdkYXknKSwgJ2RheXMnKTtcclxuICB9XHJcbiAgdXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0czogSG90ZWxEZXRhaWxzW10pOiBJQ2hlYXBlc3RQcmljZSB7XHJcbiAgICBjb25zdCBjdXJyZW5jaWVzS2V5ID0gT2JqZWN0LmtleXModGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmN1cnJlbmNpZXMpO1xyXG4gICAgaWYgKCghcmVzdWx0cy5sZW5ndGggJiYgIWN1cnJlbmNpZXNLZXkubGVuZ3RoKSB8fCAhY3VycmVuY2llc0tleS5sZW5ndGgpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbmNpZSA9IGN1cnJlbmNpZXNLZXlbMF07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYW1vdW50OiB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuY3VycmVuY2llc1tjdXJyZW5jaWVdLm1pbnByaWNlLFxyXG4gICAgICBjdXJyZW5jeUNvZGU6IGN1cnJlbmNpZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldFJvb21OdW1iZXIoKSB7XHJcbiAgICBsZXQgcm9vbXNPY2N1cGFuY3k6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE51bWJlcih0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMpOyBpKyspIHtcclxuICAgICAgY29uc3QgbmV3Um9vbU9jY3VwYW5jeSA9IHtcclxuICAgICAgICBBZHVsdHM6IHRoaXMuY2FsY1Jvb21PY2N1cGFuY3koXHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMsXHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzXHJcbiAgICAgICAgKSxcclxuICAgICAgICBDaGlsZHJlbjogMCxcclxuICAgICAgICBJbmZhbnRzOiAwXHJcbiAgICAgIH07XHJcbiAgICAgIHJvb21zT2NjdXBhbmN5LnB1c2gobmV3Um9vbU9jY3VwYW5jeSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJvb21zOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJvb21zT2NjdXBhbmN5Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvb21zT2NjdXBhbmN5W2luZGV4XS5BZHVsdHM7IGorKykge1xyXG4gICAgICAgIHJvb21zLnB1c2goaW5kZXggKyAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLSBzaG91bGQgd2UgYWRkIG5ldyBwcm9wZXJ0eSByb29tTnVtYmVyIGZvciB0cmF2ZWxsZXI/IC0tXHJcbiAgICAvLyBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50cmF2ZWxsZXJzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgLy8gICB0aGlzLnRyYXZlbGxlcnNbaW5kZXhdLnJvb21OdW1iZXIgPSByb29tc1tpbmRleF07XHJcbiAgICAvLyB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcdEBkZXNjIC0gcmV0dXJuIHRoZSBvY2N1cGFuY3kgZm9yIGEgcm9vbSAtIG5lZWQgdG8gY2FsY3VsYXRlIGJhc2VkIG9uIG5vIG9mIHJvb21zLCBubyBvZiB0cmF2ZWxsZXJzIGFuZCBjdXJyZW50bHkgb2NjdXBpZWQgcm9vbXM7XHJcbiAgICoqL1xyXG5cclxuICBjYWxjUm9vbU9jY3VwYW5jeShub19vZl9yb29tczogbnVtYmVyLCB0cmF2ZWxsZXJzOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgICdObyBvZiBUcmF2ZWxsZXJzOiAnICtcclxuICAgICAgdHJhdmVsbGVycyArXHJcbiAgICAgICd8IE5vIG9mIHJvb21zOiAnICtcclxuICAgICAgbm9fb2Zfcm9vbXMgK1xyXG4gICAgICAnIHwgQXNzaWduZWQ6ICcgK1xyXG4gICAgICB0aGlzLm9jY3VwaWVkXHJcbiAgICApO1xyXG4gICAgbGV0IHJvb21PY2N1cGFuY3k6IG51bWJlciA9IE1hdGguY2VpbCh0cmF2ZWxsZXJzIC8gbm9fb2Zfcm9vbXMpO1xyXG5cclxuICAgIGlmICh0cmF2ZWxsZXJzIC0gdGhpcy5vY2N1cGllZCA8IHJvb21PY2N1cGFuY3kpIHtcclxuICAgICAgY29uc29sZS5sb2coJ1dlIGhhdmUgcnVuIG91dCBvZiBvY2N1cGllcnMhJyk7XHJcbiAgICAgIHJvb21PY2N1cGFuY3kgPSB0cmF2ZWxsZXJzIC0gdGhpcy5vY2N1cGllZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm9vbU9jY3VwYW5jeSA8PSAwKSB7XHJcbiAgICAgIHJvb21PY2N1cGFuY3kgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub2NjdXBpZWQgKz0gcm9vbU9jY3VwYW5jeTtcclxuICAgIHJldHVybiByb29tT2NjdXBhbmN5O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkSG90ZWxSb29tVG9CYXNrZXQoXHJcbiAgICBob3RlbDogSG90ZWxEZXRhaWxzLFxyXG4gICAgaG90ZWxSb29tOiBIb3RlbFJvb20sXHJcbiAgICBob3RlbFF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyxcclxuICAgIHRyYXZlbGxlcnM/OiBUcmF2ZWxsZXJbXVxyXG4gICk6IFByb21pc2U8RGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucz4ge1xyXG4gICAgY29uc29sZS5sb2coaG90ZWwpO1xyXG4gICAgY29uc29sZS5sb2coaG90ZWxSb29tKTtcclxuICAgIGNvbnNvbGUubG9nKGhvdGVsUXVlcnkpO1xyXG5cclxuICAgIGlmIChob3RlbC51bmF2YWlsYWJsZSkge1xyXG4gICAgICByZXR1cm4gRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbW9kaWZ5IHRoZSAnc3RhcnREYXRlJyBhbmQgJ2VuZERhdGUnIHByb3BlcnRpZXMgdG8gaGF2ZSBJU08gZm9ybWF0XHJcbiAgICBob3RlbFF1ZXJ5LnN0YXJ0RGF0ZSA9IG5ldyBEYXRlKGhvdGVsUXVlcnkuc3RhcnREYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgaG90ZWxRdWVyeS5lbmREYXRlID0gbmV3IERhdGUoaG90ZWxRdWVyeS5lbmREYXRlKS50b0lTT1N0cmluZygpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBjb3B5IG9mIGhvdGVsUXVlcnkgYW5kIGRlbGV0ZSAnYWR1bHRzJyBwcm9wZXJ0eSBhcyBzZWFyY2hRdWVyeVNjaGVtYSBmb3IgaG90ZWwgKGNvbmZlcm1hKSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgaXQgYmVpbmcgYWRkZWRcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0geyAuLi5ob3RlbFF1ZXJ5IH07XHJcbiAgICBkZWxldGUgc2VhcmNoUXVlcnkuYWR1bHRzO1xyXG5cclxuICAgIGNvbnN0IGRldGFpbFJvb21zOiB7XHJcbiAgICAgIHJhdGVEZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gICAgICByb29tRGVzY3JpcHRpb246IHN0cmluZztcclxuICAgICAgcm9vbUlkOiBzdHJpbmc7XHJcbiAgICAgIHJvb21UeXBlOiBzdHJpbmc7XHJcbiAgICAgIHJhdGVDb2RlOiBzdHJpbmc7XHJcbiAgICAgIGNoZWNrSW46IGFueTtcclxuICAgICAgY2hlY2tPdXQ6IGFueTtcclxuICAgIH1bXSA9IFtdO1xyXG4gICAgZGV0YWlsUm9vbXMucHVzaCh7XHJcbiAgICAgIHJhdGVEZXNjcmlwdGlvbjogaG90ZWxSb29tLnJhdGVEZXNjcmlwdGlvbixcclxuICAgICAgcm9vbURlc2NyaXB0aW9uOiBob3RlbFJvb20ucm9vbURlc2NyaXB0aW9uLFxyXG4gICAgICByb29tSWQ6IGhvdGVsUm9vbS5yb29tSWQsXHJcbiAgICAgIHJvb21UeXBlOiBob3RlbFJvb20ucm9vbVR5cGUsXHJcbiAgICAgIHJhdGVDb2RlOiBob3RlbFJvb20ucmF0ZUNvZGUsXHJcbiAgICAgIGNoZWNrSW46IGhvdGVsUXVlcnkuc3RhcnREYXRlLFxyXG4gICAgICBjaGVja091dDogaG90ZWxRdWVyeS5lbmREYXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgLy8gRU5ULTI0NDcgYWRkIGluIGNodW5rcyB3aXRoIHBlb3BsZSBwZXIgcm9vbVxyXG4gICAgICBjb25zdCBwYXhQZXJSb29tOiBudW1iZXIgPSB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzO1xyXG5cclxuICAgICAgLy8gRU5ULTMwNDggVG8gYmUgY2hhbmdlZCB3aGVuIHRyYXZsbGVycyBmbG93IGFkZGVkXHJcbiAgICAgIGNvbnN0IHJvb21BcnJheSA9IG5ldyBBcnJheSh0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMpLmZpbGwoJ1RFU1QnKTtcclxuICAgICAgY29uc3QgbnVtYmVyVG9TcGxpdCA9IHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyA9PT0gcGF4UGVyUm9vbSA/IDEgOiAyO1xyXG4gICAgICBjb25zdCBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzID0gXy5jaHVuayh0aGlzLnRyYXZlbGxlcnMsIG51bWJlclRvU3BsaXQpO1xyXG4gICAgICBjb25zdCB7IGFkZHJlc3M6IGhvdGVsQWFkZHJlc3MgfSA9IGhvdGVsO1xyXG4gICAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChob3RlbFJvb20sIGhvdGVsUXVlcnkpO1xyXG4gICAgICAvLyBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzLmZvckVhY2goKGNodW5rOiBUcmF2ZWxsZXJbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gcm9vbUFycmF5LnJlZHVjZShcclxuICAgICAgICBhc3luYyAoXHJcbiAgICAgICAgICBjdXJyZW50OiBEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zLFxyXG4gICAgICAgICAgY2h1bms6IFRyYXZlbGxlcltdLFxyXG4gICAgICAgICAgaW5kZXg6IG51bWJlclxyXG4gICAgICAgICk6IFByb21pc2U8RGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucz4gPT4ge1xyXG4gICAgICAgICAgc3dpdGNoIChhd2FpdCBjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jYW5jZWw6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMuY2FuY2VsO1xyXG4gICAgICAgICAgICBjYXNlIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMucmVzZWFyY2g6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMucmVzZWFyY2g7XHJcbiAgICAgICAgICAgIGNhc2UgRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jb250aW51ZTpcclxuICAgICAgICAgICAgY2FzZSBEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zLm5ld0Jhc2tldDpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCB3aCA9IGF3YWl0IHRoaXMuYmFza2V0U2VydmljZS5hZGRUb0Jhc2tldChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGFkdWx0czogbnVtYmVyVG9TcGxpdCxcclxuICAgICAgICAgICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgICAgICAgICAgICBzZXJ2aWNlOiBob3RlbC5zb3VyY2VJZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgaG90ZWxBZGRyZXNzOiB7XHJcbiAgICAgICAgICAgICAgICAgIHN0cmVldE5hbWU6IGhvdGVsQWFkZHJlc3MuYWRkcmVzc0xpbmUxLFxyXG4gICAgICAgICAgICAgICAgICB0b3duOiBob3RlbEFhZGRyZXNzLmFkZHJlc3NMaW5lMixcclxuICAgICAgICAgICAgICAgICAgY291bnR5OiBob3RlbEFhZGRyZXNzLmFkZHJlc3NMaW5lMyxcclxuICAgICAgICAgICAgICAgICAgcG9zdGNvZGU6IGhvdGVsQWFkZHJlc3MucG9zdE9yWmlwQ29kZSxcclxuICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGU6IGhvdGVsQWFkZHJlc3MuY291bnRyeUNvZGVcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3RlbERlc2NyaXB0aW9uOiBob3RlbC5ncm91cCxcclxuICAgICAgICAgICAgICAgIGhvdGVsSWQ6IGhvdGVsLmlkLFxyXG4gICAgICAgICAgICAgICAgaG90ZWxOYW1lOiBob3RlbC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgYWx3YXlzIGJlIDEgYXMgd2UgYm9vayAxIHJvb20gYXMgYSB0aW1lXHJcbiAgICAgICAgICAgICAgICBudW1iZXJPZlJvb21zOiAxLFxyXG4gICAgICAgICAgICAgICAgcm9vbXM6IGRldGFpbFJvb21zLFxyXG4gICAgICAgICAgICAgICAgdGVybXNBbmRDb25kOiB0ZXJtc0FuZENvbmRpdGlvbnNcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIC8vIG5vIGxvbmdlciAqIG5vIG9mIHJvb21zIGFzIGVhY2ggcm9vbSBpcyBhZGRlZCAxIGJ5IDFcclxuICAgICAgICAgICAgICBwcmljZTogaG90ZWxSb29tLnRvdGFsLCAvLyAqIGhvdGVsUXVlcnkucm9vbXMsXHJcbiAgICAgICAgICAgICAgY3VycmVuY3k6IGhvdGVsUm9vbS5jdXJyZW5jeUNvZGUgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgICAgICAgICAgIHNlYXJjaFF1ZXJ5LFxyXG4gICAgICAgICAgICAgIG91dGJvdW5kRGF0ZTogaG90ZWxRdWVyeS5zdGFydERhdGUsXHJcbiAgICAgICAgICAgICAgbG93ZXN0UHJpY2U6IHRoaXMuY2hlYXBlc3RQcmljZT8uYW1vdW50ICE9IGhvdGVsUm9vbS50b3RhbCB8fCB0aGlzLmNoZWFwZXN0UHJpY2U/LmN1cnJlbmN5Q29kZSAhPSBob3RlbFJvb20uY3VycmVuY3lDb2RlID8gXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWFwZXN0UHJpY2U/LmFtb3VudCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgbG93ZXN0UHJpY2VDdXJyZW5jeTogdGhpcy5jaGVhcGVzdFByaWNlPy5hbW91bnQgIT0gaG90ZWxSb29tLnRvdGFsIHx8IHRoaXMuY2hlYXBlc3RQcmljZT8uY3VycmVuY3lDb2RlICE9IGhvdGVsUm9vbS5jdXJyZW5jeUNvZGUgPyBcclxuICAgICAgICAgICAgICAgIDxDdXJyZW5jeUNvZGU+dGhpcy5jaGVhcGVzdFByaWNlPy5jdXJyZW5jeUNvZGUgOiBudWxsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGludEJhc2tldCxcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLFxyXG4gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGFycmF5IG9mIDEgb3IgMiB0cmF2ZWxsZXJzIHdoaWNoIGdvIGluIDEgcm9vbVxyXG4gICAgICAgICAgICAvLyBjaHVua1xyXG4gICAgICAgICAgICBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzW2luZGV4XSB8fCBbXSxcclxuICAgICAgICAgICAgaG90ZWxSb29tLnJlcXVpcmVzUmVhc29uXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHdoID09PSBEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zLnJlc2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVyZm9ybVNlYXJjaCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHdoO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jb250aW51ZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMuY2FuY2VsO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVybXNBbmRDb25kKFxyXG4gICAgaG90ZWxSb29tOiBIb3RlbFJvb20sXHJcbiAgICBob3RlbFF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlc1xyXG4gICkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdSYXRlIEluZm9ybWF0aW9uJyxcclxuICAgICAgICB2YWx1ZTogaG90ZWxSb29tLnJhdGVEZXNjcmlwdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0NhbmNlbGxhdGlvbiBQb2xpY3knLFxyXG4gICAgICAgIHZhbHVlOiBob3RlbFJvb20ucG9saWNpZXMuY2FuY2VsbGF0aW9uXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnUmF0ZSBDb2RlJyxcclxuICAgICAgICB2YWx1ZTogaG90ZWxSb29tLnJhdGVDb2RlXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnUm9vbSBJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IGhvdGVsUm9vbS5yb29tRGVzY3JpcHRpb25cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdEZXBvc2l0IEFtb3VudCcsXHJcbiAgICAgICAgdmFsdWU6XHJcbiAgICAgICAgICAoaG90ZWxSb29tLnRvdGFsICogaG90ZWxRdWVyeS5yb29tcykudG9TdHJpbmcoKSArIGhvdGVsUXVlcnkuY3VycmVuY3lcclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHNhdmVTZWFyY2goaG90ZWxOYW1lOiBzdHJpbmcgPSBudWxsKTogT2JzZXJ2YWJsZTxTYXZlRmF2b3VyaXRlU2VhcmNoUmVzdWx0PiB7XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkLnZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICBjb25zdCBmYXZvdXJpdGVTZWFyY2hRdWVyeSA9IHRoaXMudXBkYXRlU2VyY2hRdWVyeShxdWVyeSk7XHJcbiAgICAgIGlmIChob3RlbE5hbWUpIGZhdm91cml0ZVNlYXJjaFF1ZXJ5LmhvdGVsTmFtZSA9IGhvdGVsTmFtZTtcclxuICAgICAgY29uc3Qgc2VhcmNoSW5mbyA9IHtcclxuICAgICAgICBuYW1lOiBgJHttb21lbnQoKX1gLFxyXG4gICAgICAgIHNlcnZpY2VUeXBlOiBTZXJ2aWNlVHlwZS5Ib3RlbCxcclxuICAgICAgICBzZWFyY2hBcmdzOiBmYXZvdXJpdGVTZWFyY2hRdWVyeVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlLnNhdmVGYXZvdXJpdGVTZWFyY2goc2VhcmNoSW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhcHBseUZhdm91cml0ZShmYXY6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5ub19vZl9vY2N1cGFudHMgPSBmYXYuYWR1bHRzO1xyXG4gICAgdGhpcy5ub19vZl9yb29tcyA9IGZhdi5yb29tcztcclxuICAgIHRoaXMuZGlzdGFuY2UgPSBmYXYuZGlzdGFuY2U7XHJcbiAgICB0aGlzLmN1cnJlbmN5ID0gZmF2LmN1cnJlbmN5O1xyXG4gICAgbGV0IGxvY2F0aW9uOiB7XHJcbiAgICAgIGxhdGl0dWRlOiBudW1iZXI7XHJcbiAgICAgIGxvbmdpdHVkZTogbnVtYmVyO1xyXG4gICAgICBjb3VudHJ5Q29kZTogc3RyaW5nO1xyXG4gICAgICBuYW1lPzogc3RyaW5nO1xyXG4gICAgICB0eXBlPzogc3RyaW5nO1xyXG4gICAgfSA9IHtcclxuICAgICAgbGF0aXR1ZGU6IGZhdi5sYXRpdHVkZSxcclxuICAgICAgbG9uZ2l0dWRlOiBmYXYubG9uZ2l0dWRlLFxyXG4gICAgICBjb3VudHJ5Q29kZTogZmF2LmNvdW50cnlDb2RlLFxyXG4gICAgICBuYW1lOiBmYXYuY2l0eU5hbWVcclxuICAgIH07XHJcbiAgICBpZiAoZmF2LnRyYWluU3RhdGlvbkNvZGUpIGxvY2F0aW9uLnR5cGUgPSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjtcclxuICAgIGVsc2UgaWYgKGZhdi5vZmZpY2VJZCkgbG9jYXRpb24udHlwZSA9IExvY2F0aW9uVHlwZXMuT2ZmaWNlO1xyXG4gICAgZWxzZSBpZiAoZmF2LmlhdGEpIGxvY2F0aW9uLnR5cGUgPSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ7XHJcbiAgICBlbHNlIGlmIChmYXYucG9zdE9yWmlwQ29kZSkgbG9jYXRpb24udHlwZSA9IExvY2F0aW9uVHlwZXMuUG9zdGNvZGU7XHJcbiAgICBlbHNlIGxvY2F0aW9uLnR5cGUgPSBMb2NhdGlvblR5cGVzLkNpdHk7XHJcbiAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XHJcbiAgICB0aGlzLmhvdGVsX25hbWUgPSBmYXYuaG90ZWxOYW1lO1xyXG4gICAgaWYgKGZhdi5ncm91cE5hbWUpIHRoaXMuaG90ZWxfY2hhaW4gPSB7IG5hbWU6IGZhdi5ncm91cE5hbWUgfTtcclxuICAgIGVsc2UgdGhpcy5ob3RlbF9jaGFpbiA9IG51bGw7XHJcbiAgfVxyXG59XHJcbiJdfQ==