@sabstravtech/obtservices 0.0.22050309 → 0.0.26051001
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.
- package/angular/components/basket-panel.d.ts +1 -0
- package/angular/fetchers.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-cancellation-info.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-companies.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-company.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-irl-supplier-station.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +7 -0
- package/angular/lib/vendor/services/enterprise-basket.service.d.ts +5 -3
- package/angular/lib/vendor/services/logon.service.d.ts +2 -1
- package/angular/lib/vendor/services/search.service.d.ts +4 -3
- package/angular/lib/vendor/services/ticket-queue.service.d.ts +6 -0
- package/angular/lib/vendor/services/user.service.d.ts +7 -3
- package/angular/lib/vendor/types/graphql.angular.types.d.ts +354 -90
- package/angular/lib/vendor/updaters/create-guest-updater.d.ts +6 -0
- package/angular/sabstravtech-obtservices-angular.d.ts +0 -1
- package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
- package/angular/services.d.ts +1 -0
- package/angular/updaters.d.ts +1 -0
- package/base/fetchers.d.ts +7 -0
- package/base/interfaces.d.ts +2 -0
- package/base/lib/vendor/classes/base-enterprise.d.ts +5 -1
- package/base/lib/vendor/classes/basket-info-mi-details.impl.d.ts +2 -0
- package/base/lib/vendor/classes/bookable-basket.d.ts +2 -0
- package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +6 -4
- package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +5 -3
- package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +5 -4
- package/base/lib/vendor/classes/fast-track-enterprise-search.d.ts +18 -13
- package/base/lib/vendor/classes/flight-enterprise-search.d.ts +6 -5
- package/base/lib/vendor/classes/helpers.d.ts +6 -1
- package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +8 -4
- package/base/lib/vendor/classes/irl-enterprise-search.d.ts +23 -9
- package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +4 -3
- package/base/lib/vendor/classes/management-info-and-valid.d.ts +7 -2
- package/base/lib/vendor/classes/modal-types.enum.d.ts +2 -0
- package/base/lib/vendor/classes/parking-enterprise-search.d.ts +4 -3
- package/base/lib/vendor/classes/rail-enterprise-search.d.ts +10 -7
- package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +5 -3
- package/base/lib/vendor/fetchers/fast-track-quote.fetcher.d.ts +1 -1
- package/base/lib/vendor/fetchers/get-cancellation-info.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/get-companies.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-company.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/get-irl-supplier-station.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +20 -0
- package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +2 -0
- package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +4 -2
- package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +10 -6
- package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +2 -0
- package/base/lib/vendor/interfaces/Ifast-track-enterprise-search.d.ts +11 -5
- package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +3 -1
- package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +7 -2
- package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +11 -5
- package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +2 -0
- package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +2 -0
- package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +6 -2
- package/base/lib/vendor/interfaces/Isearch.service.d.ts +4 -2
- package/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.d.ts +3 -2
- package/base/lib/vendor/interfaces/Iuser.service.d.ts +3 -1
- package/base/lib/vendor/interfaces/car-hire-search-arg.interface.d.ts +2 -3
- package/base/lib/vendor/interfaces/fast-track-filters.interface.d.ts +4 -0
- package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +2 -0
- package/base/lib/vendor/interfaces/summary-interface.d.ts +4 -0
- package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
- package/base/lib/vendor/models/traveller.object.d.ts +1 -1
- package/base/lib/vendor/services/enterprise-basket.service.d.ts +28 -10
- package/base/lib/vendor/services/logon.service.d.ts +5 -1
- package/base/lib/vendor/services/requires-reason.service.d.ts +20 -0
- package/base/lib/vendor/services/search.service.d.ts +30 -25
- package/base/lib/vendor/services/url.service.d.ts +2 -0
- package/base/lib/vendor/services/user.service.d.ts +21 -5
- package/base/lib/vendor/services/webtoken.service.d.ts +5 -0
- package/base/lib/vendor/types/graphql.types.d.ts +326 -89
- package/base/lib/vendor/types/types.d.ts +44 -17
- package/base/lib/vendor/updaters/create-guest-updater.d.ts +19 -0
- package/base/sabstravtech-obtservices-base.d.ts +1 -1
- package/base/sabstravtech-obtservices-base.metadata.json +1 -1
- package/base/services.d.ts +1 -0
- package/base/updaters.d.ts +1 -0
- package/bundles/sabstravtech-obtservices-angular.umd.js +466 -180
- package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
- package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
- package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
- package/bundles/sabstravtech-obtservices-base.umd.js +4435 -1004
- package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
- package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
- package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
- package/esm2015/angular/components/basket-panel.js +16 -7
- package/esm2015/angular/fetchers.js +8 -1
- package/esm2015/angular/lib/vendor/fetchers/get-cancellation-info.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-companies.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-company.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-irl-supplier-station.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-user-guests.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/services/enterprise-basket.service.js +11 -5
- package/esm2015/angular/lib/vendor/services/http-call.service.js +6 -2
- package/esm2015/angular/lib/vendor/services/logon.service.js +8 -5
- package/esm2015/angular/lib/vendor/services/search.service.js +28 -25
- package/esm2015/angular/lib/vendor/services/ticket-queue.service.js +23 -0
- package/esm2015/angular/lib/vendor/services/user.service.js +21 -9
- package/esm2015/angular/lib/vendor/services/webtoken.service.js +6 -2
- package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +353 -72
- package/esm2015/angular/lib/vendor/updaters/create-guest-updater.js +22 -0
- package/esm2015/angular/obtservices.module.js +3 -1
- package/esm2015/angular/sabstravtech-obtservices-angular.js +1 -2
- package/esm2015/angular/services.js +2 -1
- package/esm2015/angular/updaters.js +2 -1
- package/esm2015/base/fetchers.js +8 -1
- package/esm2015/base/interfaces.js +3 -1
- package/esm2015/base/lib/vendor/classes/base-enterprise.js +8 -2
- package/esm2015/base/lib/vendor/classes/basket-info-mi-details.impl.js +17 -1
- package/esm2015/base/lib/vendor/classes/bookable-basket.js +27 -6
- package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +98 -11
- package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +146 -68
- package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +140 -37
- package/esm2015/base/lib/vendor/classes/fast-track-enterprise-search.js +111 -23
- package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +218 -40
- package/esm2015/base/lib/vendor/classes/helpers.js +24 -4
- package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +191 -48
- package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +271 -27
- package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +59 -11
- package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +13 -9
- package/esm2015/base/lib/vendor/classes/modal-types.enum.js +3 -1
- package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +63 -11
- package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +183 -23
- package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +42 -4
- package/esm2015/base/lib/vendor/fetchers/fast-track-quote.fetcher.js +2 -2
- package/esm2015/base/lib/vendor/fetchers/get-cancellation-info.fetcher.js +10 -0
- package/esm2015/base/lib/vendor/fetchers/get-companies.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-company.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-irl-supplier-station.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-user-guests.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ifast-track-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +2 -1
- package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iuser.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/car-hire-search-arg.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/fast-track-filters.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/summary-interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
- package/esm2015/base/lib/vendor/models/traveller.object.js +1 -1
- package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +154 -45
- package/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +16 -12
- package/esm2015/base/lib/vendor/services/http-call.service.js +1 -1
- package/esm2015/base/lib/vendor/services/logon.service.js +37 -3
- package/esm2015/base/lib/vendor/services/requires-reason.service.js +53 -0
- package/esm2015/base/lib/vendor/services/search.service.js +82 -101
- package/esm2015/base/lib/vendor/services/url.service.js +3 -1
- package/esm2015/base/lib/vendor/services/user.service.js +64 -9
- package/esm2015/base/lib/vendor/services/webtoken.service.js +16 -5
- package/esm2015/base/lib/vendor/types/graphql.types.js +15 -2
- package/esm2015/base/lib/vendor/types/types.js +1679 -21
- package/esm2015/base/lib/vendor/updaters/create-guest-updater.js +11 -0
- package/esm2015/base/sabstravtech-obtservices-base.js +1 -1
- package/esm2015/base/services.js +2 -1
- package/esm2015/base/updaters.js +2 -1
- package/fesm2015/sabstravtech-obtservices-angular.js +570 -148
- package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
- package/fesm2015/sabstravtech-obtservices-base.js +3725 -466
- package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,7 +4,7 @@ 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';
|
|
@@ -18,13 +18,12 @@ const CLIENT_PREFERRED_VALUE = 1;
|
|
|
18
18
|
const AGENT_PREFERRED_VALUE = 2;
|
|
19
19
|
export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
20
20
|
constructor(hotelFetcher, helpers, userService, environment, avaliabilityService, basketService, storageService, searchService, httpCallService, quickListFetcher, getRailStationFetcher, applyHotelRulesFetcher) {
|
|
21
|
-
super(storageService, helpers);
|
|
21
|
+
super(storageService, helpers, searchService);
|
|
22
22
|
this.hotelFetcher = hotelFetcher;
|
|
23
23
|
this.userService = userService;
|
|
24
24
|
this.environment = environment;
|
|
25
25
|
this.avaliabilityService = avaliabilityService;
|
|
26
26
|
this.basketService = basketService;
|
|
27
|
-
this.searchService = searchService;
|
|
28
27
|
this.httpCallService = httpCallService;
|
|
29
28
|
this.quickListFetcher = quickListFetcher;
|
|
30
29
|
this.getRailStationFetcher = getRailStationFetcher;
|
|
@@ -33,6 +32,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
33
32
|
this.location_types = new BehaviorSubject([]);
|
|
34
33
|
this.offices = new BehaviorSubject([]);
|
|
35
34
|
this.lastActivePage = new BehaviorSubject(null);
|
|
35
|
+
this.jitRulesReceived = new BehaviorSubject(false);
|
|
36
36
|
this.galleries = {};
|
|
37
37
|
this.occupied = 0;
|
|
38
38
|
this.results_details = {
|
|
@@ -95,7 +95,8 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
95
95
|
this.hasPreferred(hotel) &&
|
|
96
96
|
this.breakfastTypeFilter(hotel) &&
|
|
97
97
|
this.getExtraFilter(hotel) &&
|
|
98
|
-
this.getAmenitiesFilter(hotel)
|
|
98
|
+
this.getAmenitiesFilter(hotel) &&
|
|
99
|
+
this.accessibleRoomTypeFilter(hotel));
|
|
99
100
|
});
|
|
100
101
|
this.results.next(this.resultsFilterMethod(this.fullResults));
|
|
101
102
|
};
|
|
@@ -129,6 +130,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
129
130
|
this.results_details.chains.add(hotelResult.group);
|
|
130
131
|
});
|
|
131
132
|
this.fullResults = results;
|
|
133
|
+
this.jitRulesReceived.next(false);
|
|
132
134
|
this.results.next(results);
|
|
133
135
|
this._isValid();
|
|
134
136
|
this.userService.changeUser.subscribe((user) => {
|
|
@@ -326,6 +328,9 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
326
328
|
get max_occupant_array() {
|
|
327
329
|
return this._max_occupant_array;
|
|
328
330
|
}
|
|
331
|
+
get max_no_of_rooms() {
|
|
332
|
+
return this._max_no_of_rooms;
|
|
333
|
+
}
|
|
329
334
|
get distance_list() {
|
|
330
335
|
return this._distance_list;
|
|
331
336
|
}
|
|
@@ -385,6 +390,15 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
385
390
|
}
|
|
386
391
|
return hotel;
|
|
387
392
|
});
|
|
393
|
+
travleResults.forEach((hotel) => {
|
|
394
|
+
if (hotel.availableRates) {
|
|
395
|
+
hotel.jitRemoveResultRule = false;
|
|
396
|
+
this.jitRulesReceived.next(true);
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
hotel.jitRemoveResultRule = true;
|
|
400
|
+
}
|
|
401
|
+
});
|
|
388
402
|
this.results.next(travleResults);
|
|
389
403
|
});
|
|
390
404
|
}
|
|
@@ -489,7 +503,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
489
503
|
// Calculating Occupancy
|
|
490
504
|
const occupancy = this.no_of_occupants / this.no_of_rooms;
|
|
491
505
|
if (!(occupancy === 1 || occupancy === 2)) {
|
|
492
|
-
this.validationMessages.push('Occupants per room must be 1 or 2
|
|
506
|
+
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');
|
|
493
507
|
}
|
|
494
508
|
console.log(this.validationMessages);
|
|
495
509
|
this.isValid.next(this.validationMessages.length === 0);
|
|
@@ -497,6 +511,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
497
511
|
}
|
|
498
512
|
startSearch() {
|
|
499
513
|
this.results.next([]);
|
|
514
|
+
this.jitRulesReceived.next(false);
|
|
500
515
|
this.avaliabilityService.reset();
|
|
501
516
|
if (this.isValid.value) {
|
|
502
517
|
this._originalUserSearch = Object.freeze(this.helpers.clone(this.tempParams));
|
|
@@ -605,7 +620,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
605
620
|
break;
|
|
606
621
|
case LocationTypes.TrainStation:
|
|
607
622
|
this.getRailStationByCode(recentSearch.searchArgs.trainStationCode).subscribe((trainsStation) => {
|
|
608
|
-
this.trainsStation = trainsStation;
|
|
623
|
+
this.trainsStation = Object.assign(Object.assign({}, trainsStation), { type: LocationTypes.TrainStation });
|
|
609
624
|
this.searchService.startSearches();
|
|
610
625
|
});
|
|
611
626
|
break;
|
|
@@ -776,31 +791,40 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
776
791
|
breakfastTypeFilter(hotel) {
|
|
777
792
|
if (!this.filters.breakfastType.length)
|
|
778
793
|
return true;
|
|
779
|
-
const
|
|
780
|
-
if (!
|
|
794
|
+
const hotelObjectValue = this.getHotelObjectValue(hotel);
|
|
795
|
+
if (!hotelObjectValue || !(hotelObjectValue === null || hotelObjectValue === void 0 ? void 0 : hotelObjectValue.rooms))
|
|
781
796
|
return false;
|
|
782
|
-
const hotelObjectValue = hotelObject.value;
|
|
783
797
|
const isBreakfastIncluded = this.filters.breakfastType.includes(SearchHandler.BREAKFAST_INCLUDED);
|
|
784
798
|
const isBreakfastExcluded = this.filters.breakfastType.includes(SearchHandler.BREAKFAST_NOT_INCLUDED);
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
799
|
+
const breakfastMatches = hotelObjectValue.rooms.filter((rooms) => {
|
|
800
|
+
if (isBreakfastIncluded && isBreakfastExcluded) {
|
|
801
|
+
return rooms;
|
|
802
|
+
}
|
|
803
|
+
else if (isBreakfastIncluded) {
|
|
804
|
+
return (rooms.rateDescription.match(includedExpression) &&
|
|
805
|
+
!rooms.rateDescription.match(excludedExpression));
|
|
806
|
+
}
|
|
807
|
+
else if (isBreakfastExcluded) {
|
|
808
|
+
return (!rooms.rateDescription.match(includedExpression) ||
|
|
809
|
+
rooms.rateDescription.match(excludedExpression));
|
|
810
|
+
}
|
|
811
|
+
});
|
|
812
|
+
return !!breakfastMatches.length;
|
|
813
|
+
}
|
|
814
|
+
accessibleRoomTypeFilter(hotel) {
|
|
815
|
+
if (!this.filters.accessibleRoomType.length)
|
|
816
|
+
return true;
|
|
817
|
+
const hotelObjectValue = this.getHotelObjectValue(hotel);
|
|
818
|
+
if (!hotelObjectValue || !(hotelObjectValue === null || hotelObjectValue === void 0 ? void 0 : hotelObjectValue.rooms))
|
|
802
819
|
return false;
|
|
803
|
-
|
|
820
|
+
const matches = hotelObjectValue.rooms.filter((rooms) => rooms.rateDescription.match(includedAccessibilityExpression) ||
|
|
821
|
+
rooms.roomDescription.match(includedAccessibilityExpression) ||
|
|
822
|
+
rooms.roomType.match(includedAccessibilityExpression));
|
|
823
|
+
return !!matches.length;
|
|
824
|
+
}
|
|
825
|
+
getHotelObjectValue(hotel) {
|
|
826
|
+
const hotelObject = this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotel), hotel);
|
|
827
|
+
return !hotelObject && !hotelObject.value ? null : hotelObject.value;
|
|
804
828
|
}
|
|
805
829
|
byMostExpensive() {
|
|
806
830
|
this.sortByPrice(false);
|
|
@@ -909,36 +933,117 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
909
933
|
this.localFilters.hotelName = '';
|
|
910
934
|
this.localFilters.breakfastType = [];
|
|
911
935
|
}
|
|
936
|
+
updateSearchFromExpiredBasketItem(basketItem) {
|
|
937
|
+
var _a, _b, _c, _d;
|
|
938
|
+
const searchHotelQuery = basketItem.searchQuery;
|
|
939
|
+
this.currency = searchHotelQuery.currency;
|
|
940
|
+
this.distance = searchHotelQuery.distance;
|
|
941
|
+
this.no_of_rooms = searchHotelQuery.rooms;
|
|
942
|
+
this.checkin_date = moment(searchHotelQuery.startDate);
|
|
943
|
+
this.checkout_date = moment(searchHotelQuery.endDate);
|
|
944
|
+
this.hotel_name = searchHotelQuery.hotelName;
|
|
945
|
+
if (searchHotelQuery.groupName) {
|
|
946
|
+
this.hotel_chain = {
|
|
947
|
+
name: searchHotelQuery.groupName
|
|
948
|
+
};
|
|
949
|
+
}
|
|
950
|
+
if (searchHotelQuery.iata) {
|
|
951
|
+
this.location_type_select = LocationTypes.Airport;
|
|
952
|
+
this.searchService
|
|
953
|
+
.getAirportByCode(searchHotelQuery.iata)
|
|
954
|
+
.subscribe((iata) => {
|
|
955
|
+
const airport = {
|
|
956
|
+
airport: {
|
|
957
|
+
gateway: iata.iataMatch.iata
|
|
958
|
+
}
|
|
959
|
+
};
|
|
960
|
+
this.location = Object.assign(Object.assign({}, airport), iata.iataMatch);
|
|
961
|
+
});
|
|
962
|
+
}
|
|
963
|
+
else if (searchHotelQuery.latitude && searchHotelQuery.longitude) {
|
|
964
|
+
this.location_type_select = LocationTypes.City;
|
|
965
|
+
this.location = {
|
|
966
|
+
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 : '',
|
|
967
|
+
latitude: searchHotelQuery.latitude,
|
|
968
|
+
longitude: searchHotelQuery.longitude
|
|
969
|
+
};
|
|
970
|
+
}
|
|
971
|
+
else if (searchHotelQuery.postOrZipCode) {
|
|
972
|
+
this.location_type_select = LocationTypes.Postcode;
|
|
973
|
+
this.postcode = {
|
|
974
|
+
name: searchHotelQuery.postOrZipCode,
|
|
975
|
+
type: LocationTypes.Postcode
|
|
976
|
+
};
|
|
977
|
+
}
|
|
978
|
+
else if (searchHotelQuery.officeId) {
|
|
979
|
+
this.location_type_select = LocationTypes.Office;
|
|
980
|
+
this.searchService
|
|
981
|
+
.getOffice(searchHotelQuery.officeId)
|
|
982
|
+
.pipe(take(1))
|
|
983
|
+
.subscribe((office) => {
|
|
984
|
+
this.office = {
|
|
985
|
+
id: office.id,
|
|
986
|
+
name: office.name
|
|
987
|
+
};
|
|
988
|
+
});
|
|
989
|
+
}
|
|
990
|
+
else if (searchHotelQuery.trainStationCode) {
|
|
991
|
+
this.location_type_select = LocationTypes.TrainStation;
|
|
992
|
+
this.getRailStationByCode(searchHotelQuery.trainStationCode).subscribe((trainsStation) => {
|
|
993
|
+
this.trainsStation = Object.assign(Object.assign({}, trainsStation), { type: LocationTypes.TrainStation });
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
else if (searchHotelQuery.countryCode) {
|
|
997
|
+
this.location_type_select = LocationTypes.Shortlist;
|
|
998
|
+
this.country = {
|
|
999
|
+
cCode: searchHotelQuery.countryCode,
|
|
1000
|
+
cName: ''
|
|
1001
|
+
};
|
|
1002
|
+
}
|
|
1003
|
+
// add Travellers
|
|
1004
|
+
if (basketItem.users) {
|
|
1005
|
+
basketItem.users.forEach((user) => {
|
|
1006
|
+
this.searchService.addTraveller(user);
|
|
1007
|
+
});
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
912
1010
|
updateFromPreviousSearches(previousItems) {
|
|
913
1011
|
var _a, _b;
|
|
914
|
-
console.log(
|
|
1012
|
+
console.log('PREPOPULATING HOTEL FORM');
|
|
915
1013
|
const flightItem = (_a = previousItems[ServiceType.Flight]) === null || _a === void 0 ? void 0 : _a.searchQuery;
|
|
916
1014
|
const railItem = (_b = previousItems[ServiceType.Rail]) === null || _b === void 0 ? void 0 : _b.searchQuery;
|
|
917
1015
|
if (flightItem) {
|
|
918
1016
|
try {
|
|
919
1017
|
this.location_type_select = LocationTypes.Airport;
|
|
920
|
-
this.checkin_date =
|
|
921
|
-
|
|
1018
|
+
this.checkin_date =
|
|
1019
|
+
this.searchService.searches[ServiceType.Flight].outBoundDate;
|
|
1020
|
+
this.checkout_date =
|
|
1021
|
+
this.searchService.searches[ServiceType.Flight].inboundDate;
|
|
922
1022
|
this.location = {
|
|
923
|
-
name: this.searchService.searches[ServiceType.Flight]
|
|
1023
|
+
name: this.searchService.searches[ServiceType.Flight]
|
|
1024
|
+
.arriveLocation.destination,
|
|
924
1025
|
type: 'Airport',
|
|
925
1026
|
airport: this.searchService.searches[ServiceType.Flight].arriveLocation
|
|
926
1027
|
};
|
|
927
1028
|
}
|
|
928
1029
|
catch (_c) {
|
|
929
|
-
console.error(
|
|
1030
|
+
console.error('Error trying to prepopulate hotel from flight item');
|
|
930
1031
|
}
|
|
931
1032
|
}
|
|
932
1033
|
else if (railItem) {
|
|
933
1034
|
try {
|
|
934
1035
|
this.location_type_select = LocationTypes.TrainStation;
|
|
935
|
-
this.checkin_date =
|
|
936
|
-
|
|
937
|
-
this.
|
|
938
|
-
|
|
1036
|
+
this.checkin_date =
|
|
1037
|
+
this.searchService.searches[ServiceType.Rail].outBoundDateTime;
|
|
1038
|
+
this.checkout_date =
|
|
1039
|
+
this.searchService.searches[ServiceType.Rail].inBoundDateTime;
|
|
1040
|
+
this.trainsStation = this.searchService.searches[ServiceType.Rail]
|
|
1041
|
+
.travellingTo;
|
|
1042
|
+
this.location = this.searchService.searches[ServiceType.Rail]
|
|
1043
|
+
.travellingTo;
|
|
939
1044
|
}
|
|
940
1045
|
catch (_d) {
|
|
941
|
-
console.error(
|
|
1046
|
+
console.error('Error trying to prepopulate hotel from rail item');
|
|
942
1047
|
}
|
|
943
1048
|
}
|
|
944
1049
|
}
|
|
@@ -1110,7 +1215,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1110
1215
|
console.log(hotelRoom);
|
|
1111
1216
|
console.log(hotelQuery);
|
|
1112
1217
|
if (hotel.unavailable) {
|
|
1113
|
-
return
|
|
1218
|
+
return DifferentInvokdedUserReasons.cancel;
|
|
1114
1219
|
}
|
|
1115
1220
|
// modify the 'startDate' and 'endDate' properties to have ISO format
|
|
1116
1221
|
hotelQuery.startDate = new Date(hotelQuery.startDate).toISOString();
|
|
@@ -1140,8 +1245,17 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1140
1245
|
const { address: hotelAaddress } = hotel;
|
|
1141
1246
|
const termsAndConditions = this.getTermsAndCond(hotelRoom, hotelQuery);
|
|
1142
1247
|
// bookedTravellersChunks.forEach((chunk: Traveller[], index: number) => {
|
|
1143
|
-
roomArray.
|
|
1144
|
-
|
|
1248
|
+
return roomArray.reduce((current, chunk, index) => __awaiter(this, void 0, void 0, function* () {
|
|
1249
|
+
switch (yield current) {
|
|
1250
|
+
case DifferentInvokdedUserReasons.cancel:
|
|
1251
|
+
return DifferentInvokdedUserReasons.cancel;
|
|
1252
|
+
case DifferentInvokdedUserReasons.research:
|
|
1253
|
+
return DifferentInvokdedUserReasons.research;
|
|
1254
|
+
case DifferentInvokdedUserReasons.continue:
|
|
1255
|
+
case DifferentInvokdedUserReasons.newBasket:
|
|
1256
|
+
break;
|
|
1257
|
+
}
|
|
1258
|
+
const wh = yield this.basketService.addToBasket({
|
|
1145
1259
|
adults: numberToSplit,
|
|
1146
1260
|
basket: basket.id,
|
|
1147
1261
|
service: hotel.sourceId.toString(),
|
|
@@ -1169,14 +1283,14 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1169
1283
|
}, intBasket, this.searchService,
|
|
1170
1284
|
// this is an array of 1 or 2 travellers which go in 1 room
|
|
1171
1285
|
// chunk
|
|
1172
|
-
bookedTravellersChunks[index] || []);
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
return Promise.resolve(true);
|
|
1286
|
+
bookedTravellersChunks[index] || [], hotelRoom.requiresReason);
|
|
1287
|
+
if (wh === DifferentInvokdedUserReasons.research) {
|
|
1288
|
+
this.performSearch();
|
|
1176
1289
|
}
|
|
1177
|
-
|
|
1290
|
+
return wh;
|
|
1291
|
+
}), DifferentInvokdedUserReasons.continue);
|
|
1178
1292
|
}
|
|
1179
|
-
return
|
|
1293
|
+
return DifferentInvokdedUserReasons.cancel;
|
|
1180
1294
|
});
|
|
1181
1295
|
}
|
|
1182
1296
|
getTermsAndCond(hotelRoom, hotelQuery) {
|
|
@@ -1217,8 +1331,37 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1217
1331
|
return this.searchService.saveFavouriteSearch(searchInfo);
|
|
1218
1332
|
}
|
|
1219
1333
|
}
|
|
1334
|
+
applyFavourite(fav) {
|
|
1335
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1336
|
+
this.no_of_occupants = fav.adults;
|
|
1337
|
+
this.no_of_rooms = fav.rooms;
|
|
1338
|
+
this.distance = fav.distance;
|
|
1339
|
+
this.currency = fav.currency;
|
|
1340
|
+
let location = {
|
|
1341
|
+
latitude: fav.latitude,
|
|
1342
|
+
longitude: fav.longitude,
|
|
1343
|
+
countryCode: fav.countryCode,
|
|
1344
|
+
name: fav.cityName
|
|
1345
|
+
};
|
|
1346
|
+
if (fav.trainStationCode)
|
|
1347
|
+
location.type = LocationTypes.TrainStation;
|
|
1348
|
+
else if (fav.officeId)
|
|
1349
|
+
location.type = LocationTypes.Office;
|
|
1350
|
+
else if (fav.iata)
|
|
1351
|
+
location.type = LocationTypes.Airport;
|
|
1352
|
+
else if (fav.postOrZipCode)
|
|
1353
|
+
location.type = LocationTypes.Postcode;
|
|
1354
|
+
else
|
|
1355
|
+
location.type = LocationTypes.City;
|
|
1356
|
+
this.location = location;
|
|
1357
|
+
this.hotel_name = fav.hotelName;
|
|
1358
|
+
if (fav.groupName)
|
|
1359
|
+
this.hotel_chain = { name: fav.groupName };
|
|
1360
|
+
else
|
|
1361
|
+
this.hotel_chain = null;
|
|
1362
|
+
});
|
|
1363
|
+
}
|
|
1220
1364
|
}
|
|
1221
|
-
HotelEnterpriseSearch.MAX_HOTEL_ROOMS = 4;
|
|
1222
1365
|
HotelEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_hotel';
|
|
1223
1366
|
HotelEnterpriseSearch.STORAGE_SESSION_RESULTS = 'results_hotel';
|
|
1224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsZUFBZSxFQUFRLEVBQUUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUlMLGFBQWEsRUFJYixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFPZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFLTCxhQUFhLEVBU2IsV0FBVyxFQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFpQmhDLE9BQU8sRUFJTCxZQUFZLEVBRVosU0FBUyxFQUVWLE1BQU0sd0NBQXdDLENBQUM7QUFpQmhELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixNQUFNLENBQU4sSUFBWSxjQUlYO0FBSkQsV0FBWSxjQUFjO0lBQ3hCLHVDQUFxQixDQUFBO0lBQ3JCLCtCQUFhLENBQUE7SUFDYixpQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxjQUFjLEtBQWQsY0FBYyxRQUl6QjtBQUVELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sT0FBTyxxQkFPWCxTQUFRLG9CQUlQO0lBNlNELFlBQ1UsWUFBeUMsRUFDakQs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SyxFQUNILENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLFFBQVE7YUFDeEU7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELFVBQVUsQ0FBQyxZQUFvQixJQUFJO1FBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELElBQUksU0FBUztnQkFBRSxvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzFELE1BQU0sVUFBVSxHQUFHO2dCQUNqQixJQUFJLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRTtnQkFDbkIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxLQUFLO2dCQUM5QixVQUFVLEVBQUUsb0JBQW9CO2FBQ2pDLENBQUE7WUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDOztBQXYvQ2UscUNBQWUsR0FBRyxDQUFDLENBQUM7QUFDcEIsNENBQXNCLEdBQUcsY0FBYyxDQUFDO0FBQ3hDLDZDQUF1QixHQUFHLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQmFzZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuL2Jhc2UtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IEJhc2VTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4vaGVscGVycyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbSwgb2YsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCYXNlRW52aXJvbm1lbnQgfSBmcm9tICcuL2Vudmlyb21lbnQnO1xyXG5pbXBvcnQgeyBCYXNlSG90ZWxBdmFsaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ob3RlbC1hdmFsbGliaWxpdHkuc2VydmljZSc7XHJcbmltcG9ydCB7IFVSTFMgfSBmcm9tICcuLy4uL3NlcnZpY2VzL3VybC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBDb3VudHJ5LFxyXG4gIEhvdGVsUXVvdGVSZXN1bHQsXHJcbiAgSG90ZWxRdW90ZVJlc3VsdEFycmF5LFxyXG4gIExvY2F0aW9uVHlwZXMsXHJcbiAgTmdiRGF0ZVN0cnVjdCxcclxuICBMb2NhdGlvbkRldGFpbHMsXHJcbiAgSG90ZWxBdmFsaWJpbGl0eVF1b3RlUmVzdWx0LFxyXG4gIGluY2x1ZGVkRXhwcmVzc2lvbixcclxuICBleGNsdWRlZEV4cHJlc3Npb24sXHJcbiAgU2VhcmNoSGFuZGxlcixcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgQWlycG9ydFNlYXJjaFJlc3VsdHMsXHJcbiAgSG90ZWxEZXRhaWxzLFxyXG4gIEhvdGVsRGV0YWlsc0FycmF5LFxyXG4gIFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHQsXHJcbiAgT0JUQWlycG9ydERldGFpbHNcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQmFza2V0SXRlbSxcclxuICBDb25mZXJtYU9mZmljZU5hbWVzLFxyXG4gIENvbmZlcm1hT2ZmaWNlSW5mbyxcclxuICBDdXJyZW5jeUNvZGUsXHJcbiAgRGlzdGFuY2VUeXBlcyxcclxuICBIb3RlbExvY2F0aW9uLFxyXG4gIEhvdGVsUm9vbSxcclxuICBIb3RlbFRhZyxcclxuICBSYWlsU3RhdGlvbixcclxuICBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VhcmNoUmFpbFF1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlcnZpY2VUeXBlXHJcbn0gZnJvbSAnLi4vdHlwZXMvZ3JhcGhxbC50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUhvdGVsUXVvdGVGZXRjaGVyLFxyXG4gIEhvdGVsUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2hvdGVsLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEZ1bGxVc2VyRGV0YWlscyxcclxuICBVc2VyU2VydmljZUludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSXVzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdEh0dHBDYWxsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2h0dHAtY2FsbC5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCB7IEhvdGVsQXZhbGluaWxpdHlGZXRjaGVyVHlwZSB9IGZyb20gJy4uL2ZldGNoZXJzL2hvdGVsLWF2YWxpYWJpbGl0eS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICBJbnRlcm5hbEJhc2tldEludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWVudGVycHJpc2UtYmFza2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEF2YWlsYWJpbGl0eU9iamVjdCxcclxuICBEaXNwbGF5RmlsdGVyU2V0dGluZ3MsXHJcbiAgSG90ZWxFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlLFxyXG4gIEhvdGVsRmlsdGVycyxcclxuICBIb3RlbFRlbXBQYXJhbXMsXHJcbiAgSG90ZWxWaWV3LFxyXG4gIFJlc3VsdERldGFpbHNcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lob3RlbC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IElDaGVhcGVzdFByaWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVhcGVzdC1wcmljZSc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyLFxyXG4gIENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9jb25mZXJtYS1xdWlja2xpc3QuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldFJhaWxTdGF0aW9uRmV0Y2hlcixcclxuICBHZXRSYWlsU3RhdGlvbkZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LXJhaWwtc3RhdGlvbi5mZXRjaGVyJztcclxuaW1wb3J0IHsgSG90ZWxSZWNlbnRTZWFyY2hBcmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ob3RlbC1yZWNlbnQtc2VhcmNoLWFyZ3MuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgcmVzdWx0IH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHtcclxuICBBcHBseUhvdGVsUnVsZXNGZXRjaGVyVHlwZSxcclxuICBCYXNlSG90ZWxSdWxlc0ZldGNoZXJcclxufSBmcm9tICcuLi9mZXRjaGVycy9hcHBseS1KSVQtaG90ZWwtcnVsZXMuZmV0Y2hlcic7XHJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XHJcblxyXG5leHBvcnQgZW51bSBTb3J0VHlwZXNIb3RlbCB7XHJcbiAgZGlzdGFuY2UgPSAnZGlzdGFuY2UnLFxyXG4gIG5hbWUgPSAnbmFtZScsXHJcbiAgcHJpY2UgPSAncHJpY2UnXHJcbn1cclxuXHJcbmNvbnN0IENMSUVOVF9QUkVGRVJSRURfVkFMVUUgPSAxO1xyXG5jb25zdCBBR0VOVF9QUkVGRVJSRURfVkFMVUUgPSAyO1xyXG5cclxuZXhwb3J0IGNsYXNzIEhvdGVsRW50ZXJwcmlzZVNlYXJjaDxcclxuICBIUV9RIGV4dGVuZHMgSG90ZWxRdW90ZUZldGNoZXJUeXBlLFxyXG4gIEhBX1EgZXh0ZW5kcyBIb3RlbEF2YWxpbmlsaXR5RmV0Y2hlclR5cGUsXHJcbiAgUUxfUSBleHRlbmRzIENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlclR5cGUsXHJcbiAgR1JTX1EgZXh0ZW5kcyBHZXRSYWlsU3RhdGlvbkZldGNoZXJUeXBlLFxyXG4gIEhSX1EgZXh0ZW5kcyBBcHBseUhvdGVsUnVsZXNGZXRjaGVyVHlwZVxyXG4gID5cclxuICBleHRlbmRzIEJhc2VFbnRlcnByaXNlU2VhcmNoPFxyXG4gIEhvdGVsVGVtcFBhcmFtcyxcclxuICBIb3RlbFF1b3RlUmVzdWx0QXJyYXksXHJcbiAgSG90ZWxEZXRhaWxzQXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBIb3RlbEVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2Uge1xyXG4gIHN0YXRpYyByZWFkb25seSBNQVhfSE9URUxfUk9PTVMgPSA0O1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUEFSQU1TID0gJ3NlYXJjaF9ob3RlbCc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTID0gJ3Jlc3VsdHNfaG90ZWwnO1xyXG5cclxuICBwdWJsaWMgdHlwZTogU2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5Ib3RlbDtcclxuICBwcml2YXRlIHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdO1xyXG4gIHB1YmxpYyBsb2NhdGlvbl90eXBlczogQmVoYXZpb3JTdWJqZWN0PExvY2F0aW9uVHlwZXNbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgTG9jYXRpb25UeXBlc1tdXHJcbiAgPihbXSk7XHJcbiAgcHVibGljIG9mZmljZXM6IEJlaGF2aW9yU3ViamVjdDxMb2NhdGlvblR5cGVzW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcclxuICAgIExvY2F0aW9uVHlwZXNbXVxyXG4gID4oW10pO1xyXG4gIHB1YmxpYyBsYXN0QWN0aXZlUGFnZTogQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xyXG5cclxuICByZWFkb25seSBnYWxsZXJpZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xyXG4gIHByaXZhdGUgb2NjdXBpZWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSByZXN1bHRzX2RldGFpbHM6IFJlc3VsdERldGFpbHMgPSB7XHJcbiAgICBjaGFpbnM6IG5ldyBTZXQ8c3RyaW5nPigpLFxyXG4gICAgYW1lbml0aWVzOiBbXSxcclxuICAgIG1heERpc3RhbmNlOiAwXHJcbiAgfTtcclxuICBwcml2YXRlIF9jaGVja2luX2RhdGVfbmdiOiBOZ2JEYXRlU3RydWN0O1xyXG4gIHByaXZhdGUgX2NoZWNrb3V0X2RhdGVfbmdiOiBOZ2JEYXRlU3RydWN0O1xyXG4gIHByaXZhdGUgX2Jvb2tlZFRyYXZlbGxlcnM6IFRyYXZlbGxlcltdID0gW107XHJcblxyXG4gIGdldCBjaGFpbnMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnJlc3VsdHNfZGV0YWlscy5jaGFpbnNdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFtZW5pdGllcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMucmVzdWx0c19kZXRhaWxzLmFtZW5pdGllc107XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4RGlzdGFuY2UoKTogbnVtYmVyIHtcclxuICAgIHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlLm1heCA9IE1hdGguY2VpbChcclxuICAgICAgTWF0aC5tYXguYXBwbHkoXHJcbiAgICAgICAgTWF0aCxcclxuICAgICAgICB0aGlzLnJlc3VsdHMudmFsdWUubWFwKChvKSA9PiBvLmxvY2F0aW9uLmRpc3RhbmNlKVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2UgPSB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZS5tYXg7XHJcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2U7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4UHJpY2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UubWF4KTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeTtcclxuICB9XHJcblxyXG4gIHNldCBjdXJyZW5jeSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3kgPSB2YWx1ZTtcclxuICB9XHJcbiAgLy8gRXZlbnQgRW1pdHRlcnNcclxuICBwdWJsaWMgZmlsdGVyQ2hhbmdlOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIHB1YmxpYyBzZWxlY3RJdGVtTWFwVmlldzogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHVibGljIGRpc3BsYXk6IERpc3BsYXlGaWx0ZXJTZXR0aW5ncyA9IHtcclxuICAgIG1pbnByaWNlOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXHJcbiAgICBtYXhwcmljZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgZmlsdGVyczoge1xyXG4gICAgICBicmVha2Zhc3RUeXBlOiBbXVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vIHB1YmxpYyB2YXJpYWJsZXNcclxuICBwdWJsaWMgbWluX2RhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsIC8vIG5nYkRhdGUgbW9udGhzIGFyZSBub3QgMCBpbmRleGVkXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtaW5fcmV0dXJuX2RhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsIC8vIG5nYkRhdGUgbW9udGhzIGFyZSBub3QgMCBpbmRleGVkXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKSArIDEgLy8gbWluIDEgbmlnaHQgc3RheVxyXG4gIH07XHJcblxyXG4gIC8vIHByaXZhdGUgdmFyaWFibGVzXHJcbiAgLy8gZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aW1lcyBoZXJlIC0gbWF5YmUgbm9ybWFsaXNlIHRoZXNlIGluIHRoZSByZXF1ZXN0IGJvZHk/XHJcblxyXG4gIHByaXZhdGUgbG9jYWxGaWx0ZXJzID0gbmV3IEhvdGVsRmlsdGVycygpO1xyXG5cclxuICBwdWJsaWMgY3VycmVudFZpZXc6IEhvdGVsVmlldyA9IEhvdGVsVmlldy5MSVNUO1xyXG5cclxuICAvLyBGb3IgTmdGb3Jpbmcgb3ZlciBpbiB0aGUgdGVtcGxhdGVzXHJcbiAgcHJpdmF0ZSBfbWF4X25vX29mX3Jvb21zID0gNDtcclxuICBwcml2YXRlIF9tYXhfcm9vbXNfYXJyYXkgPSBuZXcgQXJyYXkodGhpcy5fbWF4X25vX29mX3Jvb21zKS5maWxsKDApO1xyXG4gIHByaXZhdGUgX21heF9ub19vZl9vY2N1cGFudHMgPSA4O1xyXG4gIHByaXZhdGUgX21heF9vY2N1cGFudF9hcnJheSA9IG5ldyBBcnJheSh0aGlzLl9tYXhfbm9fb2Zfb2NjdXBhbnRzKS5maWxsKDApO1xyXG4gIHByaXZhdGUgX2Rpc3RhbmNlX2xpc3QgPSBbMSwgMiwgNSwgMTAsIDIwLCAyNV07IC8vIGNvcGllZCBmcm9tIG9sZCBmcm9udGVuZCBmb3Igbm93XHJcbiAgcHJpdmF0ZSBfZGVmYXVsdF9jdXJyZW5jeTogYW55ID0gbnVsbDtcclxuXHJcbiAgLy8gZ2V0dGVycyBhbmQgc2V0dGVyc1xyXG5cclxuICBnZXQgY2hlY2tpbl9kYXRlX25nYigpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVja2luX2RhdGVfbmdiO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNraW5fZGF0ZV9uZ2IodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX2NoZWNraW5fZGF0ZV9uZ2IgPSB2YWx1ZTtcclxuXHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHZhbHVlKTtcclxuICAgIHRoaXMuY2hlY2tpbl9kYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBjaGVja291dF9kYXRlX25nYigpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVja291dF9kYXRlX25nYjtcclxuICB9XHJcblxyXG4gIHNldCBjaGVja291dF9kYXRlX25nYih2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5fY2hlY2tvdXRfZGF0ZV9uZ2IgPSB2YWx1ZTtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHZhbHVlKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaGVja2luX2RhdGUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBjaGVja2luX2RhdGUobmV3RGF0ZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgaWYgKG5ld0RhdGUgJiYgbmV3RGF0ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZSA9IG1vbWVudChuZXdEYXRlKTtcclxuICAgICAgdGhpcy5fY2hlY2tpbl9kYXRlX25nYiA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlKTtcclxuICAgICAgaWYgKG5ld0RhdGUuaXNTYW1lT3JCZWZvcmUodGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja291dF9kYXRlID0gbW9tZW50KG5ld0RhdGUpLmFkZCgxLCAnZGF5Jyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNrb3V0X2RhdGUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hlY2tvdXRfZGF0ZShuZXdEYXRlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICAvLyBpZiAobmV3RGF0ZS5pc1NhbWVPckJlZm9yZSh0aGlzLmNoZWNraW5fZGF0ZSkpIHsgIC8vIG5vdCBhbGxvd2VkXHJcbiAgICAvLyAgIHJldHVybjtcclxuICAgIC8vIH1cclxuICAgIGlmIChuZXdEYXRlICYmIG5ld0RhdGUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlID0gbmV3RGF0ZTtcclxuICAgICAgdGhpcy5jaGVja291dF9kYXRlX25nYiA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlKTtcclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IG5vX29mX3Jvb21zKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm5vX29mX3Jvb21zO1xyXG4gIH1cclxuXHJcbiAgc2V0IG5vX29mX3Jvb21zKG5ld1Jvb21zOiBudW1iZXIpIHtcclxuICAgIGlmIChuZXdSb29tcyA+IDQgfHwgbmV3Um9vbXMgPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMgPSBuZXdSb29tcztcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBub19vZl9vY2N1cGFudHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IG5vX29mX29jY3VwYW50cyhuZXdPY2M6IG51bWJlcikge1xyXG4gICAgaWYgKG5ld09jYyA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHMgPSBuZXdPY2M7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGVmYXVsdF9jdXJyZW5jeSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeTtcclxuICB9XHJcblxyXG4gIHNldCBkZWZhdWx0X2N1cnJlbmN5KGN1cnJlbmN5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeSA9IGN1cnJlbmN5O1xyXG4gIH1cclxuXHJcbiAgLy8gbWF5IGhhdmUgdG8gbW9kaWZ5IHRoZXNlXHJcbiAgZ2V0IGxvY2F0aW9uKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IGxvY2F0aW9uKG5ld0xvYzogYW55KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24gPSBuZXdMb2M7XHJcblxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvcm1hdHRlZF9sb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvblxyXG4gICAgICA/IHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbi5kZXN0aW5hdGlvblxyXG4gICAgICA6ICdObyBMb2NhdGlvbiBTZXQnOyAvLyBUT0RPIC0gIGV4cGFuZCB0aGlzIGZvciBkaWZmZXJlbnQgdHlwZXNcclxuICB9XHJcblxyXG4gIGdldCBkaXN0YW5jZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5kaXN0YW5jZTtcclxuICB9XHJcblxyXG4gIHNldCBkaXN0YW5jZShuZXdEaXN0OiBudW1iZXIpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5kaXN0YW5jZSA9IG5ld0Rpc3Q7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcHJlZmVyZWRfaG90ZWxzX29ubHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnByZWZlcmVkX2hvdGVsc19vbmx5O1xyXG4gIH1cclxuXHJcbiAgc2V0IHByZWZlcmVkX2hvdGVsc19vbmx5KG5ld1ByZWY6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJlZF9ob3RlbHNfb25seSA9IG5ld1ByZWY7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY291bnRyeSgpOiBDb3VudHJ5IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY291bnRyeTtcclxuICB9XHJcblxyXG4gIHNldCBjb3VudHJ5KG5ld0NvbnQ6IENvdW50cnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jb3VudHJ5ID0gbmV3Q29udDtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBwb3N0Y29kZSgpOiBMb2NhdGlvbkRldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5wb3N0Y29kZTtcclxuICB9XHJcblxyXG4gIHNldCBwb3N0Y29kZShwb3N0Y29kZTogTG9jYXRpb25EZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucG9zdGNvZGUgPSBwb3N0Y29kZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCB0cmFpbnNTdGF0aW9uKCk6IExvY2F0aW9uRGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnRyYWluc1N0YXRpb247XHJcbiAgfVxyXG5cclxuICBzZXQgdHJhaW5zU3RhdGlvbihzdGF0aW9uOiBMb2NhdGlvbkRldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy50cmFpbnNTdGF0aW9uID0gc3RhdGlvbjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBvZmZpY2UoKTogQ29uZmVybWFPZmZpY2VOYW1lcyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm9mZmljZTtcclxuICB9XHJcblxyXG4gIHNldCBvZmZpY2Uob2ZmaWNlOiBDb25mZXJtYU9mZmljZU5hbWVzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMub2ZmaWNlID0gb2ZmaWNlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQWRkaXRpb25hbCBWYXJpYWJsZXNcclxuICBnZXQgaG90ZWxfbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9uYW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IGhvdGVsX25hbWUobmV3TmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaG90ZWxfbmFtZSA9IG5ld05hbWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaG90ZWxfY2hhaW4oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuaG90ZWxfY2hhaW47XHJcbiAgfVxyXG5cclxuICBzZXQgaG90ZWxfY2hhaW4obmV3Q2hhaW46IGFueSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmhvdGVsX2NoYWluID0gbmV3Q2hhaW47XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXR0ZXJzIE9ubHlcclxuXHJcbiAgZ2V0IG1heF9yb29tc19hcnJheSgpOiBudW1iZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4X3Jvb21zX2FycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1heF9vY2N1cGFudF9hcnJheSgpOiBudW1iZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4X29jY3VwYW50X2FycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3RhbmNlX2xpc3QoKTogbnVtYmVyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3RhbmNlX2xpc3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgbG9jYXRpb25fdHlwZV9zZWxlY3QoKTogTG9jYXRpb25UeXBlcyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0O1xyXG4gIH1cclxuXHJcbiAgc2V0IGxvY2F0aW9uX3R5cGVfc2VsZWN0KHZhbHVlOiBMb2NhdGlvblR5cGVzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJzKCk6IEhvdGVsRmlsdGVycyB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaG90ZWxGZXRjaGVyOiBCYXNlSG90ZWxRdW90ZUZldGNoZXI8SFFfUT4sXHJcbiAgICBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgZW52aXJvbm1lbnQ6IEJhc2VFbnZpcm9ubWVudCxcclxuICAgIHByaXZhdGUgYXZhbGlhYmlsaXR5U2VydmljZTogQmFzZUhvdGVsQXZhbGliaWxpdHlTZXJ2aWNlPEhBX1E+LFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRTZXJ2aWNlOiBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICAgIHN0b3JhZ2VTZXJ2aWNlOiBCYXNlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwQ2FsbFNlcnZpY2U6IEFic3RyYWN0SHR0cENhbGxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBxdWlja0xpc3RGZXRjaGVyOiBCYXNlU2VhcmNoQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyPFFMX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRSYWlsU3RhdGlvbkZldGNoZXI6IEJhc2VHZXRSYWlsU3RhdGlvbkZldGNoZXI8R1JTX1E+LFxyXG4gICAgcHJpdmF0ZSBhcHBseUhvdGVsUnVsZXNGZXRjaGVyOiBCYXNlSG90ZWxSdWxlc0ZldGNoZXI8SFJfUT5cclxuICApIHtcclxuICAgIHN1cGVyKHN0b3JhZ2VTZXJ2aWNlLCBoZWxwZXJzKTtcclxuICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgY29uc3QgZGF0YToge1xyXG4gICAgICB0ZW1wUGFyYW1zOiBIb3RlbFRlbXBQYXJhbXM7XHJcbiAgICB9ID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEhvdGVsRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB7fSBhcyBIb3RlbFRlbXBQYXJhbXNcclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLmRlZmF1bHRfY3VycmVuY3kgPSB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3lcclxuICAgICAgPyB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3lcclxuICAgICAgOiB0aGlzLl9kZWZhdWx0X2N1cnJlbmN5O1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHNlYXJjaFNlcnZpY2UubWFrZUhvdGVsUXVlcnkoZGF0YS50ZW1wUGFyYW1zKSk7XHJcblxyXG4gICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkQWRkVHJhdmVsbGVyU3Vic2NyaXB0aW9uKCkpIHtcclxuICAgICAgc2VhcmNoU2VydmljZS50cmF2ZWxsZXJJbmZvcm1hdGlvbi5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgICAgICAgY29uc3Qgc3BsaXRUcmF2ZWxsZXJzID0gdGhpcy5oZWxwZXJzLnNlbGVjdGVkVHJhdmVsbGVycyhcclxuICAgICAgICAgICAgdHJhdmVsbGVycyxcclxuICAgICAgICAgICAgU2VydmljZVR5cGUuSG90ZWxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzID0gc3BsaXRUcmF2ZWxsZXJzLmFkdWx0cy5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXN1bHRzID1cclxuICAgICAgc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW1Bc0xpc3Q8SG90ZWxEZXRhaWxzQXJyYXk+KFxyXG4gICAgICAgIHRoaXMucmVzdWx0c1Nlc3Npb25OYW1lXHJcbiAgICAgICkgfHwgW107XHJcbiAgICByZXN1bHRzXHJcbiAgICAgIC5zbGljZSgwLCB0aGlzLmVudmlyb25tZW50Lm51bWJlckhvdGVsVG9QcmVsb2FkKVxyXG4gICAgICAuZm9yRWFjaCgoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFNlcnZpY2UuY2FuQm9vayhTZXJ2aWNlVHlwZS5Ib3RlbCkpIHtcclxuICAgICAgICAgIC8vIG5lZWQgdGhpcyBjaGVjayBiZWNhdXNlIG9uIHJlZnJlc2ggd2UgYXJlIGdldHRpbmcgZXJyb3JzIC0gdGhlb3J5IHRoYXQgdXNlciBoYXNuJ3QgZnVsbHkgbG9hZGVkIGluIHlldFxyXG4gICAgICAgICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eUZvcklkKFxyXG4gICAgICAgICAgICB0aGlzLm1ha2VIb3RlbEF2YWxpbGl0eU9iamVjdChob3RlbCksXHJcbiAgICAgICAgICAgIGhvdGVsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChob3RlbFJlc3VsdDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucy5hZGQoaG90ZWxSZXN1bHQuZ3JvdXApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZ1bGxSZXN1bHRzID0gcmVzdWx0cztcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG5cclxuICAgIHRoaXMudXNlclNlcnZpY2UuY2hhbmdlVXNlci5zdWJzY3JpYmUoKHVzZXI6IFBhcnRpYWw8RnVsbFVzZXJEZXRhaWxzPikgPT4ge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVzLm5leHQoW1xyXG4gICAgICAgIExvY2F0aW9uVHlwZXMuQWlycG9ydCxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLkNpdHksXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5PZmZpY2UsXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3QsXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb25cclxuICAgICAgXSk7XHJcbiAgICAgIGlmIChzZWFyY2hTZXJ2aWNlLnNob3VsZEZldGNoQWxsT2ZmaWNlcygpKSB7XHJcbiAgICAgICAgdGhpcy5vZmZpY2VzLm5leHQoW10pOyAvLyBUT0RPIGZldGNoIG9mZmljZXNcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcblxyXG4gICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmZldGNoaW5nLnN1YnNjcmliZSgoaXNGZXRjaGluZzogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpZiAoIWlzRmV0Y2hpbmcpIHtcclxuICAgICAgICAvLyBXZSd2ZSBqdXN0IGZpbmlzaGVkIGZldGNoaW5nIGF2YWxpYmlsaXR5IHNvIHVwZGF0ZSBmaWx0ZXJzLlxyXG5cclxuICAgICAgICBjb25zdCBtYXhOdW1iZXIgPSB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UubWF4UHJpY2VGb3JDdXJyZW5jeSgnR0JQJyk7XHJcbiAgICAgICAgaWYgKG1heE51bWJlciA+IDApIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlLm1heCA9IG1heE51bWJlcjtcclxuICAgICAgICAgIHRoaXMubG9jYWxGaWx0ZXJzLnByaWNlUmFuZ2UubWF4ID0gbWF4TnVtYmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGVhcGVzdFJlc3VsdFByaWNlID0gdGhpcy51cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzKTtcclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hTZXJ2aWNlLmNhbkJvb2soU2VydmljZVR5cGUuSG90ZWwpKSB7XHJcbiAgICAgICAgICAvLyBuZWVkIHRoaXMgY2hlY2sgYmVjYXVzZSBvbiByZWZyZXNoIHdlIGFyZSBnZXR0aW5nIGVycm9ycyAtIHRoZW9yeSB0aGF0IHVzZXIgaGFzbid0IGZ1bGx5IGxvYWRlZCBpbiB5ZXRcclxuICAgICAgICAgIHRoaXMuX2FwcGx5VHJhdmVsUnVsZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHByb2Nlc3NSZXN1bHRzKHJlc3VsdHNUb01hcDogSG90ZWxRdW90ZVJlc3VsdEFycmF5KSB7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSA9IDA7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5jaGFpbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIHJldHVybiByZXN1bHRzVG9NYXAubWFwKFxyXG4gICAgICAoaG90ZWxSZXN1bHQ6IEhvdGVsUXVvdGVSZXN1bHQsIGluZGV4OiBudW1iZXIpOiBIb3RlbERldGFpbHMgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSxcclxuICAgICAgICAgIGhvdGVsUmVzdWx0LmxvY2F0aW9uLmRpc3RhbmNlXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZS5tYXggPSB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZTtcclxuICAgICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5jaGFpbnMuYWRkKGhvdGVsUmVzdWx0Lmdyb3VwKTtcclxuICAgICAgICBpZiAoaW5kZXggPCB0aGlzLmVudmlyb25tZW50Lm51bWJlckhvdGVsVG9QcmVsb2FkKSB7XHJcbiAgICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5Rm9ySWQoXHJcbiAgICAgICAgICAgIHRoaXMubWFrZUhvdGVsQXZhbGlsaXR5T2JqZWN0KGhvdGVsUmVzdWx0KSxcclxuICAgICAgICAgICAgaG90ZWxSZXN1bHRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuZ2V0SG90ZWxBdmFpbGFiaWxpdHkoaG90ZWxSZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzb3J0ZWRUYWdzOiB0aGlzLnNvcnRUYWdzKGhvdGVsUmVzdWx0LnRhZ3MpLFxyXG4gICAgICAgICAgRGV0YWlsczoge1xyXG4gICAgICAgICAgICBkaXN0YW5jZV9haXJwb3J0OiAwLFxyXG4gICAgICAgICAgICBkaXN0YW5jZV9tZXRybzogMCxcclxuICAgICAgICAgICAgZGlzdGFuY2VfcmFpbDogMCxcclxuICAgICAgICAgICAgYWlycG9ydF9kZXRhaWxzOiB7IG5hbWU6ICdOb3QgcmV0dXJuZWQnIH0sXHJcbiAgICAgICAgICAgIG1ldHJvX2RldGFpbHM6IHsgbmFtZTogJ05vdCByZXR1cm5lZCcgfSxcclxuICAgICAgICAgICAgcmFpbF9kZXRhaWxzOiB7IG5hbWU6ICdOb3QgcmV0dXJuZWQnIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAvLyBhdmlsYWJpbGl0eTogdGhpcy5ob3RlbF9hdmFpbGFiaWxpdHksXHJcbiAgICAgICAgICAuLi5ob3RlbFJlc3VsdFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPSBIb3RlbEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcbiAgcHJvdGVjdGVkIG11bHRpUmVzdWx0c1Nlc3Npb25OYW1lID1cclxuICAgIEhvdGVsRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUkVTVUxUUztcclxuXHJcbiAgcHJpdmF0ZSBxdWVyeTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMgPSB7fSBhcyBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcztcclxuXHJcbiAgcHJpdmF0ZSBfYXBwbHlUcmF2ZWxSdWxlcygpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmhlbHBlcnNcclxuICAgICAgLmNsb25lKHRoaXMuZnVsbFJlc3VsdHMgfHwgW10pXHJcbiAgICAgIC5tYXAoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLnVwZGF0ZUhvdGVsKGhvdGVsKTtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcigoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhob3RlbC5hdmFpbGFibGVSYXRlcyB8fCB7fSkubGVuZ3RoID4gMDtcclxuICAgICAgfSk7XHJcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hcHBseUhvdGVsUnVsZXNGZXRjaGVyXHJcbiAgICAgIC5mZXRjaEtleWVkT2JqZWN0KCdpZCcsIHtcclxuICAgICAgICBkYXRhXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGExOiBSZWNvcmQ8c3RyaW5nLCBIb3RlbERldGFpbHM+KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyUmVzdWx0cyA9ICB0aGlzLnJlc3VsdHNGaWx0ZXJNZXRob2QodGhpcy5mdWxsUmVzdWx0cyk7XHJcbiAgICAgICAgY29uc3QgdHJhdmxlUmVzdWx0cyA9IGZpbHRlclJlc3VsdHMubWFwKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGF0YTFbaG90ZWwuaWRdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2Uuc2V0SG90ZWxBdmFsYWJpbGl0eShcclxuICAgICAgICAgICAgICBkYXRhMVtob3RlbC5pZF1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBob3RlbDtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLnJlc3VsdHMubmV4dCh0cmF2bGVSZXN1bHRzKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIG1ha2VMb2NhdGlvbnMobG9jYXRpb246IEhvdGVsTG9jYXRpb25bXSk6IHsgW2tleTogc3RyaW5nXTogSG90ZWxMb2NhdGlvbltdIH0ge1xyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5hcnJheVRvT2JqZWN0QXJyYXk8XHJcbiAgICAgIEhvdGVsTG9jYXRpb24sXHJcbiAgICAgIFJlY29yZDxzdHJpbmcsIEhvdGVsTG9jYXRpb25bXT5cclxuICAgID4obG9jYXRpb24sIFsnZGlzdGFuY2VUeXBlJ10pO1xyXG4gIH1cclxuXHJcbiAgc29ydFRhZ3ModGFnczogSG90ZWxUYWdbXSk6IGFueVtdIHtcclxuICAgIGlmICh0YWdzKSB7XHJcbiAgICAgIHJldHVybiBbLi4udGFnc11cclxuICAgICAgICAuc29ydCgoYTogSG90ZWxUYWcsIGI6IEhvdGVsVGFnKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYS5uYW1lIDwgYi5uYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS5uYW1lID4gYi5uYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAubWFwKCh0YWc6IEhvdGVsVGFnKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50YWcsXHJcbiAgICAgICAgICAgIGljb246IHRoaXMuZW52aXJvbm1lbnQudGFnTWFwW3RhZy5uYW1lXSB8fCB0YWcuaWNvblxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXNldFF1ZXJ5KCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlSG90ZWxRdWVyeSgpKTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzID0gbmV3IEhvdGVsRmlsdGVycygpO1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMgPSB7XHJcbiAgICAgIGNoYWluczogbmV3IFNldDxzdHJpbmc+KCksXHJcbiAgICAgIGFtZW5pdGllczogW10sXHJcbiAgICAgIG1heERpc3RhbmNlOiAwXHJcbiAgICB9O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNWYWxpZCgpIHtcclxuICAgIGlmICghdGhpcy5kb0NoZWNrcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB0aGlzLnRlbXBQYXJhbXNcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLm1pbl9yZXR1cm5fZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZVxyXG4gICAgKTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZS5pc1NhbWVPckFmdGVyKHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9IG1vbWVudCh0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlKS5hZGQoMSwgJ2RheScpOyAvLyBlbnN1cmUgdGhhdCBjaGVja291dCBkYXRlIGlzIG1pbiAxIGRheSBhZnRlciBjaGVja2luIGRhdGVcclxuICAgIH1cclxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3QpIHtcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkNpdHk6XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnkpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgY291bnRyeScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMubG9jYXRpb24gJiYgIXRoaXMucG9zdGNvZGUpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgICAgICdQbGVhc2Ugc2VsZWN0IGEgaG90ZWwgbG9jYXRpb24gb3IgZW50ZXIgYSBwb3N0Y29kZS4nXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5PZmZpY2U6XHJcbiAgICAgICAgaWYgKHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbj8udHlwZSAhPT0gJ09mZmljZScgJiYgIXRoaXMub2ZmaWNlKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGFuIG9mZmljZS4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICBpZiAodGhpcy50ZW1wUGFyYW1zPy5sb2NhdGlvbikge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24uYWlycG9ydD8uZ2F0ZXdheSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgYWlycG9ydC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgYWlycG9ydC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjpcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uPy5yYWlsc3RhdGlvbj8uc3RhdGlvbkNvZGUgJiZcclxuICAgICAgICAgICF0aGlzLnRyYWluc1N0YXRpb24/LnN0YXRpb25Db2RlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgdHJhaW4gc3RhdGlvbi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuU2hvcnRsaXN0OlxyXG4gICAgICAgIGlmICghdGhpcy5jb3VudHJ5KSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGNvdW50cnknKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgJiZcclxuICAgICAgdGhpcy5jaGVja291dF9kYXRlLmlzU2FtZU9yQmVmb3JlKHRoaXMuY2hlY2tpbl9kYXRlKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ0NoZWNrb3V0IGRhdGUgbXVzdCBiZSBhZnRlciBjaGVja2luIGRhdGUnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGVja291dF9kYXRlICYmIHRoaXMuY2hlY2tvdXRfZGF0ZS5pc0JlZm9yZShtb21lbnQoKSkpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnQ2hlY2tvdXQgZGF0ZSBtdXN0IG5vdCBiZSBpbiB0aGUgcGFzdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoZWNraW5fZGF0ZSAmJiB0aGlzLmNoZWNraW5fZGF0ZS5pc0JlZm9yZShtb21lbnQoKSkpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnQ2hlY2tpbiBkYXRlIG11c3Qgbm90IGJlIGluIHRoZSBwYXN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgJiZcclxuICAgICAgdGhpcy5jaGVja2luX2RhdGUgJiZcclxuICAgICAgdGhpcy5jaGVja2luX2RhdGUuaXNBZnRlcih0aGlzLmNoZWNrb3V0X2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAnQ2hlY2tvdXQgZGF0YSBtdXN0IGJlIGFmdGVyIHRoZSBjaGVja2luIGRhdGUnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRpbmcgT2NjdXBhbmN5XHJcbiAgICBjb25zdCBvY2N1cGFuY3kgPSB0aGlzLm5vX29mX29jY3VwYW50cyAvIHRoaXMubm9fb2Zfcm9vbXM7XHJcbiAgICBpZiAoIShvY2N1cGFuY3kgPT09IDEgfHwgb2NjdXBhbmN5ID09PSAyKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdPY2N1cGFudHMgcGVyIHJvb20gbXVzdCBiZSAxIG9yIDIsIGlmIHlvdSBoYXZlIGFuIG9kZCBudW1iZXIgb2YgdHJhdmVsbGVycyAoZ3JlYXRlciB0aGFuIG9uZSksIHRoZSBubyBvZiByb29tcyBtdXN0IGJlIGVxdWFsJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICAgIHRoaXMuaXNWYWxpZC5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB0aGlzLm1lc3NhZ2VzLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2goKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChbXSk7XHJcbiAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UucmVzZXQoKTtcclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgdGhpcy5fb3JpZ2luYWxVc2VyU2VhcmNoID0gT2JqZWN0LmZyZWV6ZShcclxuICAgICAgICB0aGlzLmhlbHBlcnMuY2xvbmUodGhpcy50ZW1wUGFyYW1zKVxyXG4gICAgICApO1xyXG4gICAgICAvLyBidWlsZCB0aGUgcXVlcnlcclxuICAgICAgdGhpcy5idWlsZFF1ZXJ5KCk7XHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZVJlY2VudFNlYXJjaChcclxuICAgICAgICB0aGlzLmdldFJlY2VudFNlYXJjaFF1ZXJ5KHRoaXMuZ2V0U2VhcmNoUXVlcnkoKSlcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0U2VhcmNoKFxyXG4gICAgICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9PT0gTG9jYXRpb25UeXBlcy5TaG9ydGxpc3RcclxuICAgICAgICAgID8gdGhpcy5xdWlja0xpc3RGZXRjaGVyLmZldGNoTGlzdCh7IGNvdW50cnlDb2RlOiB0aGlzLmNvdW50cnkuY0NvZGUgfSlcclxuICAgICAgICAgIDogdGhpcy5ob3RlbEZldGNoZXIuZmV0Y2hMaXN0KHF1ZXJ5KVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZWNlbnRTZWFyY2hRdWVyeShcclxuICAgIHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlc1xyXG4gICk6IFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyB7XHJcbiAgICBjb25zdCByZWNlbnRTZWFyY2hRdWVyeSA9IHRoaXMudXBkYXRlU2VyY2hRdWVyeShxdWVyeSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VydmljZVR5cGU6IFNlcnZpY2VUeXBlLkhvdGVsLFxyXG4gICAgICBzZWFyY2hBcmdzOiByZWNlbnRTZWFyY2hRdWVyeSxcclxuICAgICAgdHJhdmVsRGF0ZTogdGhpcy5jaGVja2luX2RhdGUuZm9ybWF0KCksXHJcbiAgICAgIHRyYXZlbGxlcnM6IHRoaXMuaGVscGVycy5nZXRUcmF2ZWxsZXJzSWQodGhpcy50cmF2ZWxsZXJzKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2VyY2hRdWVyeShxdWVyeTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMpOiBIb3RlbFJlY2VudFNlYXJjaEFyZ3Mge1xyXG4gICAgY29uc3Qgc2VhcmNoUXVlcnk6IEhvdGVsUmVjZW50U2VhcmNoQXJncyA9IHF1ZXJ5O1xyXG4gICAgc2VhcmNoUXVlcnkubG9jYXRpb25fdHlwZV9zZWxlY3QgPSB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0O1xyXG4gICAgaWYgKHRoaXMubG9jYXRpb24/Lm5hbWUpIHtcclxuICAgICAgc2VhcmNoUXVlcnkuY2l0eU5hbWUgPSB0aGlzLmxvY2F0aW9uLm5hbWU7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHNlYXJjaFF1ZXJ5LmxvY2F0aW9uX3R5cGVfc2VsZWN0KSB7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5PZmZpY2U6XHJcbiAgICAgICAgc2VhcmNoUXVlcnkub2ZmaWNlTmFtZSA9IHRoaXMub2ZmaWNlLm5hbWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb246XHJcbiAgICAgICAgc2VhcmNoUXVlcnkudHJhaW5zU3RhdGlvbkRldGFpbCA9IHRoaXMudHJhaW5zU3RhdGlvblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICBzZWFyY2hRdWVyeS5haXJwb3J0RGV0YWlsID0gdGhpcy5sb2NhdGlvbi5haXJwb3J0O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZWFyY2hRdWVyeTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydFJlY2VudFNlYXJjaChyZWNlbnRTZWFyY2g6IFJlY2VudFNlYXJjaCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxvY2F0aW9uX3R5cGVfc2VsZWN0O1xyXG4gICAgdGhpcy5jdXJyZW5jeSA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmN1cnJlbmN5O1xyXG4gICAgdGhpcy5kaXN0YW5jZSA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmRpc3RhbmNlO1xyXG4gICAgdGhpcy5ub19vZl9yb29tcyA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnJvb21zO1xyXG4gICAgdGhpcy5jaGVja2luX2RhdGUgPSBtb21lbnQocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Muc3RhcnREYXRlKTtcclxuICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9IG1vbWVudChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5lbmREYXRlKTtcclxuICAgIHRoaXMuaG90ZWxfbmFtZSA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmhvdGVsTmFtZTtcclxuXHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZ3JvdXBOYW1lKSB7XHJcbiAgICAgIHRoaXMuaG90ZWxfY2hhaW4gPSB7XHJcbiAgICAgICAgbmFtZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZ3JvdXBOYW1lXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IGxvY2F0aW9uX3R5cGVfc2VsZWN0XHJcbiAgICBzd2l0Y2ggKHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QpIHtcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ6XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0QWlycG9ydEJ5Q29kZShyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5pYXRhKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoaWF0YTogQWlycG9ydFNlYXJjaFJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYWlycG9ydCA9IHtcclxuICAgICAgICAgICAgICBhaXJwb3J0OiB7XHJcbiAgICAgICAgICAgICAgICBnYXRld2F5OiBpYXRhLmlhdGFNYXRjaC5pYXRhXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxvY2F0aW9uID0geyAuLi5haXJwb3J0LCAuLi5pYXRhLmlhdGFNYXRjaCB9O1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5DaXR5OlxyXG4gICAgICAgIHRoaXMuY291bnRyeSA9IHtcclxuICAgICAgICAgIGNDb2RlOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5jb3VudHJ5Q29kZSxcclxuICAgICAgICAgIGNOYW1lOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gc2hvdWxkIGJlIG9uZSBzZWFyY2ggbWV0b2QgZm9yIHRoZSBjaXR5IHNlYXJjaDogbG9jYXRpb24gb3IgcG9zdGNvZGVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sYXRpdHVkZSAmJlxyXG4gICAgICAgICAgcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9uZ2l0dWRlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uID0ge1xyXG4gICAgICAgICAgICBuYW1lOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5jaXR5TmFtZSxcclxuICAgICAgICAgICAgbGF0aXR1ZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxhdGl0dWRlLFxyXG4gICAgICAgICAgICBsb25naXR1ZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxvbmdpdHVkZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnBvc3RPclppcENvZGUpIHtcclxuICAgICAgICAgIHRoaXMucG9zdGNvZGUgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnBvc3RPclppcENvZGUsXHJcbiAgICAgICAgICAgIHR5cGU6IExvY2F0aW9uVHlwZXMuUG9zdGNvZGVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5PZmZpY2U6XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0T2ZmaWNlKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm9mZmljZUlkKVxyXG4gICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKG9mZmljZTogQ29uZmVybWFPZmZpY2VJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmaWNlID0ge1xyXG4gICAgICAgICAgICAgIGlkOiBvZmZpY2UuaWQsXHJcbiAgICAgICAgICAgICAgbmFtZTogb2ZmaWNlLm5hbWVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIHRoaXMuZ2V0UmFpbFN0YXRpb25CeUNvZGUoXHJcbiAgICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy50cmFpblN0YXRpb25Db2RlXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKHRyYWluc1N0YXRpb246IFJhaWxTdGF0aW9uKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYWluc1N0YXRpb24gPSB0cmFpbnNTdGF0aW9uIGFzIExvY2F0aW9uRGV0YWlscztcclxuICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q6XHJcbiAgICAgICAgdGhpcy5jb3VudHJ5ID0ge1xyXG4gICAgICAgICAgY0NvZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgY05hbWU6ICcnXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSYWlsU3RhdGlvbkJ5Q29kZShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJhaWxTdGF0aW9uPiB7XHJcbiAgICBpZiAoY29kZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRSYWlsU3RhdGlvbkZldGNoZXJcclxuICAgICAgICAuZmV0Y2hMaXN0KHsgaWQ6IG51bGwsIGNvZGUgfSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBvZigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U2VhcmNoUXVlcnkob2dTZWFyY2ggPSBmYWxzZSk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzIHtcclxuICAgIHRoaXMuYnVpbGRRdWVyeShvZ1NlYXJjaCk7XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnJlbW92ZU51bGxzPFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzPih0aGlzLnF1ZXJ5KTtcclxuICB9XHJcblxyXG4gIGJ1aWxkUXVlcnkob2dTZWFyY2ggPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgdGVtcFBhcmFtcyA9IG9nU2VhcmNoID8gdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2ggOiB0aGlzLnRlbXBQYXJhbXM7XHJcblxyXG4gICAgY29uc3QgcXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzID0ge1xyXG4gICAgICBzdGFydERhdGU6IHRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxyXG4gICAgICBlbmREYXRlOiB0ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIHJvb21zOiB0ZW1wUGFyYW1zLm5vX29mX3Jvb21zLFxyXG4gICAgICBhZHVsdHM6IHRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzLFxyXG4gICAgICBjdXJyZW5jeTogdGVtcFBhcmFtcy5jdXJyZW5jeSA/IHRlbXBQYXJhbXMuY3VycmVuY3kgOiBudWxsLFxyXG4gICAgICBkaXN0YW5jZTogdGVtcFBhcmFtcy5kaXN0YW5jZSxcclxuICAgICAgZGlzdGFuY2VUeXBlOiBEaXN0YW5jZVR5cGVzLk0sXHJcbiAgICAgIG1heFJlc3VsdHM6IDEwMFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdldFJvb21OdW1iZXIoKTtcclxuICAgIHN3aXRjaCAodGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICBxdWVyeS5pYXRhID0gdGVtcFBhcmFtcy5sb2NhdGlvbi5haXJwb3J0LmdhdGV3YXk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQ2l0eTpcclxuICAgICAgICBxdWVyeS5jb3VudHJ5Q29kZSA9IHRlbXBQYXJhbXMuY291bnRyeS5jQ29kZTtcclxuICAgICAgICAvLyBzaG91bGQgYmUgb25lIHNlYXJjaCBtZXRvZCBmb3IgdGhlIGNpdHkgc2VhcmNoOiBsb2NhdGlvbiBvciBwb3N0Y29kZVxyXG4gICAgICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICBxdWVyeS5sYXRpdHVkZSA9IHRlbXBQYXJhbXMubG9jYXRpb24ubGF0aXR1ZGU7XHJcbiAgICAgICAgICBxdWVyeS5sb25naXR1ZGUgPSB0ZW1wUGFyYW1zLmxvY2F0aW9uLmxvbmdpdHVkZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRlbXBQYXJhbXMucG9zdGNvZGUpIHtcclxuICAgICAgICAgIHF1ZXJ5LnBvc3RPclppcENvZGUgPSB0ZW1wUGFyYW1zLnBvc3Rjb2RlLm5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjpcclxuICAgICAgICBpZiAodGVtcFBhcmFtcy5sb2NhdGlvbj8ucmFpbHN0YXRpb24/LnN0YXRpb25Db2RlKSB7XHJcbiAgICAgICAgICBxdWVyeS50cmFpblN0YXRpb25Db2RlID0gdGVtcFBhcmFtcy5sb2NhdGlvbi5yYWlsc3RhdGlvbi5zdGF0aW9uQ29kZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbj8uc3RhdGlvbkNvZGUpIHtcclxuICAgICAgICAgIHF1ZXJ5LnRyYWluU3RhdGlvbkNvZGUgPSB0ZW1wUGFyYW1zLnRyYWluc1N0YXRpb24uc3RhdGlvbkNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTogLy8gTmVlZHMgdG8gZml4IGluIG5leHQgUFJcclxuICAgICAgICBpZiAodGVtcFBhcmFtcy5sb2NhdGlvbj8uaWQpIHtcclxuICAgICAgICAgIHF1ZXJ5Lm9mZmljZUlkID0gK3RlbXBQYXJhbXMubG9jYXRpb24uaWQ7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wUGFyYW1zLm9mZmljZT8uaWQpIHtcclxuICAgICAgICAgIHF1ZXJ5Lm9mZmljZUlkID0gK3RlbXBQYXJhbXMub2ZmaWNlLmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q6XHJcbiAgICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSB0ZW1wUGFyYW1zLmNvdW50cnkuY0NvZGU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuUG9zdGNvZGU6XHJcbiAgICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSB0ZW1wUGFyYW1zLmNvdW50cnkuY0NvZGU7XHJcbiAgICAgICAgcXVlcnkucG9zdE9yWmlwQ29kZSA9IHRlbXBQYXJhbXMubG9jYXRpb24ubmFtZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgaG90ZWwgbmFtZSBpbiB0aGUgcXVlcnlcclxuICAgIGlmICh0ZW1wUGFyYW1zLmhvdGVsX25hbWUpIHtcclxuICAgICAgcXVlcnkuaG90ZWxOYW1lID0gdGVtcFBhcmFtcy5ob3RlbF9uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFkZCBjaGFpbiBvciBncm91cCBuYW1lIGludCBoZSBxdWVyeVxyXG4gICAgaWYgKHRlbXBQYXJhbXMuaG90ZWxfY2hhaW4pIHtcclxuICAgICAgcXVlcnkuZ3JvdXBOYW1lID0gdGVtcFBhcmFtcy5ob3RlbF9jaGFpbj8ubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XHJcbiAgfVxyXG5cclxuICBtYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWw6IEhvdGVsUXVvdGVSZXN1bHQpOiBBdmFpbGFiaWxpdHlPYmplY3Qge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaG90ZWw6IGhvdGVsLmlkLFxyXG4gICAgICBzdGFydERhdGU6IHRoaXMuaGVscGVycy5mb3JtYXRJc29EYXRlKHRoaXMuY2hlY2tpbl9kYXRlKSxcclxuICAgICAgZW5kRGF0ZTogdGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGUodGhpcy5jaGVja291dF9kYXRlKSxcclxuICAgICAgcm9vbXM6IHRoaXMubm9fb2Zfcm9vbXMsXHJcbiAgICAgIG9jY3VwYW50czogdGhpcy5ub19vZl9vY2N1cGFudHMsXHJcbiAgICAgIGN1cnJlbmN5OiAnR0JQJ1xyXG4gICAgfTtcclxuICB9XHJcbiAgcmVzdWx0c0ZpbHRlck1ldGhvZDogKHJlc3VsdHM6IEhvdGVsRGV0YWlsc0FycmF5KSA9PiBIb3RlbERldGFpbHNBcnJheTtcclxuXHJcbiAgcHVibGljIGZpbHRlclJlc3VsdHMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnJlc3VsdHNGaWx0ZXJNZXRob2QgPSAocmVzdWx0czogSG90ZWxEZXRhaWxzQXJyYXkpID0+IHJlc3VsdHMuZmlsdGVyKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGhpcy5pblByaWNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgdGhpcy5pbkRpc3RhbmNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgdGhpcy5jb250YWluc0hvdGVsbmFtZShob3RlbCkgJiZcclxuICAgICAgICB0aGlzLmhhc0NoYWluKGhvdGVsKSAmJlxyXG4gICAgICAgIHRoaXMuYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbClcclxuICAgICAgKTtcclxuICAgIH0pXHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChcclxuICAgICAgdGhpcy5yZXN1bHRzRmlsdGVyTWV0aG9kKHRoaXMuZnVsbFJlc3VsdHMpXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8vIExpZ2h0ZW5pbmcgRmlsdGVyc1xyXG4gIHB1YmxpYyBmaWx0ZXJMaWdodGVuaW5nUmVzdWx0cyA9ICgpID0+IHtcclxuICAgIHRoaXMucmVzdWx0c0ZpbHRlck1ldGhvZCA9IChyZXN1bHRzOiBIb3RlbERldGFpbHNBcnJheSkgPT4gcmVzdWx0cy5maWx0ZXIoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLmluTGlnaHRlbmluZ1ByaWNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgdGhpcy5jb250YWluc0hvdGVsbmFtZShob3RlbCkgJiZcclxuICAgICAgICB0aGlzLmhhc0NoYWluKGhvdGVsKSAmJlxyXG4gICAgICAgIHRoaXMuaGFzUHJlZmVycmVkKGhvdGVsKSAmJlxyXG4gICAgICAgIHRoaXMuYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbCkgJiZcclxuICAgICAgICB0aGlzLmdldEV4dHJhRmlsdGVyKGhvdGVsKSAmJlxyXG4gICAgICAgIHRoaXMuZ2V0QW1lbml0aWVzRmlsdGVyKGhvdGVsKVxyXG4gICAgICApO1xyXG4gICAgfSlcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHRoaXMucmVzdWx0c0ZpbHRlck1ldGhvZCh0aGlzLmZ1bGxSZXN1bHRzKSk7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHJlc3VsdHNIYXZlVGFnKHNlYXJjaFRhZzogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0c0NvbnRhaW5UYWc6IGJvb2xlYW47XHJcbiAgICBsZXQgZmlsdGVyZWRSZXN1bHRzID0gdGhpcy5mdWxsUmVzdWx0cy5maWx0ZXIoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgbGV0IGZpbHRlcmVkVGFnczogYW55ID0gaG90ZWwudGFncy5maWx0ZXIoKHRhZzogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHRhZy5uYW1lKSB7XHJcbiAgICAgICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcodGFnLm5hbWUpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyh0aGlzLmNvbnZlcnRUb09uZVN0cmluZyhzZWFyY2hUYWcpLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBjb250YWluc1NlYXJjaFRhZyA9XHJcbiAgICAgICAgZmlsdGVyZWRUYWdzICYmIGZpbHRlcmVkVGFncy5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhgSG90ZWwgJHtob3RlbC5uYW1lfSB3aXRoIGZpbHRlciBhcHBsaWVkYCwgaG90ZWw/LnRhZ3MsIGlzVHJ1ZSk7XHJcbiAgICAgIHJldHVybiBjb250YWluc1NlYXJjaFRhZztcclxuICAgIH0pO1xyXG4gICAgcmVzdWx0c0NvbnRhaW5UYWcgPVxyXG4gICAgICBmaWx0ZXJlZFJlc3VsdHMgJiYgZmlsdGVyZWRSZXN1bHRzLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgICByZXR1cm4gcmVzdWx0c0NvbnRhaW5UYWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluUHJpY2VSYW5nZShob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhdmFpbGFiaWxpdHkgPSB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoaG90ZWwpO1xyXG4gICAgaWYgKGF2YWlsYWJpbGl0eSkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRoaXMuaGVscGVycy5pblJhbmdlKGF2YWlsYWJpbGl0eS5tYXhwcmljZSwgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UpICYmXHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmluUmFuZ2UoYXZhaWxhYmlsaXR5Lm1pbnByaWNlLCB0aGlzLmZpbHRlcnMucHJpY2VSYW5nZSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluRGlzdGFuY2VSYW5nZShob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZS5tYXggPT09IDAgfHxcclxuICAgICAgdGhpcy5oZWxwZXJzLmluUmFuZ2UoaG90ZWwubG9jYXRpb24uZGlzdGFuY2UsIHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29udGFpbnNIb3RlbG5hbWUoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdG9jaGVjayA9IHRoaXMuZmlsdGVycy5ob3RlbE5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICByZXR1cm4gdG9jaGVjayAmJiB0b2NoZWNrLmxlbmd0aCA+IDBcclxuICAgICAgPyBob3RlbC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModG9jaGVjaylcclxuICAgICAgOiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbkxpZ2h0ZW5pbmdQcmljZVJhbmdlKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShob3RlbCk7XHJcbiAgICBpZiAoYXZhaWxhYmlsaXR5ICYmIE9iamVjdC5rZXlzKGF2YWlsYWJpbGl0eSkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgIGxldCBtYXhSYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICBsZXQgZmluZE1heDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IG1pblJhbmdlID0gdGhpcy5oZWxwZXJzLmluUmFuZ2UoXHJcbiAgICAgICAgYXZhaWxhYmlsaXR5LnBycG4sXHJcbiAgICAgICAgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2VcclxuICAgICAgKTtcclxuICAgICAgaWYgKGF2YWlsYWJpbGl0eT8ubWF4cHJpY2UpIHtcclxuICAgICAgICBmaW5kTWF4ID0gYXZhaWxhYmlsaXR5Lm1heHByaWNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpbmRNYXggPSBhdmFpbGFiaWxpdHk/LnJvb21zLnJlZHVjZShcclxuICAgICAgICAgIChvcCwgaXRlbSkgPT4gKG9wID0gb3AgPiBpdGVtLnRvdGFsID8gb3AgOiBpdGVtLnRvdGFsKSxcclxuICAgICAgICAgIDBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIG1heFJhbmdlID0gdGhpcy5oZWxwZXJzLmluUmFuZ2UoZmluZE1heCwgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gbWluUmFuZ2UgJiYgbWF4UmFuZ2U7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzQ2hhaW4oaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdG9jaGVjayA9ICh0aGlzLmZpbHRlcnMuY2hhaW4gfHwgW10pLm1hcCgoY2hhaW46IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICAgIHJldHVybiBjaGFpbi50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdG9jaGVjayAmJiB0b2NoZWNrLmxlbmd0aFxyXG4gICAgICA/ICEhdG9jaGVjay5maW5kKChjaGFpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGhvdGVsLmdyb3VwLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY2hhaW4pO1xyXG4gICAgICB9KVxyXG4gICAgICA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJyZWFrZmFzdFR5cGVGaWx0ZXIoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnMuYnJlYWtmYXN0VHlwZS5sZW5ndGgpIHJldHVybiB0cnVlO1xyXG4gICAgY29uc3QgaG90ZWxPYmplY3QgPSB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5Rm9ySWQoXHJcbiAgICAgIHRoaXMubWFrZUhvdGVsQXZhbGlsaXR5T2JqZWN0KGhvdGVsKSxcclxuICAgICAgaG90ZWxcclxuICAgICk7XHJcbiAgICBpZiAoIWhvdGVsT2JqZWN0ICYmICFob3RlbE9iamVjdC52YWx1ZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgaG90ZWxPYmplY3RWYWx1ZTogSG90ZWxBdmFsaWJpbGl0eVF1b3RlUmVzdWx0ID0gaG90ZWxPYmplY3QudmFsdWU7XHJcbiAgICBjb25zdCBpc0JyZWFrZmFzdEluY2x1ZGVkID0gdGhpcy5maWx0ZXJzLmJyZWFrZmFzdFR5cGUuaW5jbHVkZXMoXHJcbiAgICAgIFNlYXJjaEhhbmRsZXIuQlJFQUtGQVNUX0lOQ0xVREVEXHJcbiAgICApO1xyXG4gICAgY29uc3QgaXNCcmVha2Zhc3RFeGNsdWRlZCA9IHRoaXMuZmlsdGVycy5icmVha2Zhc3RUeXBlLmluY2x1ZGVzKFxyXG4gICAgICBTZWFyY2hIYW5kbGVyLkJSRUFLRkFTVF9OT1RfSU5DTFVERURcclxuICAgICk7XHJcbiAgICBpZiAoaG90ZWxPYmplY3RWYWx1ZT8ucm9vbXMpIHtcclxuICAgICAgY29uc3QgYnJlYWtmYXN0TWF0Y2hlcyA9IGhvdGVsT2JqZWN0VmFsdWUucm9vbXMuZmlsdGVyKChyb29tczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGlzQnJlYWtmYXN0SW5jbHVkZWQgJiYgaXNCcmVha2Zhc3RFeGNsdWRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJvb21zO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNCcmVha2Zhc3RJbmNsdWRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGluY2x1ZGVkRXhwcmVzc2lvbikgJiZcclxuICAgICAgICAgICAgIXJvb21zLnJhdGVEZXNjcmlwdGlvbi5tYXRjaChleGNsdWRlZEV4cHJlc3Npb24pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNCcmVha2Zhc3RFeGNsdWRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgIXJvb21zLnJhdGVEZXNjcmlwdGlvbi5tYXRjaChpbmNsdWRlZEV4cHJlc3Npb24pIHx8XHJcbiAgICAgICAgICAgIHJvb21zLnJhdGVEZXNjcmlwdGlvbi5tYXRjaChleGNsdWRlZEV4cHJlc3Npb24pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiAhIWJyZWFrZmFzdE1hdGNoZXMubGVuZ3RoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYnlNb3N0RXhwZW5zaXZlKCkge1xyXG4gICAgdGhpcy5zb3J0QnlQcmljZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG1pblxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVidWcgc2V0IHRoaXMgdG8gdHJ1ZSB0byBvdXRwdXQgY29uc29sZSBsb2dzXHJcbiAgICogQGRlc2NyaXB0aW9uIHNvcnRzIHJlc3VsdHMgYnkgcHJpY2UgYWNjb3JkaW5nIHRvIHRoZSAnbWluJyBwYXJhbWF0ZXIuIG1pbiA9IHRydWUgKGxvd2VzdCBwcmljZSBmaXJzdCksIG1pbiA9IGZhbHNlIChoaWdoZXN0IHByaWNlIGZpcnN0KVxyXG4gICAqIEluIHN1bW1hcnksIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzb3J0ZWQgYXJyYXkgb2YgaG90ZWxzIHdpdGggcHJpY2VzIGFuZCBhbiBhcnJheSBvZiBob3RlbHMgV0lUSE9VVCBwcmljZXMsXHJcbiAgICogdGhlbiBmaW5hbGx5IGpvaW5zIHRoZXNlIDIgdGVtcG9yYXJ5IGFycmF5cyB0b2dldGhlciBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgbmV4dCBvYnNlcnZhYmxlLlxyXG4gICAqL1xyXG5cclxuICBzb3J0QnlQcmljZShtaW4gPSB0cnVlLCBkZWJ1ZyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAvLyBzdG9yZSBhbGwgcmVzdWx0c1xyXG4gICAgY29uc3QgaG90ZWxzOiBIb3RlbERldGFpbHNBcnJheSA9IHRoaXMuZnVsbFJlc3VsdHM7XHJcblxyXG4gICAgLy8gZ2V0IGhvdGVscyB3aXRoIGFuZCB3aXRob3V0IHByaWNlc1xyXG4gICAgY29uc3QgaG90ZWxzV2l0aFByaWNlczogSG90ZWxEZXRhaWxzQXJyYXkgPSBbXTtcclxuICAgIGNvbnN0IGhvdGVsc1dpdGhvdXRQcmljZXM6IEhvdGVsRGV0YWlsc0FycmF5ID0gW107XHJcbiAgICBob3RlbHMubWFwKChob3RlbFJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoaG90ZWxSZXN1bHQpPy5wcnBuXHJcbiAgICAgICAgPyBob3RlbHNXaXRoUHJpY2VzLnB1c2goaG90ZWxSZXN1bHQpXHJcbiAgICAgICAgOiBob3RlbHNXaXRob3V0UHJpY2VzLnB1c2goaG90ZWxSZXN1bHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc29ydCBob3RlbHMgd2l0aCBwcmljZXMgYWNjb3JkaW5nIHRvIHRoZSAnbWluJyBwYXJhbWV0ZXIgZm9yIHRoZSBvcmRlclxyXG4gICAgaG90ZWxzV2l0aFByaWNlcy5zb3J0KChmaXJzdDogSG90ZWxEZXRhaWxzLCBzZWNvbmQ6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICBjb25zdCBmaXJzdFByaWNlID1cclxuICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoZmlyc3QpPy5wcnBuO1xyXG4gICAgICBjb25zdCBzZWNvbmRQcmljZSA9XHJcbiAgICAgICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eVZhbHVlKHNlY29uZCk/LnBycG47XHJcbiAgICAgIHJldHVybiBtaW5cclxuICAgICAgICA/IGZpcnN0UHJpY2UgPiBzZWNvbmRQcmljZVxyXG4gICAgICAgICAgPyAxXHJcbiAgICAgICAgICA6IHNlY29uZFByaWNlID4gZmlyc3RQcmljZVxyXG4gICAgICAgICAgICA/IC0xXHJcbiAgICAgICAgICAgIDogMFxyXG4gICAgICAgIDogZmlyc3RQcmljZSA8IHNlY29uZFByaWNlXHJcbiAgICAgICAgICA/IDFcclxuICAgICAgICAgIDogc2Vjb25kUHJpY2UgPCBmaXJzdFByaWNlXHJcbiAgICAgICAgICAgID8gLTFcclxuICAgICAgICAgICAgOiAwO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gam9pbiBob3RlbHMgd2l0aCBwcmljZXMgdG8gaG90ZWxzIFdJVEhPVVQgcHJpY2VzXHJcbiAgICBjb25zdCBzb3J0ZWRIb3RlbHMgPSBbLi4uaG90ZWxzV2l0aFByaWNlcywgLi4uaG90ZWxzV2l0aG91dFByaWNlc107XHJcblxyXG4gICAgLy8gdHJpZ2dlciBuZXh0IG9ic2VydmFibGVcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHNvcnRlZEhvdGVscyk7XHJcblxyXG4gICAgLy8gZGlzcGxheSBjb25zb2xlIGxvZ3MgaWYgZGVidWcgaXMgdHJ1ZSAoY291bGQgcHJvdmUgdXNlZnVsIGluIGZ1dHVyZSlcclxuICAgIGlmIChkZWJ1Zykge1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgc29ydEJ5UHJpY2UoKSBjYWxsZWQgKysnKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIGhvdGVsICsrJywgaG90ZWxzKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIGhvdGVsc1dpdGhQcmljZXMgKysnLCBob3RlbHNXaXRoUHJpY2VzKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIGhvdGVsc1dpdGhvdXRQcmljZXMgKysnLCBob3RlbHNXaXRob3V0UHJpY2VzKTtcclxuICAgICAgY29uc29sZS5sb2coJysrIHNvcnRlZEhvdGVscyArKycsIHNvcnRlZEhvdGVscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzb3J0QnlOYW1lKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoXHJcbiAgICAgIHRoaXMuaGVscGVyc1xyXG4gICAgICAgIC5jbG9uZSh0aGlzLmZ1bGxSZXN1bHRzKVxyXG4gICAgICAgIC5zb3J0KChmc3Q6IEhvdGVsRGV0YWlscywgc25kOiBIb3RlbERldGFpbHMpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGZzdC5uYW1lLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShzbmQubmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNvcnRCeURpc3RhbmNlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoXHJcbiAgICAgIHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLmZ1bGxSZXN1bHRzKS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcihhLmxvY2F0aW9uLmRpc3RhbmNlKSAtIE51bWJlcihiLmxvY2F0aW9uLmRpc3RhbmNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBieVByZWZlcnJlZCgpOiB2b2lkIHtcclxuICAgIGxldCByZXN1bHRzID0gdGhpcy5yZXN1bHRzLnZhbHVlIHx8IFtdO1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydCgoYTogSG90ZWxEZXRhaWxzLCBiOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcmVmZXJyZWRUb0ludChiKSAtIHRoaXMucHJlZmVycmVkVG9JbnQoYSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignKysrIEVycm9yIHNvcnRpbmcgYnkgcHJlZmVycmVkOiAnLCBlcnJvciwgJyArKysnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChyZXN1bHRzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlZmVycmVkVG9JbnQoaG90ZWw6IEhvdGVsRGV0YWlscyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAoaG90ZWwucHJlZmVycmVkLmNsaWVudCA/IENMSUVOVF9QUkVGRVJSRURfVkFMVUUgOiAwKSArXHJcbiAgICAgIChob3RlbC5wcmVmZXJyZWQuY29uc3VtZXIgPyBBR0VOVF9QUkVGRVJSRURfVkFMVUUgOiAwKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50VG9QcmVmZXJyZWQocHJlZmVycmVkOiAwIHwgMSB8IDIgfCAzKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWJpdHdpc2VcclxuICAgICAgY2xpZW50OiAocHJlZmVycmVkICYgQ0xJRU5UX1BSRUZFUlJFRF9WQUxVRSkgPT09IENMSUVOVF9QUkVGRVJSRURfVkFMVUUsXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYml0d2lzZVxyXG4gICAgICBjb25zdW1lcjogKHByZWZlcnJlZCAmIEFHRU5UX1BSRUZFUlJFRF9WQUxVRSkgPT09IEFHRU5UX1BSRUZFUlJFRF9WQUxVRVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGFkZEZpbHRlcihmaWx0ZXI6IHN0cmluZywgdHlwZToga2V5b2YgSG90ZWxGaWx0ZXJzKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWx0OiBhbnkgPSB0aGlzLmxvY2FsRmlsdGVycztcclxuICAgIGZpbHRbdHlwZV0ucHVzaChmaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRmlsdGVyKGZpbHRlcjogc3RyaW5nLCB0eXBlOiBrZXlvZiBIb3RlbEZpbHRlcnMpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbHQgPSB0aGlzLmxvY2FsRmlsdGVycztcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRbdHlwZV0pKSB7XHJcbiAgICAgIChmaWx0W3R5cGVdIGFzIHN0cmluZ1tdKSA9IChmaWx0W3R5cGVdIGFzIHN0cmluZ1tdKS5maWx0ZXIoXHJcbiAgICAgICAgKGNoYWluOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHJldHVybiBmaWx0ZXIgIT09IGNoYWluO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0RmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmNoYWluID0gW107XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5hbWVuaXR5dHlwZSA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMucHJlZmVycmVkID0gW107XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5leHRyYSA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuaG90ZWxOYW1lID0gJyc7XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5icmVha2Zhc3RUeXBlID0gW107XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKFwiUFJFUE9QVUxBVElORyBIT1RFTCBGT1JNXCIpXHJcbiAgICBjb25zdCBmbGlnaHRJdGVtOiBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyA9XHJcbiAgICAgIHByZXZpb3VzSXRlbXNbU2VydmljZVR5cGUuRmxpZ2h0XT8uc2VhcmNoUXVlcnk7XHJcbiAgICBjb25zdCByYWlsSXRlbTogU2VhcmNoUmFpbFF1ZXJ5VmFyaWFibGVzID1cclxuICAgICAgcHJldmlvdXNJdGVtc1tTZXJ2aWNlVHlwZS5SYWlsXT8uc2VhcmNoUXVlcnk7XHJcbiAgICBpZiAoZmxpZ2h0SXRlbSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ7XHJcbiAgICAgICAgdGhpcy5jaGVja2luX2RhdGUgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XS5vdXRCb3VuZERhdGU7XHJcbiAgICAgICAgdGhpcy5jaGVja291dF9kYXRlID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkZsaWdodF0uaW5ib3VuZERhdGU7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9ICh7XHJcbiAgICAgICAgICBuYW1lOiAodGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkZsaWdodF0uYXJyaXZlTG9jYXRpb24gYXMgT0JUQWlycG9ydERldGFpbHMpLmRlc3RpbmF0aW9uLFxyXG4gICAgICAgICAgdHlwZTogJ0FpcnBvcnQnLFxyXG4gICAgICAgICAgYWlycG9ydDogdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkZsaWdodF0uYXJyaXZlTG9jYXRpb25cclxuICAgICAgICB9IGFzIGFueSk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB0cnlpbmcgdG8gcHJlcG9wdWxhdGUgaG90ZWwgZnJvbSBmbGlnaHQgaXRlbVwiKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChyYWlsSXRlbSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjtcclxuICAgICAgICB0aGlzLmNoZWNraW5fZGF0ZSA9IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5SYWlsXS5vdXRCb3VuZERhdGVUaW1lO1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5SYWlsXS5pbkJvdW5kRGF0ZVRpbWU7XHJcbiAgICAgICAgdGhpcy50cmFpbnNTdGF0aW9uID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlJhaWxdLnRyYXZlbGxpbmdUbyBhcyBMb2NhdGlvbkRldGFpbHM7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5SYWlsXS50cmF2ZWxsaW5nVG8gYXMgTG9jYXRpb25EZXRhaWxzO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgdHJ5aW5nIHRvIHByZXBvcHVsYXRlIGhvdGVsIGZyb20gcmFpbCBpdGVtXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc1ByZWZlcnJlZChob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwcmVmZXJyZWRGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnByZWZlcnJlZDtcclxuXHJcbiAgICAvLyBFbXB0eSBwcmVmZXJyZWQgZmlsdGVycyBPUiBcIkFueVwiXHJcbiAgICBpZiAoXHJcbiAgICAgICFwcmVmZXJyZWRGaWx0ZXJzLmxlbmd0aCB8fFxyXG4gICAgICBwcmVmZXJyZWRGaWx0ZXJzLmluY2x1ZGVzKFNlYXJjaEhhbmRsZXIuQU5ZKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFnZW5jeSAoY29uc3VtZXIpICYmIENsaWVudFxyXG4gICAgaWYgKFxyXG4gICAgICBwcmVmZXJyZWRGaWx0ZXJzLmluY2x1ZGVzKFNlYXJjaEhhbmRsZXIuQUdFTkNZKSAmJlxyXG4gICAgICBwcmVmZXJyZWRGaWx0ZXJzLmluY2x1ZGVzKFNlYXJjaEhhbmRsZXIuQ0xJRU5UKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgaG90ZWwucHJlZmVycmVkLmNvbnN1bWVyID09PSB0cnVlICYmIGhvdGVsLnByZWZlcnJlZC5jbGllbnQgPT09IHRydWVcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZ2VuY3lcclxuICAgIGlmIChwcmVmZXJyZWRGaWx0ZXJzLmluY2x1ZGVzKFNlYXJjaEhhbmRsZXIuQUdFTkNZKSkge1xyXG4gICAgICByZXR1cm4gaG90ZWwucHJlZmVycmVkLmNvbnN1bWVyID09PSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsaWVudFxyXG4gICAgaWYgKHByZWZlcnJlZEZpbHRlcnMuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5DTElFTlQpKSB7XHJcbiAgICAgIHJldHVybiBob3RlbC5wcmVmZXJyZWQuY2xpZW50ID09PSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldG1heFByaWNlRm9yQ3VycmVuY3koY3VycmVuY3k6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLm1heFByaWNlRm9yQ3VycmVuY3koY3VycmVuY3kpO1xyXG4gIH1cclxuXHJcbiAgLy8gTGlnaHRlbmluZyBFeHRyYSBGaWx0ZXJzXHJcbiAgcHJpdmF0ZSBnZXRFeHRyYUZpbHRlcihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBjaGVja0F2YWlsYWJpbGl0eSA9IHRoaXMuZmlsdGVycy5leHRyYS5pbmNsdWRlcyhcclxuICAgICAgU2VhcmNoSGFuZGxlci5BVkFJTEFCSUxJVFlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tBdmFpbGFiaWxpdHkpIHtcclxuICAgICAgcmV0dXJuIGhvdGVsLnVuYXZhaWxhYmxlID09PSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoZWNrRmVtYWxlRnJpZW5kbHkgPSB0aGlzLmZpbHRlcnMuZXh0cmEuaW5jbHVkZXMoXHJcbiAgICAgIFNlYXJjaEhhbmRsZXIuRkVNQUxFX0ZSSUVORExZXHJcbiAgICApO1xyXG4gICAgaWYgKGNoZWNrRmVtYWxlRnJpZW5kbHkpIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBob3RlbC50YWdzLmZpbHRlcigodGFnKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGFnLm5hbWUpIHtcclxuICAgICAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMuY29udmVydFRvT25lU3RyaW5nKHRhZy5uYW1lKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmFtZS5pbmNsdWRlcyhcclxuICAgICAgICAgICAgICB0aGlzLmNvbnZlcnRUb09uZVN0cmluZyhcclxuICAgICAgICAgICAgICAgIFNlYXJjaEhhbmRsZXIuRkVNQUxFX0ZSSUVORExZXHJcbiAgICAgICAgICAgICAgKS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5sZW5ndGggPiAwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIExpZ2h0ZW5pbmcgQW1lcm5pdGllcyBGaWx0ZXJzXHJcbiAgcHJpdmF0ZSBnZXRBbWVuaXRpZXNGaWx0ZXIoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVHJ1ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB0aGlzLmZpbHRlcnMuYW1lbml0eXR5cGUuZm9yRWFjaCgoc2VhcmNoKSA9PiB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZFJlc3VsdHM6IGFueSA9IGhvdGVsLnRhZ3MuZmlsdGVyKCh0YWcpID0+IHtcclxuICAgICAgICBpZiAodGFnLm5hbWUpIHtcclxuICAgICAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnZlcnRUb09uZVN0cmluZyh0YWcubmFtZSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgIGlmIChuYW1lLmluY2x1ZGVzKHRoaXMuY29udmVydFRvT25lU3RyaW5nKHNlYXJjaCkudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaXNUcnVlID0gZmlsdGVyZWRSZXN1bHRzICYmIGZpbHRlcmVkUmVzdWx0cy5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhgSG90ZWwgJHtob3RlbC5uYW1lfSB3aXRoIGZpbHRlciBhcHBsaWVkYCwgaG90ZWw/LnRhZ3MsIGlzVHJ1ZSk7XHJcbiAgICAgIHJldHVybiBpc1RydWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBpc1RydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnZlcnRUb09uZVN0cmluZyhpdGVtOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBpdGVtLnJlcGxhY2UoL1teYS16QS1aXS9nLCAnJyk7XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZXMoSG9saWRheUNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcclxuICAgIGNvbnN0IHVybCA9XHJcbiAgICAgIHRoaXMuZW52aXJvbm1lbnQuaG9zdEJhc2VVcmwgK1xyXG4gICAgICBVUkxTLkNPTkZJUk1BX1BIT1RPX1VSTCArXHJcbiAgICAgIEhvbGlkYXlDb2RlLnNwbGl0KCcsJylbMF07XHJcbiAgICBjb25zdCBpbWdQcm92aWRlciA9ICdodHRwczovL3d3dy52Zm1paS5jb20vJzsgLy8gaW1nIHByb3ZpZGVyIHRoYXRzIGhvbGRzIGltYWdlcywgdXNlZCB0byBtYXRjaCB3aGljaCBpbWFnZXMgb24gcGFnZSBiZWxvbmdzIHRvIGdhbGxlcnkuXHJcbiAgICBpZiAodGhpcy5nYWxsZXJpZXNbSG9saWRheUNvZGVdKSB7XHJcbiAgICAgIHJldHVybiBvZih0aGlzLmdhbGxlcmllc1tIb2xpZGF5Q29kZV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHBDYWxsU2VydmljZS5nZXQodXJsIGFzIFVSTFMsIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSkucGlwZShcclxuICAgICAgbWFwKChpbWFnZXNIVE1MKSA9PiB7XHJcbiAgICAgICAgaWYgKCFpbWFnZXNIVE1MKSB7XHJcbiAgICAgICAgICB0aHJvdyBFcnJvcihgR2FsbGVyeSBmb3IgJHtIb2xpZGF5Q29kZX0gY2FuIG5vdCBiZSBsb2FkZWQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0ZW1wLmlubmVySFRNTCA9IGltYWdlc0hUTUw7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VzID0gQXJyYXkuZnJvbSh0ZW1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKSkucmVkdWNlKFxyXG4gICAgICAgICAgKGFjYywgaW1nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpbWcuc3JjLmluY2x1ZGVzKGltZ1Byb3ZpZGVyKSkge1xyXG4gICAgICAgICAgICAgIGFjYy5wdXNoKGltZy5zcmMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgW11cclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICghaW1hZ2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgICAgIGBUaGVyZSBpcyBubyBtZWRpYSBjb250ZW50IHByb3ZpZGVkIGZvciB0aGlzIGhvdGVsICR7SG9saWRheUNvZGV9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmdhbGxlcmllc1tIb2xpZGF5Q29kZV0gPSBpbWFnZXMpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFkZFBhZ2luYXRpb25QYWdlKGN1cnJlbnRQYWdlOiBudW1iZXIpOiBhbnkge1xyXG4gICAgY29uc3Qga2V5ID0gJ1BhZ2luYXRpb25QYWdlQ291bnQnO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShrZXksIGN1cnJlbnRQYWdlKTtcclxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtKGtleSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVWaWV3KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09IEhvdGVsVmlldy5MSVNUKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSBIb3RlbFZpZXcuTUFQO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IEhvdGVsVmlldy5MSVNUO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY0RheURpZmYoKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGNoZWNrb3V0ID0gbW9tZW50KHRoaXMuY2hlY2tvdXRfZGF0ZSk7XHJcbiAgICBjb25zdCBjaGVja2luID0gbW9tZW50KHRoaXMuY2hlY2tpbl9kYXRlKTtcclxuICAgIHJldHVybiBjaGVja291dC5zdGFydE9mKCdkYXknKS5kaWZmKGNoZWNraW4uc3RhcnRPZignZGF5JyksICdkYXlzJyk7XHJcbiAgfVxyXG4gIHVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHM6IEhvdGVsRGV0YWlsc1tdKTogSUNoZWFwZXN0UHJpY2Uge1xyXG4gICAgY29uc3QgY3VycmVuY2llc0tleSA9IE9iamVjdC5rZXlzKHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5jdXJyZW5jaWVzKTtcclxuICAgIGlmICgoIXJlc3VsdHMubGVuZ3RoICYmICFjdXJyZW5jaWVzS2V5Lmxlbmd0aCkgfHwgIWN1cnJlbmNpZXNLZXkubGVuZ3RoKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBjdXJyZW5jaWUgPSBjdXJyZW5jaWVzS2V5WzBdO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFtb3VudDogdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmN1cnJlbmNpZXNbY3VycmVuY2llXS5taW5wcmljZSxcclxuICAgICAgY3VycmVuY3lDb2RlOiBjdXJyZW5jaWVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRSb29tTnVtYmVyKCkge1xyXG4gICAgbGV0IHJvb21zT2NjdXBhbmN5OiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOdW1iZXIodGhpcy50ZW1wUGFyYW1zLm5vX29mX3Jvb21zKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5ld1Jvb21PY2N1cGFuY3kgPSB7XHJcbiAgICAgICAgQWR1bHRzOiB0aGlzLmNhbGNSb29tT2NjdXBhbmN5KFxyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm5vX29mX3Jvb21zLFxyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50c1xyXG4gICAgICAgICksXHJcbiAgICAgICAgQ2hpbGRyZW46IDAsXHJcbiAgICAgICAgSW5mYW50czogMFxyXG4gICAgICB9O1xyXG4gICAgICByb29tc09jY3VwYW5jeS5wdXNoKG5ld1Jvb21PY2N1cGFuY3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByb29tczogbnVtYmVyW10gPSBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByb29tc09jY3VwYW5jeS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb29tc09jY3VwYW5jeVtpbmRleF0uQWR1bHRzOyBqKyspIHtcclxuICAgICAgICByb29tcy5wdXNoKGluZGV4ICsgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0gc2hvdWxkIHdlIGFkZCBuZXcgcHJvcGVydHkgcm9vbU51bWJlciBmb3IgdHJhdmVsbGVyPyAtLVxyXG4gICAgLy8gZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudHJhdmVsbGVycy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgIC8vICAgdGhpcy50cmF2ZWxsZXJzW2luZGV4XS5yb29tTnVtYmVyID0gcm9vbXNbaW5kZXhdO1xyXG4gICAgLy8gfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHRAZGVzYyAtIHJldHVybiB0aGUgb2NjdXBhbmN5IGZvciBhIHJvb20gLSBuZWVkIHRvIGNhbGN1bGF0ZSBiYXNlZCBvbiBubyBvZiByb29tcywgbm8gb2YgdHJhdmVsbGVycyBhbmQgY3VycmVudGx5IG9jY3VwaWVkIHJvb21zO1xyXG4gICAqKi9cclxuXHJcbiAgY2FsY1Jvb21PY2N1cGFuY3kobm9fb2Zfcm9vbXM6IG51bWJlciwgdHJhdmVsbGVyczogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAnTm8gb2YgVHJhdmVsbGVyczogJyArXHJcbiAgICAgIHRyYXZlbGxlcnMgK1xyXG4gICAgICAnfCBObyBvZiByb29tczogJyArXHJcbiAgICAgIG5vX29mX3Jvb21zICtcclxuICAgICAgJyB8IEFzc2lnbmVkOiAnICtcclxuICAgICAgdGhpcy5vY2N1cGllZFxyXG4gICAgKTtcclxuICAgIGxldCByb29tT2NjdXBhbmN5OiBudW1iZXIgPSBNYXRoLmNlaWwodHJhdmVsbGVycyAvIG5vX29mX3Jvb21zKTtcclxuXHJcbiAgICBpZiAodHJhdmVsbGVycyAtIHRoaXMub2NjdXBpZWQgPCByb29tT2NjdXBhbmN5KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdXZSBoYXZlIHJ1biBvdXQgb2Ygb2NjdXBpZXJzIScpO1xyXG4gICAgICByb29tT2NjdXBhbmN5ID0gdHJhdmVsbGVycyAtIHRoaXMub2NjdXBpZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvb21PY2N1cGFuY3kgPD0gMCkge1xyXG4gICAgICByb29tT2NjdXBhbmN5ID0gMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9jY3VwaWVkICs9IHJvb21PY2N1cGFuY3k7XHJcbiAgICByZXR1cm4gcm9vbU9jY3VwYW5jeTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZEhvdGVsUm9vbVRvQmFza2V0KFxyXG4gICAgaG90ZWw6IEhvdGVsRGV0YWlscyxcclxuICAgIGhvdGVsUm9vbTogSG90ZWxSb29tLFxyXG4gICAgaG90ZWxRdWVyeTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMsXHJcbiAgICB0cmF2ZWxsZXJzPzogVHJhdmVsbGVyW11cclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKGhvdGVsKTtcclxuICAgIGNvbnNvbGUubG9nKGhvdGVsUm9vbSk7XHJcbiAgICBjb25zb2xlLmxvZyhob3RlbFF1ZXJ5KTtcclxuXHJcbiAgICBpZiAoaG90ZWwudW5hdmFpbGFibGUpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbW9kaWZ5IHRoZSAnc3RhcnREYXRlJyBhbmQgJ2VuZERhdGUnIHByb3BlcnRpZXMgdG8gaGF2ZSBJU08gZm9ybWF0XHJcbiAgICBob3RlbFF1ZXJ5LnN0YXJ0RGF0ZSA9IG5ldyBEYXRlKGhvdGVsUXVlcnkuc3RhcnREYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgaG90ZWxRdWVyeS5lbmREYXRlID0gbmV3IERhdGUoaG90ZWxRdWVyeS5lbmREYXRlKS50b0lTT1N0cmluZygpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBjb3B5IG9mIGhvdGVsUXVlcnkgYW5kIGRlbGV0ZSAnYWR1bHRzJyBwcm9wZXJ0eSBhcyBzZWFyY2hRdWVyeVNjaGVtYSBmb3IgaG90ZWwgKGNvbmZlcm1hKSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgaXQgYmVpbmcgYWRkZWRcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0geyAuLi5ob3RlbFF1ZXJ5IH07XHJcbiAgICBkZWxldGUgc2VhcmNoUXVlcnkuYWR1bHRzO1xyXG5cclxuICAgIGNvbnN0IGRldGFpbFJvb21zOiB7XHJcbiAgICAgIHJhdGVEZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gICAgICByb29tRGVzY3JpcHRpb246IHN0cmluZztcclxuICAgICAgcm9vbUlkOiBzdHJpbmc7XHJcbiAgICAgIHJvb21UeXBlOiBzdHJpbmc7XHJcbiAgICAgIHJhdGVDb2RlOiBzdHJpbmc7XHJcbiAgICAgIGNoZWNrSW46IGFueTtcclxuICAgICAgY2hlY2tPdXQ6IGFueTtcclxuICAgIH1bXSA9IFtdO1xyXG4gICAgZGV0YWlsUm9vbXMucHVzaCh7XHJcbiAgICAgIHJhdGVEZXNjcmlwdGlvbjogaG90ZWxSb29tLnJhdGVEZXNjcmlwdGlvbixcclxuICAgICAgcm9vbURlc2NyaXB0aW9uOiBob3RlbFJvb20ucm9vbURlc2NyaXB0aW9uLFxyXG4gICAgICByb29tSWQ6IGhvdGVsUm9vbS5yb29tSWQsXHJcbiAgICAgIHJvb21UeXBlOiBob3RlbFJvb20ucm9vbVR5cGUsXHJcbiAgICAgIHJhdGVDb2RlOiBob3RlbFJvb20ucmF0ZUNvZGUsXHJcbiAgICAgIGNoZWNrSW46IGhvdGVsUXVlcnkuc3RhcnREYXRlLFxyXG4gICAgICBjaGVja091dDogaG90ZWxRdWVyeS5lbmREYXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgLy8gRU5ULTI0NDcgYWRkIGluIGNodW5rcyB3aXRoIHBlb3BsZSBwZXIgcm9vbVxyXG4gICAgICBjb25zdCBwYXhQZXJSb29tOiBudW1iZXIgPSB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzO1xyXG5cclxuICAgICAgLy8gRU5ULTMwNDggVG8gYmUgY2hhbmdlZCB3aGVuIHRyYXZsbGVycyBmbG93IGFkZGVkXHJcbiAgICAgIGNvbnN0IHJvb21BcnJheSA9IG5ldyBBcnJheSh0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMpLmZpbGwoXHJcbiAgICAgICAgJ1RFU1QnXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IG51bWJlclRvU3BsaXQgPSB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMgPT09IHBheFBlclJvb20gPyAxIDogMjtcclxuICAgICAgY29uc3QgYm9va2VkVHJhdmVsbGVyc0NodW5rcyA9IF8uY2h1bmsodGhpcy50cmF2ZWxsZXJzLCBudW1iZXJUb1NwbGl0KTtcclxuICAgICAgY29uc3QgeyBhZGRyZXNzOiBob3RlbEFhZGRyZXNzIH0gPSBob3RlbDtcclxuICAgICAgY29uc3QgdGVybXNBbmRDb25kaXRpb25zID0gdGhpcy5nZXRUZXJtc0FuZENvbmQoaG90ZWxSb29tLCBob3RlbFF1ZXJ5KTtcclxuICAgICAgLy8gYm9va2VkVHJhdmVsbGVyc0NodW5rcy5mb3JFYWNoKChjaHVuazogVHJhdmVsbGVyW10sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgcm9vbUFycmF5LmZvckVhY2goKGNodW5rOiBUcmF2ZWxsZXJbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHRoaXMuYmFza2V0U2VydmljZS5hZGRUb0Jhc2tldChcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYWR1bHRzOiBudW1iZXJUb1NwbGl0LFxyXG4gICAgICAgICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgICAgICAgICAgc2VydmljZTogaG90ZWwuc291cmNlSWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgaG90ZWxBZGRyZXNzOiB7XHJcbiAgICAgICAgICAgICAgICBzdHJlZXROYW1lOiBob3RlbEFhZGRyZXNzLmFkZHJlc3NMaW5lMSxcclxuICAgICAgICAgICAgICAgIHRvd246IGhvdGVsQWFkZHJlc3MuYWRkcmVzc0xpbmUyLFxyXG4gICAgICAgICAgICAgICAgY291bnR5OiBob3RlbEFhZGRyZXNzLmFkZHJlc3NMaW5lMyxcclxuICAgICAgICAgICAgICAgIHBvc3Rjb2RlOiBob3RlbEFhZGRyZXNzLnBvc3RPclppcENvZGUsXHJcbiAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogaG90ZWxBYWRkcmVzcy5jb3VudHJ5Q29kZVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgaG90ZWxEZXNjcmlwdGlvbjogaG90ZWwuZ3JvdXAsXHJcbiAgICAgICAgICAgICAgaG90ZWxJZDogaG90ZWwuaWQsXHJcbiAgICAgICAgICAgICAgaG90ZWxOYW1lOiBob3RlbC5uYW1lLFxyXG4gICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSAxIGFzIHdlIGJvb2sgMSByb29tIGFzIGEgdGltZVxyXG4gICAgICAgICAgICAgIG51bWJlck9mUm9vbXM6IDEsXHJcbiAgICAgICAgICAgICAgcm9vbXM6IGRldGFpbFJvb21zLFxyXG4gICAgICAgICAgICAgIHRlcm1zQW5kQ29uZDogdGVybXNBbmRDb25kaXRpb25zXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC8vIG5vIGxvbmdlciAqIG5vIG9mIHJvb21zIGFzIGVhY2ggcm9vbSBpcyBhZGRlZCAxIGJ5IDFcclxuICAgICAgICAgICAgcHJpY2U6IGhvdGVsUm9vbS50b3RhbCwgLy8gKiBob3RlbFF1ZXJ5LnJvb21zLFxyXG4gICAgICAgICAgICBjdXJyZW5jeTogaG90ZWxSb29tLmN1cnJlbmN5Q29kZSBhcyBDdXJyZW5jeUNvZGUsXHJcbiAgICAgICAgICAgIHNlYXJjaFF1ZXJ5LFxyXG4gICAgICAgICAgICBvdXRib3VuZERhdGU6IGhvdGVsUXVlcnkuc3RhcnREYXRlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLFxyXG4gICAgICAgICAgLy8gdGhpcyBpcyBhbiBhcnJheSBvZiAxIG9yIDIgdHJhdmVsbGVycyB3aGljaCBnbyBpbiAxIHJvb21cclxuICAgICAgICAgIC8vIGNodW5rXHJcbiAgICAgICAgICBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzW2luZGV4XSB8fCBbXVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gaWYgKGluZGV4ID09PSBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBpZiAoaW5kZXggPT09IHJvb21BcnJheS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGdldFRlcm1zQW5kQ29uZChcclxuICAgIGhvdGVsUm9vbTogSG90ZWxSb29tLFxyXG4gICAgaG90ZWxRdWVyeTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXNcclxuICApIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnUmF0ZSBJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IGhvdGVsUm9vbS5yYXRlRGVzY3JpcHRpb25cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdDYW5jZWxsYXRpb24gUG9saWN5JyxcclxuICAgICAgICB2YWx1ZTogaG90ZWxSb29tLnBvbGljaWVzLmNhbmNlbGxhdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1JhdGUgQ29kZScsXHJcbiAgICAgICAgdmFsdWU6IGhvdGVsUm9vbS5yYXRlQ29kZVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1Jvb20gSW5mb3JtYXRpb24nLFxyXG4gICAgICAgIHZhbHVlOiBob3RlbFJvb20ucm9vbURlc2NyaXB0aW9uXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnRGVwb3NpdCBBbW91bnQnLFxyXG4gICAgICAgIHZhbHVlOlxyXG4gICAgICAgICAgKGhvdGVsUm9vbS50b3RhbCAqIGhvdGVsUXVlcnkucm9vbXMpLnRvU3RyaW5nKCkgKyBob3RlbFF1ZXJ5LmN1cnJlbmN5XHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBzYXZlU2VhcmNoKGhvdGVsTmFtZTogc3RyaW5nID0gbnVsbCk6IE9ic2VydmFibGU8U2F2ZUZhdm91cml0ZVNlYXJjaFJlc3VsdD4ge1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0U2VhcmNoUXVlcnkoKTtcclxuICAgICAgY29uc3QgZmF2b3VyaXRlU2VhcmNoUXVlcnkgPSB0aGlzLnVwZGF0ZVNlcmNoUXVlcnkocXVlcnkpO1xyXG4gICAgICBpZiAoaG90ZWxOYW1lKSBmYXZvdXJpdGVTZWFyY2hRdWVyeS5ob3RlbE5hbWUgPSBob3RlbE5hbWU7XHJcbiAgICAgIGNvbnN0IHNlYXJjaEluZm8gPSB7XHJcbiAgICAgICAgbmFtZTogYCR7bW9tZW50KCl9YCxcclxuICAgICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuSG90ZWwsXHJcbiAgICAgICAgc2VhcmNoQXJnczogZmF2b3VyaXRlU2VhcmNoUXVlcnlcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlLnNhdmVGYXZvdXJpdGVTZWFyY2goc2VhcmNoSW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
1367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsZUFBZSxFQUFRLEVBQUUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUlMLGFBQWEsRUFJYixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFPYiwrQkFBK0IsRUFDL0IsNEJBQTRCLEVBQzdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUtMLGFBQWEsRUFTYixXQUFXLEVBQ1osTUFBTSx3QkFBd0IsQ0FBQztBQWlCaEMsT0FBTyxFQUlMLFlBQVksRUFFWixTQUFTLEVBRVYsTUFBTSx3Q0FBd0MsQ0FBQztBQWlCaEQsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXZCLE1BQU0sQ0FBTixJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIsdUNBQXFCLENBQUE7SUFDckIsK0JBQWEsQ0FBQTtJQUNiLGlDQUFlLENBQUE7QUFDakIsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBRUQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7QUFDakMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFFaEMsTUFBTSxPQUFPLHFCQU9YLFNBQVEsb0JB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b21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQmFzZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuL2Jhc2UtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IEJhc2VTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4vaGVscGVycyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbSwgb2YsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCYXNlRW52aXJvbm1lbnQgfSBmcm9tICcuL2Vudmlyb21lbnQnO1xyXG5pbXBvcnQgeyBCYXNlSG90ZWxBdmFsaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ob3RlbC1hdmFsbGliaWxpdHkuc2VydmljZSc7XHJcbmltcG9ydCB7IFVSTFMgfSBmcm9tICcuLy4uL3NlcnZpY2VzL3VybC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBDb3VudHJ5LFxyXG4gIEhvdGVsUXVvdGVSZXN1bHQsXHJcbiAgSG90ZWxRdW90ZVJlc3VsdEFycmF5LFxyXG4gIExvY2F0aW9uVHlwZXMsXHJcbiAgTmdiRGF0ZVN0cnVjdCxcclxuICBMb2NhdGlvbkRldGFpbHMsXHJcbiAgSG90ZWxBdmFsaWJpbGl0eVF1b3RlUmVzdWx0LFxyXG4gIGluY2x1ZGVkRXhwcmVzc2lvbixcclxuICBleGNsdWRlZEV4cHJlc3Npb24sXHJcbiAgU2VhcmNoSGFuZGxlcixcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgQWlycG9ydFNlYXJjaFJlc3VsdHMsXHJcbiAgSG90ZWxEZXRhaWxzLFxyXG4gIEhvdGVsRGV0YWlsc0FycmF5LFxyXG4gIFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHQsXHJcbiAgT0JUQWlycG9ydERldGFpbHMsXHJcbiAgaW5jbHVkZWRBY2Nlc3NpYmlsaXR5RXhwcmVzc2lvbixcclxuICBEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zXHJcbn0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2tldEl0ZW0sXHJcbiAgQ29uZmVybWFPZmZpY2VOYW1lcyxcclxuICBDb25mZXJtYU9mZmljZUluZm8sXHJcbiAgQ3VycmVuY3lDb2RlLFxyXG4gIERpc3RhbmNlVHlwZXMsXHJcbiAgSG90ZWxMb2NhdGlvbixcclxuICBIb3RlbFJvb20sXHJcbiAgSG90ZWxUYWcsXHJcbiAgUmFpbFN0YXRpb24sXHJcbiAgU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzLFxyXG4gIFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlYXJjaFJhaWxRdWVyeVZhcmlhYmxlcyxcclxuICBTZXJ2aWNlVHlwZVxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VIb3RlbFF1b3RlRmV0Y2hlcixcclxuICBIb3RlbFF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9ob3RlbC1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBGdWxsVXNlckRldGFpbHMsXHJcbiAgVXNlclNlcnZpY2VJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0l1c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXNlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RIdHRwQ2FsbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9odHRwLWNhbGwuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBIb3RlbEF2YWxpbmlsaXR5RmV0Y2hlclR5cGUgfSBmcm9tICcuLi9mZXRjaGVycy9ob3RlbC1hdmFsaWFiaWxpdHktZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0llbnRlcnByaXNlLWJhc2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBBdmFpbGFiaWxpdHlPYmplY3QsXHJcbiAgRGlzcGxheUZpbHRlclNldHRpbmdzLFxyXG4gIEhvdGVsRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZSxcclxuICBIb3RlbEZpbHRlcnMsXHJcbiAgSG90ZWxUZW1wUGFyYW1zLFxyXG4gIEhvdGVsVmlldyxcclxuICBSZXN1bHREZXRhaWxzXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBJQ2hlYXBlc3RQcmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlYXBlc3QtcHJpY2UnO1xyXG5pbXBvcnQgeyBUcmF2ZWxsZXIgfSBmcm9tICcuLi9tb2RlbHMvdHJhdmVsbGVyLm9iamVjdCc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlcixcclxuICBDb25mZXJtYVF1aWNrbGlzdEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvY29uZmVybWEtcXVpY2tsaXN0LmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRSYWlsU3RhdGlvbkZldGNoZXIsXHJcbiAgR2V0UmFpbFN0YXRpb25GZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC1yYWlsLXN0YXRpb24uZmV0Y2hlcic7XHJcbmltcG9ydCB7IEhvdGVsUmVjZW50U2VhcmNoQXJncyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaG90ZWwtcmVjZW50LXNlYXJjaC1hcmdzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IHJlc3VsdCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7XHJcbiAgQXBwbHlIb3RlbFJ1bGVzRmV0Y2hlclR5cGUsXHJcbiAgQmFzZUhvdGVsUnVsZXNGZXRjaGVyXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvYXBwbHktSklULWhvdGVsLXJ1bGVzLmZldGNoZXInO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuZXhwb3J0IGVudW0gU29ydFR5cGVzSG90ZWwge1xyXG4gIGRpc3RhbmNlID0gJ2Rpc3RhbmNlJyxcclxuICBuYW1lID0gJ25hbWUnLFxyXG4gIHByaWNlID0gJ3ByaWNlJ1xyXG59XHJcblxyXG5jb25zdCBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFID0gMTtcclxuY29uc3QgQUdFTlRfUFJFRkVSUkVEX1ZBTFVFID0gMjtcclxuXHJcbmV4cG9ydCBjbGFzcyBIb3RlbEVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBIUV9RIGV4dGVuZHMgSG90ZWxRdW90ZUZldGNoZXJUeXBlLFxyXG4gICAgSEFfUSBleHRlbmRzIEhvdGVsQXZhbGluaWxpdHlGZXRjaGVyVHlwZSxcclxuICAgIFFMX1EgZXh0ZW5kcyBDb25mZXJtYVF1aWNrbGlzdEZldGNoZXJUeXBlLFxyXG4gICAgR1JTX1EgZXh0ZW5kcyBHZXRSYWlsU3RhdGlvbkZldGNoZXJUeXBlLFxyXG4gICAgSFJfUSBleHRlbmRzIEFwcGx5SG90ZWxSdWxlc0ZldGNoZXJUeXBlXHJcbiAgPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBIb3RlbFRlbXBQYXJhbXMsXHJcbiAgICBIb3RlbFF1b3RlUmVzdWx0QXJyYXksXHJcbiAgICBIb3RlbERldGFpbHNBcnJheVxyXG4gID5cclxuICBpbXBsZW1lbnRzIEhvdGVsRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZVxyXG57XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9QQVJBTVMgPSAnc2VhcmNoX2hvdGVsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAncmVzdWx0c19ob3RlbCc7XHJcblxyXG4gIHB1YmxpYyB0eXBlOiBTZXJ2aWNlVHlwZSA9IFNlcnZpY2VUeXBlLkhvdGVsO1xyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcbiAgcHVibGljIGxvY2F0aW9uX3R5cGVzOiBCZWhhdmlvclN1YmplY3Q8TG9jYXRpb25UeXBlc1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XHJcbiAgICBMb2NhdGlvblR5cGVzW11cclxuICA+KFtdKTtcclxuICBwdWJsaWMgb2ZmaWNlczogQmVoYXZpb3JTdWJqZWN0PExvY2F0aW9uVHlwZXNbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgTG9jYXRpb25UeXBlc1tdXHJcbiAgPihbXSk7XHJcbiAgcHVibGljIGxhc3RBY3RpdmVQYWdlOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XHJcbiAgcHVibGljIGppdFJ1bGVzUmVjZWl2ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgcmVhZG9ubHkgZ2FsbGVyaWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcclxuICBwcml2YXRlIG9jY3VwaWVkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgcmVzdWx0c19kZXRhaWxzOiBSZXN1bHREZXRhaWxzID0ge1xyXG4gICAgY2hhaW5zOiBuZXcgU2V0PHN0cmluZz4oKSxcclxuICAgIGFtZW5pdGllczogW10sXHJcbiAgICBtYXhEaXN0YW5jZTogMFxyXG4gIH07XHJcbiAgcHJpdmF0ZSBfY2hlY2tpbl9kYXRlX25nYjogTmdiRGF0ZVN0cnVjdDtcclxuICBwcml2YXRlIF9jaGVja291dF9kYXRlX25nYjogTmdiRGF0ZVN0cnVjdDtcclxuICBwcml2YXRlIF9ib29rZWRUcmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXSA9IFtdO1xyXG5cclxuICBnZXQgY2hhaW5zKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zXTtcclxuICB9XHJcblxyXG4gIGdldCBhbWVuaXRpZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnJlc3VsdHNfZGV0YWlscy5hbWVuaXRpZXNdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1heERpc3RhbmNlKCk6IG51bWJlciB7XHJcbiAgICB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZS5tYXggPSBNYXRoLmNlaWwoXHJcbiAgICAgIE1hdGgubWF4LmFwcGx5KFxyXG4gICAgICAgIE1hdGgsXHJcbiAgICAgICAgdGhpcy5yZXN1bHRzLnZhbHVlLm1hcCgobykgPT4gby5sb2NhdGlvbi5kaXN0YW5jZSlcclxuICAgICAgKVxyXG4gICAgKTtcclxuICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlID0gdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4O1xyXG4gICAgcmV0dXJuIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1heFByaWNlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuZmlsdGVycy5wcmljZVJhbmdlLm1heCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVuY3koKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3k7XHJcbiAgfVxyXG5cclxuICBzZXQgY3VycmVuY3kodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5ID0gdmFsdWU7XHJcbiAgfVxyXG4gIC8vIEV2ZW50IEVtaXR0ZXJzXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZTogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuICBwdWJsaWMgc2VsZWN0SXRlbU1hcFZpZXc6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHB1YmxpYyBkaXNwbGF5OiBEaXNwbGF5RmlsdGVyU2V0dGluZ3MgPSB7XHJcbiAgICBtaW5wcmljZTogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFxyXG4gICAgbWF4cHJpY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcclxuICAgIGZpbHRlcnM6IHtcclxuICAgICAgYnJlYWtmYXN0VHlwZTogW11cclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyBwdWJsaWMgdmFyaWFibGVzXHJcbiAgcHVibGljIG1pbl9kYXRlID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLCAvLyBuZ2JEYXRlIG1vbnRocyBhcmUgbm90IDAgaW5kZXhlZFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKClcclxuICB9O1xyXG5cclxuICBwdWJsaWMgbWluX3JldHVybl9kYXRlID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLCAvLyBuZ2JEYXRlIG1vbnRocyBhcmUgbm90IDAgaW5kZXhlZFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKCkgKyAxIC8vIG1pbiAxIG5pZ2h0IHN0YXlcclxuICB9O1xyXG5cclxuICAvLyBwcml2YXRlIHZhcmlhYmxlc1xyXG4gIC8vIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGltZXMgaGVyZSAtIG1heWJlIG5vcm1hbGlzZSB0aGVzZSBpbiB0aGUgcmVxdWVzdCBib2R5P1xyXG5cclxuICBwcml2YXRlIGxvY2FsRmlsdGVycyA9IG5ldyBIb3RlbEZpbHRlcnMoKTtcclxuXHJcbiAgcHVibGljIGN1cnJlbnRWaWV3OiBIb3RlbFZpZXcgPSBIb3RlbFZpZXcuTElTVDtcclxuXHJcbiAgLy8gRm9yIE5nRm9yaW5nIG92ZXIgaW4gdGhlIHRlbXBsYXRlc1xyXG4gIHByaXZhdGUgX21heF9ub19vZl9yb29tcyA9IDQ7XHJcbiAgcHJpdmF0ZSBfbWF4X3Jvb21zX2FycmF5ID0gbmV3IEFycmF5KHRoaXMuX21heF9ub19vZl9yb29tcykuZmlsbCgwKTtcclxuICBwcml2YXRlIF9tYXhfbm9fb2Zfb2NjdXBhbnRzID0gODtcclxuICBwcml2YXRlIF9tYXhfb2NjdXBhbnRfYXJyYXkgPSBuZXcgQXJyYXkodGhpcy5fbWF4X25vX29mX29jY3VwYW50cykuZmlsbCgwKTtcclxuICBwcml2YXRlIF9kaXN0YW5jZV9saXN0ID0gWzEsIDIsIDUsIDEwLCAyMCwgMjVdOyAvLyBjb3BpZWQgZnJvbSBvbGQgZnJvbnRlbmQgZm9yIG5vd1xyXG4gIHByaXZhdGUgX2RlZmF1bHRfY3VycmVuY3k6IGFueSA9IG51bGw7XHJcblxyXG4gIC8vIGdldHRlcnMgYW5kIHNldHRlcnNcclxuXHJcbiAgZ2V0IGNoZWNraW5fZGF0ZV9uZ2IoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tpbl9kYXRlX25nYjtcclxuICB9XHJcblxyXG4gIHNldCBjaGVja2luX2RhdGVfbmdiKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9jaGVja2luX2RhdGVfbmdiID0gdmFsdWU7XHJcblxyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudCh2YWx1ZSk7XHJcbiAgICB0aGlzLmNoZWNraW5fZGF0ZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2hlY2tvdXRfZGF0ZV9uZ2IoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tvdXRfZGF0ZV9uZ2I7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hlY2tvdXRfZGF0ZV9uZ2IodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX2NoZWNrb3V0X2RhdGVfbmdiID0gdmFsdWU7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudCh2YWx1ZSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2hlY2tpbl9kYXRlKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hlY2tpbl9kYXRlKG5ld0RhdGU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIGlmIChuZXdEYXRlICYmIG5ld0RhdGUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUgPSBtb21lbnQobmV3RGF0ZSk7XHJcbiAgICAgIHRoaXMuX2NoZWNraW5fZGF0ZV9uZ2IgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUobmV3RGF0ZSk7XHJcbiAgICAgIGlmIChuZXdEYXRlLmlzU2FtZU9yQmVmb3JlKHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlKSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9IG1vbWVudChuZXdEYXRlKS5hZGQoMSwgJ2RheScpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjaGVja291dF9kYXRlKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNrb3V0X2RhdGUobmV3RGF0ZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgLy8gaWYgKG5ld0RhdGUuaXNTYW1lT3JCZWZvcmUodGhpcy5jaGVja2luX2RhdGUpKSB7ICAvLyBub3QgYWxsb3dlZFxyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcbiAgICBpZiAobmV3RGF0ZSAmJiBuZXdEYXRlLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZSA9IG5ld0RhdGU7XHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZV9uZ2IgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUobmV3RGF0ZSk7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBub19vZl9yb29tcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcztcclxuICB9XHJcblxyXG4gIHNldCBub19vZl9yb29tcyhuZXdSb29tczogbnVtYmVyKSB7XHJcbiAgICBpZiAobmV3Um9vbXMgPiA0IHx8IG5ld1Jvb21zIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm5vX29mX3Jvb21zID0gbmV3Um9vbXM7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgbm9fb2Zfb2NjdXBhbnRzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50cztcclxuICB9XHJcblxyXG4gIHNldCBub19vZl9vY2N1cGFudHMobmV3T2NjOiBudW1iZXIpIHtcclxuICAgIGlmIChuZXdPY2MgPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzID0gbmV3T2NjO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRlZmF1bHRfY3VycmVuY3koKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3k7XHJcbiAgfVxyXG5cclxuICBzZXQgZGVmYXVsdF9jdXJyZW5jeShjdXJyZW5jeTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3kgPSBjdXJyZW5jeTtcclxuICB9XHJcblxyXG4gIC8vIG1heSBoYXZlIHRvIG1vZGlmeSB0aGVzZVxyXG4gIGdldCBsb2NhdGlvbigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBsb2NhdGlvbihuZXdMb2M6IGFueSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uID0gbmV3TG9jO1xyXG5cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBmb3JtYXR0ZWRfbG9jYXRpb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25cclxuICAgICAgPyB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24uZGVzdGluYXRpb25cclxuICAgICAgOiAnTm8gTG9jYXRpb24gU2V0JzsgLy8gVE9ETyAtICBleHBhbmQgdGhpcyBmb3IgZGlmZmVyZW50IHR5cGVzXHJcbiAgfVxyXG5cclxuICBnZXQgZGlzdGFuY2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuZGlzdGFuY2U7XHJcbiAgfVxyXG5cclxuICBzZXQgZGlzdGFuY2UobmV3RGlzdDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuZGlzdGFuY2UgPSBuZXdEaXN0O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByZWZlcmVkX2hvdGVsc19vbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJlZF9ob3RlbHNfb25seTtcclxuICB9XHJcblxyXG4gIHNldCBwcmVmZXJlZF9ob3RlbHNfb25seShuZXdQcmVmOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucHJlZmVyZWRfaG90ZWxzX29ubHkgPSBuZXdQcmVmO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvdW50cnkoKTogQ291bnRyeSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNvdW50cnk7XHJcbiAgfVxyXG5cclxuICBzZXQgY291bnRyeShuZXdDb250OiBDb3VudHJ5KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY291bnRyeSA9IG5ld0NvbnQ7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zdGNvZGUoKTogTG9jYXRpb25EZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucG9zdGNvZGU7XHJcbiAgfVxyXG5cclxuICBzZXQgcG9zdGNvZGUocG9zdGNvZGU6IExvY2F0aW9uRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnBvc3Rjb2RlID0gcG9zdGNvZGU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdHJhaW5zU3RhdGlvbigpOiBMb2NhdGlvbkRldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy50cmFpbnNTdGF0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHRyYWluc1N0YXRpb24oc3RhdGlvbjogTG9jYXRpb25EZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbiA9IHN0YXRpb247XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgb2ZmaWNlKCk6IENvbmZlcm1hT2ZmaWNlTmFtZXMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5vZmZpY2U7XHJcbiAgfVxyXG5cclxuICBzZXQgb2ZmaWNlKG9mZmljZTogQ29uZmVybWFPZmZpY2VOYW1lcykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm9mZmljZSA9IG9mZmljZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8vIEFkZGl0aW9uYWwgVmFyaWFibGVzXHJcbiAgZ2V0IGhvdGVsX25hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuaG90ZWxfbmFtZTtcclxuICB9XHJcblxyXG4gIHNldCBob3RlbF9uYW1lKG5ld05hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmhvdGVsX25hbWUgPSBuZXdOYW1lO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhvdGVsX2NoYWluKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmhvdGVsX2NoYWluO1xyXG4gIH1cclxuXHJcbiAgc2V0IGhvdGVsX2NoYWluKG5ld0NoYWluOiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9jaGFpbiA9IG5ld0NoYWluO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0dGVycyBPbmx5XHJcblxyXG4gIGdldCBtYXhfcm9vbXNfYXJyYXkoKTogbnVtYmVyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heF9yb29tc19hcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhfb2NjdXBhbnRfYXJyYXkoKTogbnVtYmVyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heF9vY2N1cGFudF9hcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhfbm9fb2Zfcm9vbXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhfbm9fb2Zfcm9vbXM7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzdGFuY2VfbGlzdCgpOiBudW1iZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzdGFuY2VfbGlzdDtcclxuICB9XHJcblxyXG4gIGdldCBsb2NhdGlvbl90eXBlX3NlbGVjdCgpOiBMb2NhdGlvblR5cGVzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3Q7XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb25fdHlwZV9zZWxlY3QodmFsdWU6IExvY2F0aW9uVHlwZXMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcnMoKTogSG90ZWxGaWx0ZXJzIHtcclxuICAgIHJldHVybiB0aGlzLmxvY2FsRmlsdGVycztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBob3RlbEZldGNoZXI6IEJhc2VIb3RlbFF1b3RlRmV0Y2hlcjxIUV9RPixcclxuICAgIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgcHJpdmF0ZSBlbnZpcm9ubWVudDogQmFzZUVudmlyb25tZW50LFxyXG4gICAgcHJpdmF0ZSBhdmFsaWFiaWxpdHlTZXJ2aWNlOiBCYXNlSG90ZWxBdmFsaWJpbGl0eVNlcnZpY2U8SEFfUT4sXHJcbiAgICBwcml2YXRlIGJhc2tldFNlcnZpY2U6IEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgc3RvcmFnZVNlcnZpY2U6IEJhc2VTdG9yYWdlU2VydmljZSxcclxuICAgIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwQ2FsbFNlcnZpY2U6IEFic3RyYWN0SHR0cENhbGxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBxdWlja0xpc3RGZXRjaGVyOiBCYXNlU2VhcmNoQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyPFFMX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRSYWlsU3RhdGlvbkZldGNoZXI6IEJhc2VHZXRSYWlsU3RhdGlvbkZldGNoZXI8R1JTX1E+LFxyXG4gICAgcHJpdmF0ZSBhcHBseUhvdGVsUnVsZXNGZXRjaGVyOiBCYXNlSG90ZWxSdWxlc0ZldGNoZXI8SFJfUT5cclxuICApIHtcclxuICAgIHN1cGVyKHN0b3JhZ2VTZXJ2aWNlLCBoZWxwZXJzLCBzZWFyY2hTZXJ2aWNlKTtcclxuICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgY29uc3QgZGF0YToge1xyXG4gICAgICB0ZW1wUGFyYW1zOiBIb3RlbFRlbXBQYXJhbXM7XHJcbiAgICB9ID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEhvdGVsRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgdGVtcFBhcmFtczoge30gYXMgSG90ZWxUZW1wUGFyYW1zXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGVmYXVsdF9jdXJyZW5jeSA9IHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeVxyXG4gICAgICA/IHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeVxyXG4gICAgICA6IHRoaXMuX2RlZmF1bHRfY3VycmVuY3k7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXMoc2VhcmNoU2VydmljZS5tYWtlSG90ZWxRdWVyeShkYXRhLnRlbXBQYXJhbXMpKTtcclxuXHJcbiAgICBpZiAoc2VhcmNoU2VydmljZS5zaG91bGRBZGRUcmF2ZWxsZXJTdWJzY3JpcHRpb24oKSkge1xyXG4gICAgICBzZWFyY2hTZXJ2aWNlLnRyYXZlbGxlckluZm9ybWF0aW9uLnN1YnNjcmliZShcclxuICAgICAgICAodHJhdmVsbGVyczogVHJhdmVsbGVyW10pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICBjb25zdCBzcGxpdFRyYXZlbGxlcnMgPSB0aGlzLmhlbHBlcnMuc2VsZWN0ZWRUcmF2ZWxsZXJzKFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXJzLFxyXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5Ib3RlbFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHMgPSBzcGxpdFRyYXZlbGxlcnMuYWR1bHRzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdHMgPVxyXG4gICAgICBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbUFzTGlzdDxIb3RlbERldGFpbHNBcnJheT4oXHJcbiAgICAgICAgdGhpcy5yZXN1bHRzU2Vzc2lvbk5hbWVcclxuICAgICAgKSB8fCBbXTtcclxuICAgIHJlc3VsdHNcclxuICAgICAgLnNsaWNlKDAsIHRoaXMuZW52aXJvbm1lbnQubnVtYmVySG90ZWxUb1ByZWxvYWQpXHJcbiAgICAgIC5mb3JFYWNoKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoU2VydmljZS5jYW5Cb29rKFNlcnZpY2VUeXBlLkhvdGVsKSkge1xyXG4gICAgICAgICAgLy8gbmVlZCB0aGlzIGNoZWNrIGJlY2F1c2Ugb24gcmVmcmVzaCB3ZSBhcmUgZ2V0dGluZyBlcnJvcnMgLSB0aGVvcnkgdGhhdCB1c2VyIGhhc24ndCBmdWxseSBsb2FkZWQgaW4geWV0XHJcbiAgICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5Rm9ySWQoXHJcbiAgICAgICAgICAgIHRoaXMubWFrZUhvdGVsQXZhbGlsaXR5T2JqZWN0KGhvdGVsKSxcclxuICAgICAgICAgICAgaG90ZWxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKGhvdGVsUmVzdWx0OiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zLmFkZChob3RlbFJlc3VsdC5ncm91cCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZnVsbFJlc3VsdHMgPSByZXN1bHRzO1xyXG4gICAgdGhpcy5qaXRSdWxlc1JlY2VpdmVkLm5leHQoZmFsc2UpO1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcblxyXG4gICAgdGhpcy51c2VyU2VydmljZS5jaGFuZ2VVc2VyLnN1YnNjcmliZSgodXNlcjogUGFydGlhbDxGdWxsVXNlckRldGFpbHM+KSA9PiB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25fdHlwZXMubmV4dChbXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5BaXJwb3J0LFxyXG4gICAgICAgIExvY2F0aW9uVHlwZXMuQ2l0eSxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLk9mZmljZSxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLlNob3J0bGlzdCxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvblxyXG4gICAgICBdKTtcclxuICAgICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkRmV0Y2hBbGxPZmZpY2VzKCkpIHtcclxuICAgICAgICB0aGlzLm9mZmljZXMubmV4dChbXSk7IC8vIFRPRE8gZmV0Y2ggb2ZmaWNlc1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycyA9IG5ldyBIb3RlbEZpbHRlcnMoKTtcclxuXHJcbiAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZmV0Y2hpbmcuc3Vic2NyaWJlKChpc0ZldGNoaW5nOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIGlmICghaXNGZXRjaGluZykge1xyXG4gICAgICAgIC8vIFdlJ3ZlIGp1c3QgZmluaXNoZWQgZmV0Y2hpbmcgYXZhbGliaWxpdHkgc28gdXBkYXRlIGZpbHRlcnMuXHJcblxyXG4gICAgICAgIGNvbnN0IG1heE51bWJlciA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5tYXhQcmljZUZvckN1cnJlbmN5KCdHQlAnKTtcclxuICAgICAgICBpZiAobWF4TnVtYmVyID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UubWF4ID0gbWF4TnVtYmVyO1xyXG4gICAgICAgICAgdGhpcy5sb2NhbEZpbHRlcnMucHJpY2VSYW5nZS5tYXggPSBtYXhOdW1iZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NoZWFwZXN0UmVzdWx0UHJpY2UgPSB0aGlzLnVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHMpO1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFNlcnZpY2UuY2FuQm9vayhTZXJ2aWNlVHlwZS5Ib3RlbCkpIHtcclxuICAgICAgICAgIC8vIG5lZWQgdGhpcyBjaGVjayBiZWNhdXNlIG9uIHJlZnJlc2ggd2UgYXJlIGdldHRpbmcgZXJyb3JzIC0gdGhlb3J5IHRoYXQgdXNlciBoYXNuJ3QgZnVsbHkgbG9hZGVkIGluIHlldFxyXG4gICAgICAgICAgdGhpcy5fYXBwbHlUcmF2ZWxSdWxlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcHJvY2Vzc1Jlc3VsdHMocmVzdWx0c1RvTWFwOiBIb3RlbFF1b3RlUmVzdWx0QXJyYXkpIHtcclxuICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlID0gMDtcclxuICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgcmV0dXJuIHJlc3VsdHNUb01hcC5tYXAoXHJcbiAgICAgIChob3RlbFJlc3VsdDogSG90ZWxRdW90ZVJlc3VsdCwgaW5kZXg6IG51bWJlcik6IEhvdGVsRGV0YWlscyA9PiB7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2UgPSBNYXRoLm1heChcclxuICAgICAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlLFxyXG4gICAgICAgICAgaG90ZWxSZXN1bHQubG9jYXRpb24uZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlLm1heCA9IHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlO1xyXG4gICAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucy5hZGQoaG90ZWxSZXN1bHQuZ3JvdXApO1xyXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuZW52aXJvbm1lbnQubnVtYmVySG90ZWxUb1ByZWxvYWQpIHtcclxuICAgICAgICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlGb3JJZChcclxuICAgICAgICAgICAgdGhpcy5tYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWxSZXN1bHQpLFxyXG4gICAgICAgICAgICBob3RlbFJlc3VsdFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5nZXRIb3RlbEF2YWlsYWJpbGl0eShob3RlbFJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNvcnRlZFRhZ3M6IHRoaXMuc29ydFRhZ3MoaG90ZWxSZXN1bHQudGFncyksXHJcbiAgICAgICAgICBEZXRhaWxzOiB7XHJcbiAgICAgICAgICAgIGRpc3RhbmNlX2FpcnBvcnQ6IDAsXHJcbiAgICAgICAgICAgIGRpc3RhbmNlX21ldHJvOiAwLFxyXG4gICAgICAgICAgICBkaXN0YW5jZV9yYWlsOiAwLFxyXG4gICAgICAgICAgICBhaXJwb3J0X2RldGFpbHM6IHsgbmFtZTogJ05vdCByZXR1cm5lZCcgfSxcclxuICAgICAgICAgICAgbWV0cm9fZGV0YWlsczogeyBuYW1lOiAnTm90IHJldHVybmVkJyB9LFxyXG4gICAgICAgICAgICByYWlsX2RldGFpbHM6IHsgbmFtZTogJ05vdCByZXR1cm5lZCcgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC8vIGF2aWxhYmlsaXR5OiB0aGlzLmhvdGVsX2F2YWlsYWJpbGl0eSxcclxuICAgICAgICAgIC4uLmhvdGVsUmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHJlc3VsdHNTZXNzaW9uTmFtZSA9IEhvdGVsRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUkVTVUxUUztcclxuICBwcm90ZWN0ZWQgbXVsdGlSZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG5cclxuICBwcml2YXRlIHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyA9IHt9IGFzIFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzO1xyXG5cclxuICBwcml2YXRlIF9hcHBseVRyYXZlbFJ1bGVzKCkge1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuaGVscGVyc1xyXG4gICAgICAuY2xvbmUodGhpcy5mdWxsUmVzdWx0cyB8fCBbXSlcclxuICAgICAgLm1hcCgoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UudXBkYXRlSG90ZWwoaG90ZWwpO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGhvdGVsLmF2YWlsYWJsZVJhdGVzIHx8IHt9KS5sZW5ndGggPiAwO1xyXG4gICAgICB9KTtcclxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGx5SG90ZWxSdWxlc0ZldGNoZXJcclxuICAgICAgLmZldGNoS2V5ZWRPYmplY3QoJ2lkJywge1xyXG4gICAgICAgIGRhdGFcclxuICAgICAgfSlcclxuICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTE6IFJlY29yZDxzdHJpbmcsIEhvdGVsRGV0YWlscz4pID0+IHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJSZXN1bHRzID0gdGhpcy5yZXN1bHRzRmlsdGVyTWV0aG9kKHRoaXMuZnVsbFJlc3VsdHMpO1xyXG4gICAgICAgIGNvbnN0IHRyYXZsZVJlc3VsdHMgPSBmaWx0ZXJSZXN1bHRzLm1hcCgoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGExW2hvdGVsLmlkXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLnNldEhvdGVsQXZhbGFiaWxpdHkoXHJcbiAgICAgICAgICAgICAgZGF0YTFbaG90ZWwuaWRdXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gaG90ZWw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdHJhdmxlUmVzdWx0cy5mb3JFYWNoKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaG90ZWwuYXZhaWxhYmxlUmF0ZXMpIHtcclxuICAgICAgICAgICAgaG90ZWwuaml0UmVtb3ZlUmVzdWx0UnVsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmppdFJ1bGVzUmVjZWl2ZWQubmV4dCh0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGhvdGVsLmppdFJlbW92ZVJlc3VsdFJ1bGUgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlc3VsdHMubmV4dCh0cmF2bGVSZXN1bHRzKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIG1ha2VMb2NhdGlvbnMobG9jYXRpb246IEhvdGVsTG9jYXRpb25bXSk6IHsgW2tleTogc3RyaW5nXTogSG90ZWxMb2NhdGlvbltdIH0ge1xyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5hcnJheVRvT2JqZWN0QXJyYXk8XHJcbiAgICAgIEhvdGVsTG9jYXRpb24sXHJcbiAgICAgIFJlY29yZDxzdHJpbmcsIEhvdGVsTG9jYXRpb25bXT5cclxuICAgID4obG9jYXRpb24sIFsnZGlzdGFuY2VUeXBlJ10pO1xyXG4gIH1cclxuXHJcbiAgc29ydFRhZ3ModGFnczogSG90ZWxUYWdbXSk6IGFueVtdIHtcclxuICAgIGlmICh0YWdzKSB7XHJcbiAgICAgIHJldHVybiBbLi4udGFnc11cclxuICAgICAgICAuc29ydCgoYTogSG90ZWxUYWcsIGI6IEhvdGVsVGFnKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYS5uYW1lIDwgYi5uYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS5uYW1lID4gYi5uYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAubWFwKCh0YWc6IEhvdGVsVGFnKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50YWcsXHJcbiAgICAgICAgICAgIGljb246IHRoaXMuZW52aXJvbm1lbnQudGFnTWFwW3RhZy5uYW1lXSB8fCB0YWcuaWNvblxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXNldFF1ZXJ5KCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlSG90ZWxRdWVyeSgpKTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzID0gbmV3IEhvdGVsRmlsdGVycygpO1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMgPSB7XHJcbiAgICAgIGNoYWluczogbmV3IFNldDxzdHJpbmc+KCksXHJcbiAgICAgIGFtZW5pdGllczogW10sXHJcbiAgICAgIG1heERpc3RhbmNlOiAwXHJcbiAgICB9O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNWYWxpZCgpIHtcclxuICAgIGlmICghdGhpcy5kb0NoZWNrcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB0aGlzLnRlbXBQYXJhbXNcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLm1pbl9yZXR1cm5fZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZVxyXG4gICAgKTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZS5pc1NhbWVPckFmdGVyKHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9IG1vbWVudCh0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlKS5hZGQoMSwgJ2RheScpOyAvLyBlbnN1cmUgdGhhdCBjaGVja291dCBkYXRlIGlzIG1pbiAxIGRheSBhZnRlciBjaGVja2luIGRhdGVcclxuICAgIH1cclxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3QpIHtcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkNpdHk6XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnkpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgY291bnRyeScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMubG9jYXRpb24gJiYgIXRoaXMucG9zdGNvZGUpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgICAgICdQbGVhc2Ugc2VsZWN0IGEgaG90ZWwgbG9jYXRpb24gb3IgZW50ZXIgYSBwb3N0Y29kZS4nXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5PZmZpY2U6XHJcbiAgICAgICAgaWYgKHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbj8udHlwZSAhPT0gJ09mZmljZScgJiYgIXRoaXMub2ZmaWNlKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGFuIG9mZmljZS4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICBpZiAodGhpcy50ZW1wUGFyYW1zPy5sb2NhdGlvbikge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24uYWlycG9ydD8uZ2F0ZXdheSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgYWlycG9ydC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgYWlycG9ydC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjpcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uPy5yYWlsc3RhdGlvbj8uc3RhdGlvbkNvZGUgJiZcclxuICAgICAgICAgICF0aGlzLnRyYWluc1N0YXRpb24/LnN0YXRpb25Db2RlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgdHJhaW4gc3RhdGlvbi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuU2hvcnRsaXN0OlxyXG4gICAgICAgIGlmICghdGhpcy5jb3VudHJ5KSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGNvdW50cnknKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgJiZcclxuICAgICAgdGhpcy5jaGVja291dF9kYXRlLmlzU2FtZU9yQmVmb3JlKHRoaXMuY2hlY2tpbl9kYXRlKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ0NoZWNrb3V0IGRhdGUgbXVzdCBiZSBhZnRlciBjaGVja2luIGRhdGUnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGVja291dF9kYXRlICYmIHRoaXMuY2hlY2tvdXRfZGF0ZS5pc0JlZm9yZShtb21lbnQoKSkpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnQ2hlY2tvdXQgZGF0ZSBtdXN0IG5vdCBiZSBpbiB0aGUgcGFzdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoZWNraW5fZGF0ZSAmJiB0aGlzLmNoZWNraW5fZGF0ZS5pc0JlZm9yZShtb21lbnQoKSkpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnQ2hlY2tpbiBkYXRlIG11c3Qgbm90IGJlIGluIHRoZSBwYXN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgJiZcclxuICAgICAgdGhpcy5jaGVja2luX2RhdGUgJiZcclxuICAgICAgdGhpcy5jaGVja2luX2RhdGUuaXNBZnRlcih0aGlzLmNoZWNrb3V0X2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAnQ2hlY2tvdXQgZGF0YSBtdXN0IGJlIGFmdGVyIHRoZSBjaGVja2luIGRhdGUnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRpbmcgT2NjdXBhbmN5XHJcbiAgICBjb25zdCBvY2N1cGFuY3kgPSB0aGlzLm5vX29mX29jY3VwYW50cyAvIHRoaXMubm9fb2Zfcm9vbXM7XHJcbiAgICBpZiAoIShvY2N1cGFuY3kgPT09IDEgfHwgb2NjdXBhbmN5ID09PSAyKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdPY2N1cGFudHMgcGVyIHJvb20gbXVzdCBiZSAxIG9yIDI7IGlmIHlvdSBoYXZlIGFuIG9kZCBudW1iZXIgb2YgdHJhdmVsbGVycyAoZ3JlYXRlciB0aGFuIG9uZSk7IHRoZSBubyBvZiByb29tcyBtdXN0IGJlIGVxdWFsJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICAgIHRoaXMuaXNWYWxpZC5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB0aGlzLm1lc3NhZ2VzLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2goKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChbXSk7XHJcbiAgICB0aGlzLmppdFJ1bGVzUmVjZWl2ZWQubmV4dChmYWxzZSk7XHJcbiAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UucmVzZXQoKTtcclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgdGhpcy5fb3JpZ2luYWxVc2VyU2VhcmNoID0gT2JqZWN0LmZyZWV6ZShcclxuICAgICAgICB0aGlzLmhlbHBlcnMuY2xvbmUodGhpcy50ZW1wUGFyYW1zKVxyXG4gICAgICApO1xyXG4gICAgICAvLyBidWlsZCB0aGUgcXVlcnlcclxuICAgICAgdGhpcy5idWlsZFF1ZXJ5KCk7XHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZVJlY2VudFNlYXJjaChcclxuICAgICAgICB0aGlzLmdldFJlY2VudFNlYXJjaFF1ZXJ5KHRoaXMuZ2V0U2VhcmNoUXVlcnkoKSlcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0U2VhcmNoKFxyXG4gICAgICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9PT0gTG9jYXRpb25UeXBlcy5TaG9ydGxpc3RcclxuICAgICAgICAgID8gdGhpcy5xdWlja0xpc3RGZXRjaGVyLmZldGNoTGlzdCh7IGNvdW50cnlDb2RlOiB0aGlzLmNvdW50cnkuY0NvZGUgfSlcclxuICAgICAgICAgIDogdGhpcy5ob3RlbEZldGNoZXIuZmV0Y2hMaXN0KHF1ZXJ5KVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZWNlbnRTZWFyY2hRdWVyeShcclxuICAgIHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlc1xyXG4gICk6IFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyB7XHJcbiAgICBjb25zdCByZWNlbnRTZWFyY2hRdWVyeSA9IHRoaXMudXBkYXRlU2VyY2hRdWVyeShxdWVyeSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VydmljZVR5cGU6IFNlcnZpY2VUeXBlLkhvdGVsLFxyXG4gICAgICBzZWFyY2hBcmdzOiByZWNlbnRTZWFyY2hRdWVyeSxcclxuICAgICAgdHJhdmVsRGF0ZTogdGhpcy5jaGVja2luX2RhdGUuZm9ybWF0KCksXHJcbiAgICAgIHRyYXZlbGxlcnM6IHRoaXMuaGVscGVycy5nZXRUcmF2ZWxsZXJzSWQodGhpcy50cmF2ZWxsZXJzKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2VyY2hRdWVyeShcclxuICAgIHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlc1xyXG4gICk6IEhvdGVsUmVjZW50U2VhcmNoQXJncyB7XHJcbiAgICBjb25zdCBzZWFyY2hRdWVyeTogSG90ZWxSZWNlbnRTZWFyY2hBcmdzID0gcXVlcnk7XHJcbiAgICBzZWFyY2hRdWVyeS5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3Q7XHJcbiAgICBpZiAodGhpcy5sb2NhdGlvbj8ubmFtZSkge1xyXG4gICAgICBzZWFyY2hRdWVyeS5jaXR5TmFtZSA9IHRoaXMubG9jYXRpb24ubmFtZTtcclxuICAgIH1cclxuICAgIHN3aXRjaCAoc2VhcmNoUXVlcnkubG9jYXRpb25fdHlwZV9zZWxlY3QpIHtcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTpcclxuICAgICAgICBzZWFyY2hRdWVyeS5vZmZpY2VOYW1lID0gdGhpcy5vZmZpY2UubmFtZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjpcclxuICAgICAgICBzZWFyY2hRdWVyeS50cmFpbnNTdGF0aW9uRGV0YWlsID0gdGhpcy50cmFpbnNTdGF0aW9uO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICBzZWFyY2hRdWVyeS5haXJwb3J0RGV0YWlsID0gdGhpcy5sb2NhdGlvbi5haXJwb3J0O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZWFyY2hRdWVyeTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydFJlY2VudFNlYXJjaChyZWNlbnRTZWFyY2g6IFJlY2VudFNlYXJjaCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxvY2F0aW9uX3R5cGVfc2VsZWN0O1xyXG4gICAgdGhpcy5jdXJyZW5jeSA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmN1cnJlbmN5O1xyXG4gICAgdGhpcy5kaXN0YW5jZSA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmRpc3RhbmNlO1xyXG4gICAgdGhpcy5ub19vZl9yb29tcyA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnJvb21zO1xyXG4gICAgdGhpcy5jaGVja2luX2RhdGUgPSBtb21lbnQocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Muc3RhcnREYXRlKTtcclxuICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9IG1vbWVudChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5lbmREYXRlKTtcclxuICAgIHRoaXMuaG90ZWxfbmFtZSA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmhvdGVsTmFtZTtcclxuXHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZ3JvdXBOYW1lKSB7XHJcbiAgICAgIHRoaXMuaG90ZWxfY2hhaW4gPSB7XHJcbiAgICAgICAgbmFtZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZ3JvdXBOYW1lXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IGxvY2F0aW9uX3R5cGVfc2VsZWN0XHJcbiAgICBzd2l0Y2ggKHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QpIHtcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ6XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0QWlycG9ydEJ5Q29kZShyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5pYXRhKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoaWF0YTogQWlycG9ydFNlYXJjaFJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYWlycG9ydCA9IHtcclxuICAgICAgICAgICAgICBhaXJwb3J0OiB7XHJcbiAgICAgICAgICAgICAgICBnYXRld2F5OiBpYXRhLmlhdGFNYXRjaC5pYXRhXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxvY2F0aW9uID0geyAuLi5haXJwb3J0LCAuLi5pYXRhLmlhdGFNYXRjaCB9O1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5DaXR5OlxyXG4gICAgICAgIHRoaXMuY291bnRyeSA9IHtcclxuICAgICAgICAgIGNDb2RlOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5jb3VudHJ5Q29kZSxcclxuICAgICAgICAgIGNOYW1lOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gc2hvdWxkIGJlIG9uZSBzZWFyY2ggbWV0b2QgZm9yIHRoZSBjaXR5IHNlYXJjaDogbG9jYXRpb24gb3IgcG9zdGNvZGVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sYXRpdHVkZSAmJlxyXG4gICAgICAgICAgcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9uZ2l0dWRlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uID0ge1xyXG4gICAgICAgICAgICBuYW1lOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5jaXR5TmFtZSxcclxuICAgICAgICAgICAgbGF0aXR1ZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxhdGl0dWRlLFxyXG4gICAgICAgICAgICBsb25naXR1ZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxvbmdpdHVkZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnBvc3RPclppcENvZGUpIHtcclxuICAgICAgICAgIHRoaXMucG9zdGNvZGUgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnBvc3RPclppcENvZGUsXHJcbiAgICAgICAgICAgIHR5cGU6IExvY2F0aW9uVHlwZXMuUG9zdGNvZGVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5PZmZpY2U6XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0T2ZmaWNlKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm9mZmljZUlkKVxyXG4gICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKG9mZmljZTogQ29uZmVybWFPZmZpY2VJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmaWNlID0ge1xyXG4gICAgICAgICAgICAgIGlkOiBvZmZpY2UuaWQsXHJcbiAgICAgICAgICAgICAgbmFtZTogb2ZmaWNlLm5hbWVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIHRoaXMuZ2V0UmFpbFN0YXRpb25CeUNvZGUoXHJcbiAgICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy50cmFpblN0YXRpb25Db2RlXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKHRyYWluc1N0YXRpb246IFJhaWxTdGF0aW9uKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYWluc1N0YXRpb24gPSB7XHJcbiAgICAgICAgICAgIC4uLnRyYWluc1N0YXRpb24sXHJcbiAgICAgICAgICAgIHR5cGU6IExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uXHJcbiAgICAgICAgICB9IGFzIExvY2F0aW9uRGV0YWlscztcclxuICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q6XHJcbiAgICAgICAgdGhpcy5jb3VudHJ5ID0ge1xyXG4gICAgICAgICAgY0NvZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgY05hbWU6ICcnXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSYWlsU3RhdGlvbkJ5Q29kZShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJhaWxTdGF0aW9uPiB7XHJcbiAgICBpZiAoY29kZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRSYWlsU3RhdGlvbkZldGNoZXJcclxuICAgICAgICAuZmV0Y2hMaXN0KHsgaWQ6IG51bGwsIGNvZGUgfSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBvZigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U2VhcmNoUXVlcnkob2dTZWFyY2ggPSBmYWxzZSk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzIHtcclxuICAgIHRoaXMuYnVpbGRRdWVyeShvZ1NlYXJjaCk7XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnJlbW92ZU51bGxzPFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzPih0aGlzLnF1ZXJ5KTtcclxuICB9XHJcblxyXG4gIGJ1aWxkUXVlcnkob2dTZWFyY2ggPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgdGVtcFBhcmFtcyA9IG9nU2VhcmNoID8gdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2ggOiB0aGlzLnRlbXBQYXJhbXM7XHJcblxyXG4gICAgY29uc3QgcXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzID0ge1xyXG4gICAgICBzdGFydERhdGU6IHRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxyXG4gICAgICBlbmREYXRlOiB0ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIHJvb21zOiB0ZW1wUGFyYW1zLm5vX29mX3Jvb21zLFxyXG4gICAgICBhZHVsdHM6IHRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzLFxyXG4gICAgICBjdXJyZW5jeTogdGVtcFBhcmFtcy5jdXJyZW5jeSA/IHRlbXBQYXJhbXMuY3VycmVuY3kgOiBudWxsLFxyXG4gICAgICBkaXN0YW5jZTogdGVtcFBhcmFtcy5kaXN0YW5jZSxcclxuICAgICAgZGlzdGFuY2VUeXBlOiBEaXN0YW5jZVR5cGVzLk0sXHJcbiAgICAgIG1heFJlc3VsdHM6IDEwMFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdldFJvb21OdW1iZXIoKTtcclxuICAgIHN3aXRjaCAodGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICBxdWVyeS5pYXRhID0gdGVtcFBhcmFtcy5sb2NhdGlvbi5haXJwb3J0LmdhdGV3YXk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQ2l0eTpcclxuICAgICAgICBxdWVyeS5jb3VudHJ5Q29kZSA9IHRlbXBQYXJhbXMuY291bnRyeS5jQ29kZTtcclxuICAgICAgICAvLyBzaG91bGQgYmUgb25lIHNlYXJjaCBtZXRvZCBmb3IgdGhlIGNpdHkgc2VhcmNoOiBsb2NhdGlvbiBvciBwb3N0Y29kZVxyXG4gICAgICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICBxdWVyeS5sYXRpdHVkZSA9IHRlbXBQYXJhbXMubG9jYXRpb24ubGF0aXR1ZGU7XHJcbiAgICAgICAgICBxdWVyeS5sb25naXR1ZGUgPSB0ZW1wUGFyYW1zLmxvY2F0aW9uLmxvbmdpdHVkZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRlbXBQYXJhbXMucG9zdGNvZGUpIHtcclxuICAgICAgICAgIHF1ZXJ5LnBvc3RPclppcENvZGUgPSB0ZW1wUGFyYW1zLnBvc3Rjb2RlLm5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjpcclxuICAgICAgICBpZiAodGVtcFBhcmFtcy5sb2NhdGlvbj8ucmFpbHN0YXRpb24/LnN0YXRpb25Db2RlKSB7XHJcbiAgICAgICAgICBxdWVyeS50cmFpblN0YXRpb25Db2RlID0gdGVtcFBhcmFtcy5sb2NhdGlvbi5yYWlsc3RhdGlvbi5zdGF0aW9uQ29kZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbj8uc3RhdGlvbkNvZGUpIHtcclxuICAgICAgICAgIHF1ZXJ5LnRyYWluU3RhdGlvbkNvZGUgPSB0ZW1wUGFyYW1zLnRyYWluc1N0YXRpb24uc3RhdGlvbkNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTogLy8gTmVlZHMgdG8gZml4IGluIG5leHQgUFJcclxuICAgICAgICBpZiAodGVtcFBhcmFtcy5sb2NhdGlvbj8uaWQpIHtcclxuICAgICAgICAgIHF1ZXJ5Lm9mZmljZUlkID0gK3RlbXBQYXJhbXMubG9jYXRpb24uaWQ7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wUGFyYW1zLm9mZmljZT8uaWQpIHtcclxuICAgICAgICAgIHF1ZXJ5Lm9mZmljZUlkID0gK3RlbXBQYXJhbXMub2ZmaWNlLmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q6XHJcbiAgICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSB0ZW1wUGFyYW1zLmNvdW50cnkuY0NvZGU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuUG9zdGNvZGU6XHJcbiAgICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSB0ZW1wUGFyYW1zLmNvdW50cnkuY0NvZGU7XHJcbiAgICAgICAgcXVlcnkucG9zdE9yWmlwQ29kZSA9IHRlbXBQYXJhbXMubG9jYXRpb24ubmFtZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgaG90ZWwgbmFtZSBpbiB0aGUgcXVlcnlcclxuICAgIGlmICh0ZW1wUGFyYW1zLmhvdGVsX25hbWUpIHtcclxuICAgICAgcXVlcnkuaG90ZWxOYW1lID0gdGVtcFBhcmFtcy5ob3RlbF9uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFkZCBjaGFpbiBvciBncm91cCBuYW1lIGludCBoZSBxdWVyeVxyXG4gICAgaWYgKHRlbXBQYXJhbXMuaG90ZWxfY2hhaW4pIHtcclxuICAgICAgcXVlcnkuZ3JvdXBOYW1lID0gdGVtcFBhcmFtcy5ob3RlbF9jaGFpbj8ubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XHJcbiAgfVxyXG5cclxuICBtYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWw6IEhvdGVsUXVvdGVSZXN1bHQpOiBBdmFpbGFiaWxpdHlPYmplY3Qge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaG90ZWw6IGhvdGVsLmlkLFxyXG4gICAgICBzdGFydERhdGU6IHRoaXMuaGVscGVycy5mb3JtYXRJc29EYXRlKHRoaXMuY2hlY2tpbl9kYXRlKSxcclxuICAgICAgZW5kRGF0ZTogdGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGUodGhpcy5jaGVja291dF9kYXRlKSxcclxuICAgICAgcm9vbXM6IHRoaXMubm9fb2Zfcm9vbXMsXHJcbiAgICAgIG9jY3VwYW50czogdGhpcy5ub19vZl9vY2N1cGFudHMsXHJcbiAgICAgIGN1cnJlbmN5OiAnR0JQJ1xyXG4gICAgfTtcclxuICB9XHJcbiAgcmVzdWx0c0ZpbHRlck1ldGhvZDogKHJlc3VsdHM6IEhvdGVsRGV0YWlsc0FycmF5KSA9PiBIb3RlbERldGFpbHNBcnJheTtcclxuXHJcbiAgcHVibGljIGZpbHRlclJlc3VsdHMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnJlc3VsdHNGaWx0ZXJNZXRob2QgPSAocmVzdWx0czogSG90ZWxEZXRhaWxzQXJyYXkpID0+XHJcbiAgICAgIHJlc3VsdHMuZmlsdGVyKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIHRoaXMuaW5QcmljZVJhbmdlKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5pbkRpc3RhbmNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5zSG90ZWxuYW1lKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5oYXNDaGFpbihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbClcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHRoaXMucmVzdWx0c0ZpbHRlck1ldGhvZCh0aGlzLmZ1bGxSZXN1bHRzKSk7XHJcbiAgfTtcclxuXHJcbiAgLy8gTGlnaHRlbmluZyBGaWx0ZXJzXHJcbiAgcHVibGljIGZpbHRlckxpZ2h0ZW5pbmdSZXN1bHRzID0gKCkgPT4ge1xyXG4gICAgdGhpcy5yZXN1bHRzRmlsdGVyTWV0aG9kID0gKHJlc3VsdHM6IEhvdGVsRGV0YWlsc0FycmF5KSA9PlxyXG4gICAgICByZXN1bHRzLmZpbHRlcigoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICB0aGlzLmluTGlnaHRlbmluZ1ByaWNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5zSG90ZWxuYW1lKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5oYXNDaGFpbihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuaGFzUHJlZmVycmVkKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5icmVha2Zhc3RUeXBlRmlsdGVyKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5nZXRFeHRyYUZpbHRlcihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuZ2V0QW1lbml0aWVzRmlsdGVyKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5hY2Nlc3NpYmxlUm9vbVR5cGVGaWx0ZXIoaG90ZWwpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dCh0aGlzLnJlc3VsdHNGaWx0ZXJNZXRob2QodGhpcy5mdWxsUmVzdWx0cykpO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyByZXN1bHRzSGF2ZVRhZyhzZWFyY2hUYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdHNDb250YWluVGFnOiBib29sZWFuO1xyXG4gICAgbGV0IGZpbHRlcmVkUmVzdWx0cyA9IHRoaXMuZnVsbFJlc3VsdHMuZmlsdGVyKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZFRhZ3M6IGFueSA9IGhvdGVsLnRhZ3MuZmlsdGVyKCh0YWc6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMuY29udmVydFRvT25lU3RyaW5nKHRhZy5uYW1lKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXModGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcoc2VhcmNoVGFnKS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgY29udGFpbnNTZWFyY2hUYWcgPVxyXG4gICAgICAgIGZpbHRlcmVkVGFncyAmJiBmaWx0ZXJlZFRhZ3MubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coYEhvdGVsICR7aG90ZWwubmFtZX0gd2l0aCBmaWx0ZXIgYXBwbGllZGAsIGhvdGVsPy50YWdzLCBpc1RydWUpO1xyXG4gICAgICByZXR1cm4gY29udGFpbnNTZWFyY2hUYWc7XHJcbiAgICB9KTtcclxuICAgIHJlc3VsdHNDb250YWluVGFnID1cclxuICAgICAgZmlsdGVyZWRSZXN1bHRzICYmIGZpbHRlcmVkUmVzdWx0cy5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgcmV0dXJuIHJlc3VsdHNDb250YWluVGFnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpblByaWNlUmFuZ2UoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYXZhaWxhYmlsaXR5ID0gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eVZhbHVlKGhvdGVsKTtcclxuICAgIGlmIChhdmFpbGFiaWxpdHkpIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLmhlbHBlcnMuaW5SYW5nZShhdmFpbGFiaWxpdHkubWF4cHJpY2UsIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlKSAmJlxyXG4gICAgICAgIHRoaXMuaGVscGVycy5pblJhbmdlKGF2YWlsYWJpbGl0eS5taW5wcmljZSwgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbkRpc3RhbmNlUmFuZ2UoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4ID09PSAwIHx8XHJcbiAgICAgIHRoaXMuaGVscGVycy5pblJhbmdlKGhvdGVsLmxvY2F0aW9uLmRpc3RhbmNlLCB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnRhaW5zSG90ZWxuYW1lKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRvY2hlY2sgPSB0aGlzLmZpbHRlcnMuaG90ZWxOYW1lLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRvY2hlY2sgJiYgdG9jaGVjay5sZW5ndGggPiAwXHJcbiAgICAgID8gaG90ZWwubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRvY2hlY2spXHJcbiAgICAgIDogdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5MaWdodGVuaW5nUHJpY2VSYW5nZShob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhdmFpbGFiaWxpdHkgPSB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoaG90ZWwpO1xyXG4gICAgaWYgKGF2YWlsYWJpbGl0eSAmJiBPYmplY3Qua2V5cyhhdmFpbGFiaWxpdHkpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBsZXQgbWF4UmFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgbGV0IGZpbmRNYXg6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBtaW5SYW5nZSA9IHRoaXMuaGVscGVycy5pblJhbmdlKFxyXG4gICAgICAgIGF2YWlsYWJpbGl0eS5wcnBuLFxyXG4gICAgICAgIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChhdmFpbGFiaWxpdHk/Lm1heHByaWNlKSB7XHJcbiAgICAgICAgZmluZE1heCA9IGF2YWlsYWJpbGl0eS5tYXhwcmljZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmaW5kTWF4ID0gYXZhaWxhYmlsaXR5Py5yb29tcy5yZWR1Y2UoXHJcbiAgICAgICAgICAob3AsIGl0ZW0pID0+IChvcCA9IG9wID4gaXRlbS50b3RhbCA/IG9wIDogaXRlbS50b3RhbCksXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBtYXhSYW5nZSA9IHRoaXMuaGVscGVycy5pblJhbmdlKGZpbmRNYXgsIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlKTtcclxuICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IG1pblJhbmdlICYmIG1heFJhbmdlO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0NoYWluKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRvY2hlY2sgPSAodGhpcy5maWx0ZXJzLmNoYWluIHx8IFtdKS5tYXAoKGNoYWluOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gICAgICByZXR1cm4gY2hhaW4udG9Mb3dlckNhc2UoKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRvY2hlY2sgJiYgdG9jaGVjay5sZW5ndGhcclxuICAgICAgPyAhIXRvY2hlY2suZmluZCgoY2hhaW46IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGhvdGVsLmdyb3VwLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY2hhaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIDogdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVycy5icmVha2Zhc3RUeXBlLmxlbmd0aCkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgY29uc3QgaG90ZWxPYmplY3RWYWx1ZSA9IHRoaXMuZ2V0SG90ZWxPYmplY3RWYWx1ZShob3RlbCk7XHJcbiAgICBpZiAoIWhvdGVsT2JqZWN0VmFsdWUgfHwgIWhvdGVsT2JqZWN0VmFsdWU/LnJvb21zKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgaXNCcmVha2Zhc3RJbmNsdWRlZCA9IHRoaXMuZmlsdGVycy5icmVha2Zhc3RUeXBlLmluY2x1ZGVzKFxyXG4gICAgICBTZWFyY2hIYW5kbGVyLkJSRUFLRkFTVF9JTkNMVURFRFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGlzQnJlYWtmYXN0RXhjbHVkZWQgPSB0aGlzLmZpbHRlcnMuYnJlYWtmYXN0VHlwZS5pbmNsdWRlcyhcclxuICAgICAgU2VhcmNoSGFuZGxlci5CUkVBS0ZBU1RfTk9UX0lOQ0xVREVEXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGJyZWFrZmFzdE1hdGNoZXMgPSBob3RlbE9iamVjdFZhbHVlLnJvb21zLmZpbHRlcigocm9vbXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXNCcmVha2Zhc3RJbmNsdWRlZCAmJiBpc0JyZWFrZmFzdEV4Y2x1ZGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJvb21zO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzQnJlYWtmYXN0SW5jbHVkZWQpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGluY2x1ZGVkRXhwcmVzc2lvbikgJiZcclxuICAgICAgICAgICFyb29tcy5yYXRlRGVzY3JpcHRpb24ubWF0Y2goZXhjbHVkZWRFeHByZXNzaW9uKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNCcmVha2Zhc3RFeGNsdWRlZCkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAhcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGluY2x1ZGVkRXhwcmVzc2lvbikgfHxcclxuICAgICAgICAgIHJvb21zLnJhdGVEZXNjcmlwdGlvbi5tYXRjaChleGNsdWRlZEV4cHJlc3Npb24pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gISFicmVha2Zhc3RNYXRjaGVzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWNjZXNzaWJsZVJvb21UeXBlRmlsdGVyKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzLmFjY2Vzc2libGVSb29tVHlwZS5sZW5ndGgpIHJldHVybiB0cnVlO1xyXG4gICAgY29uc3QgaG90ZWxPYmplY3RWYWx1ZSA9IHRoaXMuZ2V0SG90ZWxPYmplY3RWYWx1ZShob3RlbCk7XHJcbiAgICBpZiAoIWhvdGVsT2JqZWN0VmFsdWUgfHwgIWhvdGVsT2JqZWN0VmFsdWU/LnJvb21zKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgbWF0Y2hlcyA9IGhvdGVsT2JqZWN0VmFsdWUucm9vbXMuZmlsdGVyKFxyXG4gICAgICAocm9vbXM6IGFueSkgPT5cclxuICAgICAgICByb29tcy5yYXRlRGVzY3JpcHRpb24ubWF0Y2goaW5jbHVkZWRBY2Nlc3NpYmlsaXR5RXhwcmVzc2lvbikgfHxcclxuICAgICAgICByb29tcy5yb29tRGVzY3JpcHRpb24ubWF0Y2goaW5jbHVkZWRBY2Nlc3NpYmlsaXR5RXhwcmVzc2lvbikgfHxcclxuICAgICAgICByb29tcy5yb29tVHlwZS5tYXRjaChpbmNsdWRlZEFjY2Vzc2liaWxpdHlFeHByZXNzaW9uKVxyXG4gICAgKTtcclxuICAgIHJldHVybiAhIW1hdGNoZXMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIb3RlbE9iamVjdFZhbHVlKFxyXG4gICAgaG90ZWw6IEhvdGVsRGV0YWlsc1xyXG4gICk6IEhvdGVsQXZhbGliaWxpdHlRdW90ZVJlc3VsdCB7XHJcbiAgICBjb25zdCBob3RlbE9iamVjdCA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlGb3JJZChcclxuICAgICAgdGhpcy5tYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWwpLFxyXG4gICAgICBob3RlbFxyXG4gICAgKTtcclxuICAgIHJldHVybiAhaG90ZWxPYmplY3QgJiYgIWhvdGVsT2JqZWN0LnZhbHVlID8gbnVsbCA6IGhvdGVsT2JqZWN0LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgYnlNb3N0RXhwZW5zaXZlKCkge1xyXG4gICAgdGhpcy5zb3J0QnlQcmljZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG1pblxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVidWcgc2V0IHRoaXMgdG8gdHJ1ZSB0byBvdXRwdXQgY29uc29sZSBsb2dzXHJcbiAgICogQGRlc2NyaXB0aW9uIHNvcnRzIHJlc3VsdHMgYnkgcHJpY2UgYWNjb3JkaW5nIHRvIHRoZSAnbWluJyBwYXJhbWF0ZXIuIG1pbiA9IHRydWUgKGxvd2VzdCBwcmljZSBmaXJzdCksIG1pbiA9IGZhbHNlIChoaWdoZXN0IHByaWNlIGZpcnN0KVxyXG4gICAqIEluIHN1bW1hcnksIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzb3J0ZWQgYXJyYXkgb2YgaG90ZWxzIHdpdGggcHJpY2VzIGFuZCBhbiBhcnJheSBvZiBob3RlbHMgV0lUSE9VVCBwcmljZXMsXHJcbiAgICogdGhlbiBmaW5hbGx5IGpvaW5zIHRoZXNlIDIgdGVtcG9yYXJ5IGFycmF5cyB0b2dldGhlciBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgbmV4dCBvYnNlcnZhYmxlLlxyXG4gICAqL1xyXG5cclxuICBzb3J0QnlQcmljZShtaW4gPSB0cnVlLCBkZWJ1ZyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAvLyBzdG9yZSBhbGwgcmVzdWx0c1xyXG4gICAgY29uc3QgaG90ZWxzOiBIb3RlbERldGFpbHNBcnJheSA9IHRoaXMuZnVsbFJlc3VsdHM7XHJcblxyXG4gICAgLy8gZ2V0IGhvdGVscyB3aXRoIGFuZCB3aXRob3V0IHByaWNlc1xyXG4gICAgY29uc3QgaG90ZWxzV2l0aFByaWNlczogSG90ZWxEZXRhaWxzQXJyYXkgPSBbXTtcclxuICAgIGNvbnN0IGhvdGVsc1dpdGhvdXRQcmljZXM6IEhvdGVsRGV0YWlsc0FycmF5ID0gW107XHJcbiAgICBob3RlbHMubWFwKChob3RlbFJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoaG90ZWxSZXN1bHQpPy5wcnBuXHJcbiAgICAgICAgPyBob3RlbHNXaXRoUHJpY2VzLnB1c2goaG90ZWxSZXN1bHQpXHJcbiAgICAgICAgOiBob3RlbHNXaXRob3V0UHJpY2VzLnB1c2goaG90ZWxSZXN1bHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc29ydCBob3RlbHMgd2l0aCBwcmljZXMgYWNjb3JkaW5nIHRvIHRoZSAnbWluJyBwYXJhbWV0ZXIgZm9yIHRoZSBvcmRlclxyXG4gICAgaG90ZWxzV2l0aFByaWNlcy5zb3J0KChmaXJzdDogSG90ZWxEZXRhaWxzLCBzZWNvbmQ6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICBjb25zdCBmaXJzdFByaWNlID1cclxuICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoZmlyc3QpPy5wcnBuO1xyXG4gICAgICBjb25zdCBzZWNvbmRQcmljZSA9XHJcbiAgICAgICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eVZhbHVlKHNlY29uZCk/LnBycG47XHJcbiAgICAgIHJldHVybiBtaW5cclxuICAgICAgICA/IGZpcnN0UHJpY2UgPiBzZWNvbmRQcmljZVxyXG4gICAgICAgICAgPyAxXHJcbiAgICAgICAgICA6IHNlY29uZFByaWNlID4gZmlyc3RQcmljZVxyXG4gICAgICAgICAgPyAtMVxyXG4gICAgICAgICAgOiAwXHJcbiAgICAgICAgOiBmaXJzdFByaWNlIDwgc2Vjb25kUHJpY2VcclxuICAgICAgICA/IDFcclxuICAgICAgICA6IHNlY29uZFByaWNlIDwgZmlyc3RQcmljZVxyXG4gICAgICAgID8gLTFcclxuICAgICAgICA6IDA7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBqb2luIGhvdGVscyB3aXRoIHByaWNlcyB0byBob3RlbHMgV0lUSE9VVCBwcmljZXNcclxuICAgIGNvbnN0IHNvcnRlZEhvdGVscyA9IFsuLi5ob3RlbHNXaXRoUHJpY2VzLCAuLi5ob3RlbHNXaXRob3V0UHJpY2VzXTtcclxuXHJcbiAgICAvLyB0cmlnZ2VyIG5leHQgb2JzZXJ2YWJsZVxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoc29ydGVkSG90ZWxzKTtcclxuXHJcbiAgICAvLyBkaXNwbGF5IGNvbnNvbGUgbG9ncyBpZiBkZWJ1ZyBpcyB0cnVlIChjb3VsZCBwcm92ZSB1c2VmdWwgaW4gZnV0dXJlKVxyXG4gICAgaWYgKGRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBzb3J0QnlQcmljZSgpIGNhbGxlZCArKycpO1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgaG90ZWwgKysnLCBob3RlbHMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgaG90ZWxzV2l0aFByaWNlcyArKycsIGhvdGVsc1dpdGhQcmljZXMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgaG90ZWxzV2l0aG91dFByaWNlcyArKycsIGhvdGVsc1dpdGhvdXRQcmljZXMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgc29ydGVkSG90ZWxzICsrJywgc29ydGVkSG90ZWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNvcnRCeU5hbWUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChcclxuICAgICAgdGhpcy5oZWxwZXJzXHJcbiAgICAgICAgLmNsb25lKHRoaXMuZnVsbFJlc3VsdHMpXHJcbiAgICAgICAgLnNvcnQoKGZzdDogSG90ZWxEZXRhaWxzLCBzbmQ6IEhvdGVsRGV0YWlscyk6IG51bWJlciA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZnN0Lm5hbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKHNuZC5uYW1lLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc29ydEJ5RGlzdGFuY2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChcclxuICAgICAgdGhpcy5oZWxwZXJzLmNsb25lKHRoaXMuZnVsbFJlc3VsdHMpLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKGEubG9jYXRpb24uZGlzdGFuY2UpIC0gTnVtYmVyKGIubG9jYXRpb24uZGlzdGFuY2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGJ5UHJlZmVycmVkKCk6IHZvaWQge1xyXG4gICAgbGV0IHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMudmFsdWUgfHwgW107XHJcbiAgICB0cnkge1xyXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KChhOiBIb3RlbERldGFpbHMsIGI6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByZWZlcnJlZFRvSW50KGIpIC0gdGhpcy5wcmVmZXJyZWRUb0ludChhKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCcrKysgRXJyb3Igc29ydGluZyBieSBwcmVmZXJyZWQ6ICcsIGVycm9yLCAnICsrKycpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVmZXJyZWRUb0ludChob3RlbDogSG90ZWxEZXRhaWxzKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIChob3RlbC5wcmVmZXJyZWQuY2xpZW50ID8gQ0xJRU5UX1BSRUZFUlJFRF9WQUxVRSA6IDApICtcclxuICAgICAgKGhvdGVsLnByZWZlcnJlZC5jb25zdW1lciA/IEFHRU5UX1BSRUZFUlJFRF9WQUxVRSA6IDApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRUb1ByZWZlcnJlZChwcmVmZXJyZWQ6IDAgfCAxIHwgMiB8IDMpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYml0d2lzZVxyXG4gICAgICBjbGllbnQ6IChwcmVmZXJyZWQgJiBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFKSA9PT0gQ0xJRU5UX1BSRUZFUlJFRF9WQUxVRSxcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXHJcbiAgICAgIGNvbnN1bWVyOiAocHJlZmVycmVkICYgQUdFTlRfUFJFRkVSUkVEX1ZBTFVFKSA9PT0gQUdFTlRfUFJFRkVSUkVEX1ZBTFVFXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYWRkRmlsdGVyKGZpbHRlcjogc3RyaW5nLCB0eXBlOiBrZXlvZiBIb3RlbEZpbHRlcnMpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbHQ6IGFueSA9IHRoaXMubG9jYWxGaWx0ZXJzO1xyXG4gICAgZmlsdFt0eXBlXS5wdXNoKGZpbHRlcik7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGaWx0ZXIoZmlsdGVyOiBzdHJpbmcsIHR5cGU6IGtleW9mIEhvdGVsRmlsdGVycyk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsdCA9IHRoaXMubG9jYWxGaWx0ZXJzO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdFt0eXBlXSkpIHtcclxuICAgICAgKGZpbHRbdHlwZV0gYXMgc3RyaW5nW10pID0gKGZpbHRbdHlwZV0gYXMgc3RyaW5nW10pLmZpbHRlcihcclxuICAgICAgICAoY2hhaW46IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGZpbHRlciAhPT0gY2hhaW47XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuY2hhaW4gPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmFtZW5pdHl0eXBlID0gW107XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5wcmVmZXJyZWQgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmV4dHJhID0gW107XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5ob3RlbE5hbWUgPSAnJztcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmJyZWFrZmFzdFR5cGUgPSBbXTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlYXJjaEZyb21FeHBpcmVkQmFza2V0SXRlbShiYXNrZXRJdGVtOiBCYXNrZXRJdGVtKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWFyY2hIb3RlbFF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyA9IGJhc2tldEl0ZW0uc2VhcmNoUXVlcnk7XHJcbiAgICB0aGlzLmN1cnJlbmN5ID0gc2VhcmNoSG90ZWxRdWVyeS5jdXJyZW5jeTtcclxuICAgIHRoaXMuZGlzdGFuY2UgPSBzZWFyY2hIb3RlbFF1ZXJ5LmRpc3RhbmNlO1xyXG4gICAgdGhpcy5ub19vZl9yb29tcyA9IHNlYXJjaEhvdGVsUXVlcnkucm9vbXM7XHJcbiAgICB0aGlzLmNoZWNraW5fZGF0ZSA9IG1vbWVudChzZWFyY2hIb3RlbFF1ZXJ5LnN0YXJ0RGF0ZSk7XHJcbiAgICB0aGlzLmNoZWNrb3V0X2RhdGUgPSBtb21lbnQoc2VhcmNoSG90ZWxRdWVyeS5lbmREYXRlKTtcclxuICAgIHRoaXMuaG90ZWxfbmFtZSA9IHNlYXJjaEhvdGVsUXVlcnkuaG90ZWxOYW1lO1xyXG5cclxuICAgIGlmIChzZWFyY2hIb3RlbFF1ZXJ5Lmdyb3VwTmFtZSkge1xyXG4gICAgICB0aGlzLmhvdGVsX2NoYWluID0ge1xyXG4gICAgICAgIG5hbWU6IHNlYXJjaEhvdGVsUXVlcnkuZ3JvdXBOYW1lXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlYXJjaEhvdGVsUXVlcnkuaWF0YSkge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gTG9jYXRpb25UeXBlcy5BaXJwb3J0O1xyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgICAuZ2V0QWlycG9ydEJ5Q29kZShzZWFyY2hIb3RlbFF1ZXJ5LmlhdGEpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoaWF0YTogQWlycG9ydFNlYXJjaFJlc3VsdHMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGFpcnBvcnQgPSB7XHJcbiAgICAgICAgICAgIGFpcnBvcnQ6IHtcclxuICAgICAgICAgICAgICBnYXRld2F5OiBpYXRhLmlhdGFNYXRjaC5pYXRhXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uID0geyAuLi5haXJwb3J0LCAuLi5pYXRhLmlhdGFNYXRjaCB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChzZWFyY2hIb3RlbFF1ZXJ5LmxhdGl0dWRlICYmIHNlYXJjaEhvdGVsUXVlcnkubG9uZ2l0dWRlKSB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLkNpdHk7XHJcbiAgICAgIHRoaXMubG9jYXRpb24gPSB7XHJcbiAgICAgICAgbmFtZTogYmFza2V0SXRlbS5kZXRhaWw/LmhvdGVsQWFkZHJlc3M/LnRvd25cclxuICAgICAgICAgID8gYmFza2V0SXRlbS5kZXRhaWw/LmhvdGVsQWFkZHJlc3M/LnRvd25cclxuICAgICAgICAgIDogJycsXHJcbiAgICAgICAgbGF0aXR1ZGU6IHNlYXJjaEhvdGVsUXVlcnkubGF0aXR1ZGUsXHJcbiAgICAgICAgbG9uZ2l0dWRlOiBzZWFyY2hIb3RlbFF1ZXJ5LmxvbmdpdHVkZVxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmIChzZWFyY2hIb3RlbFF1ZXJ5LnBvc3RPclppcENvZGUpIHtcclxuICAgICAgdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IExvY2F0aW9uVHlwZXMuUG9zdGNvZGU7XHJcbiAgICAgIHRoaXMucG9zdGNvZGUgPSB7XHJcbiAgICAgICAgbmFtZTogc2VhcmNoSG90ZWxRdWVyeS5wb3N0T3JaaXBDb2RlLFxyXG4gICAgICAgIHR5cGU6IExvY2F0aW9uVHlwZXMuUG9zdGNvZGVcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAoc2VhcmNoSG90ZWxRdWVyeS5vZmZpY2VJZCkge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gTG9jYXRpb25UeXBlcy5PZmZpY2U7XHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZVxyXG4gICAgICAgIC5nZXRPZmZpY2Uoc2VhcmNoSG90ZWxRdWVyeS5vZmZpY2VJZClcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKG9mZmljZTogQ29uZmVybWFPZmZpY2VJbmZvKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9mZmljZSA9IHtcclxuICAgICAgICAgICAgaWQ6IG9mZmljZS5pZCxcclxuICAgICAgICAgICAgbmFtZTogb2ZmaWNlLm5hbWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlYXJjaEhvdGVsUXVlcnkudHJhaW5TdGF0aW9uQ29kZSkge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb247XHJcbiAgICAgIHRoaXMuZ2V0UmFpbFN0YXRpb25CeUNvZGUoc2VhcmNoSG90ZWxRdWVyeS50cmFpblN0YXRpb25Db2RlKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRyYWluc1N0YXRpb246IFJhaWxTdGF0aW9uKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYWluc1N0YXRpb24gPSB7XHJcbiAgICAgICAgICAgIC4uLnRyYWluc1N0YXRpb24sXHJcbiAgICAgICAgICAgIHR5cGU6IExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uXHJcbiAgICAgICAgICB9IGFzIExvY2F0aW9uRGV0YWlscztcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2UgaWYgKHNlYXJjaEhvdGVsUXVlcnkuY291bnRyeUNvZGUpIHtcclxuICAgICAgdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IExvY2F0aW9uVHlwZXMuU2hvcnRsaXN0O1xyXG4gICAgICB0aGlzLmNvdW50cnkgPSB7XHJcbiAgICAgICAgY0NvZGU6IHNlYXJjaEhvdGVsUXVlcnkuY291bnRyeUNvZGUsXHJcbiAgICAgICAgY05hbWU6ICcnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWRkIFRyYXZlbGxlcnNcclxuICAgIGlmIChiYXNrZXRJdGVtLnVzZXJzKSB7XHJcbiAgICAgIGJhc2tldEl0ZW0udXNlcnMuZm9yRWFjaCgodXNlcjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLmFkZFRyYXZlbGxlcih1c2VyKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCdQUkVQT1BVTEFUSU5HIEhPVEVMIEZPUk0nKTtcclxuICAgIGNvbnN0IGZsaWdodEl0ZW06IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzID1cclxuICAgICAgcHJldmlvdXNJdGVtc1tTZXJ2aWNlVHlwZS5GbGlnaHRdPy5zZWFyY2hRdWVyeTtcclxuICAgIGNvbnN0IHJhaWxJdGVtOiBTZWFyY2hSYWlsUXVlcnlWYXJpYWJsZXMgPVxyXG4gICAgICBwcmV2aW91c0l0ZW1zW1NlcnZpY2VUeXBlLlJhaWxdPy5zZWFyY2hRdWVyeTtcclxuICAgIGlmIChmbGlnaHRJdGVtKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IExvY2F0aW9uVHlwZXMuQWlycG9ydDtcclxuICAgICAgICB0aGlzLmNoZWNraW5fZGF0ZSA9XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XS5vdXRCb3VuZERhdGU7XHJcbiAgICAgICAgdGhpcy5jaGVja291dF9kYXRlID1cclxuICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdLmluYm91bmREYXRlO1xyXG4gICAgICAgIHRoaXMubG9jYXRpb24gPSB7XHJcbiAgICAgICAgICBuYW1lOiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdXHJcbiAgICAgICAgICAgICAgLmFycml2ZUxvY2F0aW9uIGFzIE9CVEFpcnBvcnREZXRhaWxzXHJcbiAgICAgICAgICApLmRlc3RpbmF0aW9uLFxyXG4gICAgICAgICAgdHlwZTogJ0FpcnBvcnQnLFxyXG4gICAgICAgICAgYWlycG9ydDpcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkZsaWdodF0uYXJyaXZlTG9jYXRpb25cclxuICAgICAgICB9IGFzIGFueTtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdHJ5aW5nIHRvIHByZXBvcHVsYXRlIGhvdGVsIGZyb20gZmxpZ2h0IGl0ZW0nKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChyYWlsSXRlbSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjtcclxuICAgICAgICB0aGlzLmNoZWNraW5fZGF0ZSA9XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuUmFpbF0ub3V0Qm91bmREYXRlVGltZTtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgPVxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlJhaWxdLmluQm91bmREYXRlVGltZTtcclxuICAgICAgICB0aGlzLnRyYWluc1N0YXRpb24gPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuUmFpbF1cclxuICAgICAgICAgIC50cmF2ZWxsaW5nVG8gYXMgTG9jYXRpb25EZXRhaWxzO1xyXG4gICAgICAgIHRoaXMubG9jYXRpb24gPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuUmFpbF1cclxuICAgICAgICAgIC50cmF2ZWxsaW5nVG8gYXMgTG9jYXRpb25EZXRhaWxzO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB0cnlpbmcgdG8gcHJlcG9wdWxhdGUgaG90ZWwgZnJvbSByYWlsIGl0ZW0nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNQcmVmZXJyZWQoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcHJlZmVycmVkRmlsdGVycyA9IHRoaXMuZmlsdGVycy5wcmVmZXJyZWQ7XHJcblxyXG4gICAgLy8gRW1wdHkgcHJlZmVycmVkIGZpbHRlcnMgT1IgXCJBbnlcIlxyXG4gICAgaWYgKFxyXG4gICAgICAhcHJlZmVycmVkRmlsdGVycy5sZW5ndGggfHxcclxuICAgICAgcHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkFOWSlcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZ2VuY3kgKGNvbnN1bWVyKSAmJiBDbGllbnRcclxuICAgIGlmIChcclxuICAgICAgcHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkFHRU5DWSkgJiZcclxuICAgICAgcHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkNMSUVOVClcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGhvdGVsLnByZWZlcnJlZC5jb25zdW1lciA9PT0gdHJ1ZSAmJiBob3RlbC5wcmVmZXJyZWQuY2xpZW50ID09PSB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWdlbmN5XHJcbiAgICBpZiAocHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkFHRU5DWSkpIHtcclxuICAgICAgcmV0dXJuIGhvdGVsLnByZWZlcnJlZC5jb25zdW1lciA9PT0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDbGllbnRcclxuICAgIGlmIChwcmVmZXJyZWRGaWx0ZXJzLmluY2x1ZGVzKFNlYXJjaEhhbmRsZXIuQ0xJRU5UKSkge1xyXG4gICAgICByZXR1cm4gaG90ZWwucHJlZmVycmVkLmNsaWVudCA9PT0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRtYXhQcmljZUZvckN1cnJlbmN5KGN1cnJlbmN5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5tYXhQcmljZUZvckN1cnJlbmN5KGN1cnJlbmN5KTtcclxuICB9XHJcblxyXG4gIC8vIExpZ2h0ZW5pbmcgRXh0cmEgRmlsdGVyc1xyXG4gIHByaXZhdGUgZ2V0RXh0cmFGaWx0ZXIoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY2hlY2tBdmFpbGFiaWxpdHkgPSB0aGlzLmZpbHRlcnMuZXh0cmEuaW5jbHVkZXMoXHJcbiAgICAgIFNlYXJjaEhhbmRsZXIuQVZBSUxBQklMSVRZXHJcbiAgICApO1xyXG4gICAgaWYgKGNoZWNrQXZhaWxhYmlsaXR5KSB7XHJcbiAgICAgIHJldHVybiBob3RlbC51bmF2YWlsYWJsZSA9PT0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjaGVja0ZlbWFsZUZyaWVuZGx5ID0gdGhpcy5maWx0ZXJzLmV4dHJhLmluY2x1ZGVzKFxyXG4gICAgICBTZWFyY2hIYW5kbGVyLkZFTUFMRV9GUklFTkRMWVxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja0ZlbWFsZUZyaWVuZGx5KSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgaG90ZWwudGFncy5maWx0ZXIoKHRhZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHRhZy5uYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnZlcnRUb09uZVN0cmluZyh0YWcubmFtZSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5hbWUuaW5jbHVkZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcoXHJcbiAgICAgICAgICAgICAgICBTZWFyY2hIYW5kbGVyLkZFTUFMRV9GUklFTkRMWVxyXG4gICAgICAgICAgICAgICkudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkubGVuZ3RoID4gMFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyBMaWdodGVuaW5nIEFtZXJuaXRpZXMgRmlsdGVyc1xyXG4gIHByaXZhdGUgZ2V0QW1lbml0aWVzRmlsdGVyKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RydWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdGhpcy5maWx0ZXJzLmFtZW5pdHl0eXBlLmZvckVhY2goKHNlYXJjaCkgPT4ge1xyXG4gICAgICBsZXQgZmlsdGVyZWRSZXN1bHRzOiBhbnkgPSBob3RlbC50YWdzLmZpbHRlcigodGFnKSA9PiB7XHJcbiAgICAgICAgaWYgKHRhZy5uYW1lKSB7XHJcbiAgICAgICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcodGFnLm5hbWUpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyh0aGlzLmNvbnZlcnRUb09uZVN0cmluZyhzZWFyY2gpLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlzVHJ1ZSA9IGZpbHRlcmVkUmVzdWx0cyAmJiBmaWx0ZXJlZFJlc3VsdHMubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coYEhvdGVsICR7aG90ZWwubmFtZX0gd2l0aCBmaWx0ZXIgYXBwbGllZGAsIGhvdGVsPy50YWdzLCBpc1RydWUpO1xyXG4gICAgICByZXR1cm4gaXNUcnVlO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gaXNUcnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb252ZXJ0VG9PbmVTdHJpbmcoaXRlbTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gaXRlbS5yZXBsYWNlKC9bXmEtekEtWl0vZywgJycpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW1hZ2VzKEhvbGlkYXlDb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XHJcbiAgICBjb25zdCB1cmwgPVxyXG4gICAgICB0aGlzLmVudmlyb25tZW50Lmhvc3RCYXNlVXJsICtcclxuICAgICAgVVJMUy5DT05GSVJNQV9QSE9UT19VUkwgK1xyXG4gICAgICBIb2xpZGF5Q29kZS5zcGxpdCgnLCcpWzBdO1xyXG4gICAgY29uc3QgaW1nUHJvdmlkZXIgPSAnaHR0cHM6Ly93d3cudmZtaWkuY29tLyc7IC8vIGltZyBwcm92aWRlciB0aGF0cyBob2xkcyBpbWFnZXMsIHVzZWQgdG8gbWF0Y2ggd2hpY2ggaW1hZ2VzIG9uIHBhZ2UgYmVsb25ncyB0byBnYWxsZXJ5LlxyXG4gICAgaWYgKHRoaXMuZ2FsbGVyaWVzW0hvbGlkYXlDb2RlXSkge1xyXG4gICAgICByZXR1cm4gb2YodGhpcy5nYWxsZXJpZXNbSG9saWRheUNvZGVdKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2FsbFNlcnZpY2UuZ2V0KHVybCBhcyBVUkxTLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pLnBpcGUoXHJcbiAgICAgIG1hcCgoaW1hZ2VzSFRNTCkgPT4ge1xyXG4gICAgICAgIGlmICghaW1hZ2VzSFRNTCkge1xyXG4gICAgICAgICAgdGhyb3cgRXJyb3IoYEdhbGxlcnkgZm9yICR7SG9saWRheUNvZGV9IGNhbiBub3QgYmUgbG9hZGVkLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGVtcC5pbm5lckhUTUwgPSBpbWFnZXNIVE1MO1xyXG4gICAgICAgIGNvbnN0IGltYWdlcyA9IEFycmF5LmZyb20odGVtcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJykpLnJlZHVjZShcclxuICAgICAgICAgIChhY2MsIGltZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaW1nLnNyYy5pbmNsdWRlcyhpbWdQcm92aWRlcikpIHtcclxuICAgICAgICAgICAgICBhY2MucHVzaChpbWcuc3JjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFtdXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoIWltYWdlcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgICAgICBgVGhlcmUgaXMgbm8gbWVkaWEgY29udGVudCBwcm92aWRlZCBmb3IgdGhpcyBob3RlbCAke0hvbGlkYXlDb2RlfWBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAodGhpcy5nYWxsZXJpZXNbSG9saWRheUNvZGVdID0gaW1hZ2VzKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhZGRQYWdpbmF0aW9uUGFnZShjdXJyZW50UGFnZTogbnVtYmVyKTogYW55IHtcclxuICAgIGNvbnN0IGtleSA9ICdQYWdpbmF0aW9uUGFnZUNvdW50JztcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oa2V5LCBjdXJyZW50UGFnZSk7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShrZXkpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlVmlldygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSBIb3RlbFZpZXcuTElTVCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gSG90ZWxWaWV3Lk1BUDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSBIb3RlbFZpZXcuTElTVDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGNEYXlEaWZmKCk6IG51bWJlciB7XHJcbiAgICBjb25zdCBjaGVja291dCA9IG1vbWVudCh0aGlzLmNoZWNrb3V0X2RhdGUpO1xyXG4gICAgY29uc3QgY2hlY2tpbiA9IG1vbWVudCh0aGlzLmNoZWNraW5fZGF0ZSk7XHJcbiAgICByZXR1cm4gY2hlY2tvdXQuc3RhcnRPZignZGF5JykuZGlmZihjaGVja2luLnN0YXJ0T2YoJ2RheScpLCAnZGF5cycpO1xyXG4gIH1cclxuICB1cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzOiBIb3RlbERldGFpbHNbXSk6IElDaGVhcGVzdFByaWNlIHtcclxuICAgIGNvbnN0IGN1cnJlbmNpZXNLZXkgPSBPYmplY3Qua2V5cyh0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuY3VycmVuY2llcyk7XHJcbiAgICBpZiAoKCFyZXN1bHRzLmxlbmd0aCAmJiAhY3VycmVuY2llc0tleS5sZW5ndGgpIHx8ICFjdXJyZW5jaWVzS2V5Lmxlbmd0aClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3QgY3VycmVuY2llID0gY3VycmVuY2llc0tleVswXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhbW91bnQ6IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5jdXJyZW5jaWVzW2N1cnJlbmNpZV0ubWlucHJpY2UsXHJcbiAgICAgIGN1cnJlbmN5Q29kZTogY3VycmVuY2llXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0Um9vbU51bWJlcigpIHtcclxuICAgIGxldCByb29tc09jY3VwYW5jeTogYW55W10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTnVtYmVyKHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyk7IGkrKykge1xyXG4gICAgICBjb25zdCBuZXdSb29tT2NjdXBhbmN5ID0ge1xyXG4gICAgICAgIEFkdWx0czogdGhpcy5jYWxjUm9vbU9jY3VwYW5jeShcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyxcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHNcclxuICAgICAgICApLFxyXG4gICAgICAgIENoaWxkcmVuOiAwLFxyXG4gICAgICAgIEluZmFudHM6IDBcclxuICAgICAgfTtcclxuICAgICAgcm9vbXNPY2N1cGFuY3kucHVzaChuZXdSb29tT2NjdXBhbmN5KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcm9vbXM6IG51bWJlcltdID0gW107XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm9vbXNPY2N1cGFuY3kubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9vbXNPY2N1cGFuY3lbaW5kZXhdLkFkdWx0czsgaisrKSB7XHJcbiAgICAgICAgcm9vbXMucHVzaChpbmRleCArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIHNob3VsZCB3ZSBhZGQgbmV3IHByb3BlcnR5IHJvb21OdW1iZXIgZm9yIHRyYXZlbGxlcj8gLS1cclxuICAgIC8vIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRyYXZlbGxlcnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAvLyAgIHRoaXMudHJhdmVsbGVyc1tpbmRleF0ucm9vbU51bWJlciA9IHJvb21zW2luZGV4XTtcclxuICAgIC8vIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlx0QGRlc2MgLSByZXR1cm4gdGhlIG9jY3VwYW5jeSBmb3IgYSByb29tIC0gbmVlZCB0byBjYWxjdWxhdGUgYmFzZWQgb24gbm8gb2Ygcm9vbXMsIG5vIG9mIHRyYXZlbGxlcnMgYW5kIGN1cnJlbnRseSBvY2N1cGllZCByb29tcztcclxuICAgKiovXHJcblxyXG4gIGNhbGNSb29tT2NjdXBhbmN5KG5vX29mX3Jvb21zOiBudW1iZXIsIHRyYXZlbGxlcnM6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgJ05vIG9mIFRyYXZlbGxlcnM6ICcgK1xyXG4gICAgICAgIHRyYXZlbGxlcnMgK1xyXG4gICAgICAgICd8IE5vIG9mIHJvb21zOiAnICtcclxuICAgICAgICBub19vZl9yb29tcyArXHJcbiAgICAgICAgJyB8IEFzc2lnbmVkOiAnICtcclxuICAgICAgICB0aGlzLm9jY3VwaWVkXHJcbiAgICApO1xyXG4gICAgbGV0IHJvb21PY2N1cGFuY3k6IG51bWJlciA9IE1hdGguY2VpbCh0cmF2ZWxsZXJzIC8gbm9fb2Zfcm9vbXMpO1xyXG5cclxuICAgIGlmICh0cmF2ZWxsZXJzIC0gdGhpcy5vY2N1cGllZCA8IHJvb21PY2N1cGFuY3kpIHtcclxuICAgICAgY29uc29sZS5sb2coJ1dlIGhhdmUgcnVuIG91dCBvZiBvY2N1cGllcnMhJyk7XHJcbiAgICAgIHJvb21PY2N1cGFuY3kgPSB0cmF2ZWxsZXJzIC0gdGhpcy5vY2N1cGllZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm9vbU9jY3VwYW5jeSA8PSAwKSB7XHJcbiAgICAgIHJvb21PY2N1cGFuY3kgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub2NjdXBpZWQgKz0gcm9vbU9jY3VwYW5jeTtcclxuICAgIHJldHVybiByb29tT2NjdXBhbmN5O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkSG90ZWxSb29tVG9CYXNrZXQoXHJcbiAgICBob3RlbDogSG90ZWxEZXRhaWxzLFxyXG4gICAgaG90ZWxSb29tOiBIb3RlbFJvb20sXHJcbiAgICBob3RlbFF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyxcclxuICAgIHRyYXZlbGxlcnM/OiBUcmF2ZWxsZXJbXVxyXG4gICk6IFByb21pc2U8RGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucz4ge1xyXG4gICAgY29uc29sZS5sb2coaG90ZWwpO1xyXG4gICAgY29uc29sZS5sb2coaG90ZWxSb29tKTtcclxuICAgIGNvbnNvbGUubG9nKGhvdGVsUXVlcnkpO1xyXG5cclxuICAgIGlmIChob3RlbC51bmF2YWlsYWJsZSkge1xyXG4gICAgICByZXR1cm4gRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbW9kaWZ5IHRoZSAnc3RhcnREYXRlJyBhbmQgJ2VuZERhdGUnIHByb3BlcnRpZXMgdG8gaGF2ZSBJU08gZm9ybWF0XHJcbiAgICBob3RlbFF1ZXJ5LnN0YXJ0RGF0ZSA9IG5ldyBEYXRlKGhvdGVsUXVlcnkuc3RhcnREYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgaG90ZWxRdWVyeS5lbmREYXRlID0gbmV3IERhdGUoaG90ZWxRdWVyeS5lbmREYXRlKS50b0lTT1N0cmluZygpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBjb3B5IG9mIGhvdGVsUXVlcnkgYW5kIGRlbGV0ZSAnYWR1bHRzJyBwcm9wZXJ0eSBhcyBzZWFyY2hRdWVyeVNjaGVtYSBmb3IgaG90ZWwgKGNvbmZlcm1hKSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgaXQgYmVpbmcgYWRkZWRcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0geyAuLi5ob3RlbFF1ZXJ5IH07XHJcbiAgICBkZWxldGUgc2VhcmNoUXVlcnkuYWR1bHRzO1xyXG5cclxuICAgIGNvbnN0IGRldGFpbFJvb21zOiB7XHJcbiAgICAgIHJhdGVEZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gICAgICByb29tRGVzY3JpcHRpb246IHN0cmluZztcclxuICAgICAgcm9vbUlkOiBzdHJpbmc7XHJcbiAgICAgIHJvb21UeXBlOiBzdHJpbmc7XHJcbiAgICAgIHJhdGVDb2RlOiBzdHJpbmc7XHJcbiAgICAgIGNoZWNrSW46IGFueTtcclxuICAgICAgY2hlY2tPdXQ6IGFueTtcclxuICAgIH1bXSA9IFtdO1xyXG4gICAgZGV0YWlsUm9vbXMucHVzaCh7XHJcbiAgICAgIHJhdGVEZXNjcmlwdGlvbjogaG90ZWxSb29tLnJhdGVEZXNjcmlwdGlvbixcclxuICAgICAgcm9vbURlc2NyaXB0aW9uOiBob3RlbFJvb20ucm9vbURlc2NyaXB0aW9uLFxyXG4gICAgICByb29tSWQ6IGhvdGVsUm9vbS5yb29tSWQsXHJcbiAgICAgIHJvb21UeXBlOiBob3RlbFJvb20ucm9vbVR5cGUsXHJcbiAgICAgIHJhdGVDb2RlOiBob3RlbFJvb20ucmF0ZUNvZGUsXHJcbiAgICAgIGNoZWNrSW46IGhvdGVsUXVlcnkuc3RhcnREYXRlLFxyXG4gICAgICBjaGVja091dDogaG90ZWxRdWVyeS5lbmREYXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgLy8gRU5ULTI0NDcgYWRkIGluIGNodW5rcyB3aXRoIHBlb3BsZSBwZXIgcm9vbVxyXG4gICAgICBjb25zdCBwYXhQZXJSb29tOiBudW1iZXIgPSB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzO1xyXG5cclxuICAgICAgLy8gRU5ULTMwNDggVG8gYmUgY2hhbmdlZCB3aGVuIHRyYXZsbGVycyBmbG93IGFkZGVkXHJcbiAgICAgIGNvbnN0IHJvb21BcnJheSA9IG5ldyBBcnJheSh0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXMpLmZpbGwoJ1RFU1QnKTtcclxuICAgICAgY29uc3QgbnVtYmVyVG9TcGxpdCA9IHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyA9PT0gcGF4UGVyUm9vbSA/IDEgOiAyO1xyXG4gICAgICBjb25zdCBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzID0gXy5jaHVuayh0aGlzLnRyYXZlbGxlcnMsIG51bWJlclRvU3BsaXQpO1xyXG4gICAgICBjb25zdCB7IGFkZHJlc3M6IGhvdGVsQWFkZHJlc3MgfSA9IGhvdGVsO1xyXG4gICAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChob3RlbFJvb20sIGhvdGVsUXVlcnkpO1xyXG4gICAgICAvLyBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzLmZvckVhY2goKGNodW5rOiBUcmF2ZWxsZXJbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gcm9vbUFycmF5LnJlZHVjZShcclxuICAgICAgICBhc3luYyAoXHJcbiAgICAgICAgICBjdXJyZW50OiBEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zLFxyXG4gICAgICAgICAgY2h1bms6IFRyYXZlbGxlcltdLFxyXG4gICAgICAgICAgaW5kZXg6IG51bWJlclxyXG4gICAgICAgICk6IFByb21pc2U8RGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucz4gPT4ge1xyXG4gICAgICAgICAgc3dpdGNoIChhd2FpdCBjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jYW5jZWw6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMuY2FuY2VsO1xyXG4gICAgICAgICAgICBjYXNlIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMucmVzZWFyY2g6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMucmVzZWFyY2g7XHJcbiAgICAgICAgICAgIGNhc2UgRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jb250aW51ZTpcclxuICAgICAgICAgICAgY2FzZSBEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zLm5ld0Jhc2tldDpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCB3aCA9IGF3YWl0IHRoaXMuYmFza2V0U2VydmljZS5hZGRUb0Jhc2tldChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGFkdWx0czogbnVtYmVyVG9TcGxpdCxcclxuICAgICAgICAgICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgICAgICAgICAgICBzZXJ2aWNlOiBob3RlbC5zb3VyY2VJZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgaG90ZWxBZGRyZXNzOiB7XHJcbiAgICAgICAgICAgICAgICAgIHN0cmVldE5hbWU6IGhvdGVsQWFkZHJlc3MuYWRkcmVzc0xpbmUxLFxyXG4gICAgICAgICAgICAgICAgICB0b3duOiBob3RlbEFhZGRyZXNzLmFkZHJlc3NMaW5lMixcclxuICAgICAgICAgICAgICAgICAgY291bnR5OiBob3RlbEFhZGRyZXNzLmFkZHJlc3NMaW5lMyxcclxuICAgICAgICAgICAgICAgICAgcG9zdGNvZGU6IGhvdGVsQWFkZHJlc3MucG9zdE9yWmlwQ29kZSxcclxuICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGU6IGhvdGVsQWFkZHJlc3MuY291bnRyeUNvZGVcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3RlbERlc2NyaXB0aW9uOiBob3RlbC5ncm91cCxcclxuICAgICAgICAgICAgICAgIGhvdGVsSWQ6IGhvdGVsLmlkLFxyXG4gICAgICAgICAgICAgICAgaG90ZWxOYW1lOiBob3RlbC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgYWx3YXlzIGJlIDEgYXMgd2UgYm9vayAxIHJvb20gYXMgYSB0aW1lXHJcbiAgICAgICAgICAgICAgICBudW1iZXJPZlJvb21zOiAxLFxyXG4gICAgICAgICAgICAgICAgcm9vbXM6IGRldGFpbFJvb21zLFxyXG4gICAgICAgICAgICAgICAgdGVybXNBbmRDb25kOiB0ZXJtc0FuZENvbmRpdGlvbnNcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIC8vIG5vIGxvbmdlciAqIG5vIG9mIHJvb21zIGFzIGVhY2ggcm9vbSBpcyBhZGRlZCAxIGJ5IDFcclxuICAgICAgICAgICAgICBwcmljZTogaG90ZWxSb29tLnRvdGFsLCAvLyAqIGhvdGVsUXVlcnkucm9vbXMsXHJcbiAgICAgICAgICAgICAgY3VycmVuY3k6IGhvdGVsUm9vbS5jdXJyZW5jeUNvZGUgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgICAgICAgICAgIHNlYXJjaFF1ZXJ5LFxyXG4gICAgICAgICAgICAgIG91dGJvdW5kRGF0ZTogaG90ZWxRdWVyeS5zdGFydERhdGVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2UsXHJcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gYXJyYXkgb2YgMSBvciAyIHRyYXZlbGxlcnMgd2hpY2ggZ28gaW4gMSByb29tXHJcbiAgICAgICAgICAgIC8vIGNodW5rXHJcbiAgICAgICAgICAgIGJvb2tlZFRyYXZlbGxlcnNDaHVua3NbaW5kZXhdIHx8IFtdLFxyXG4gICAgICAgICAgICBob3RlbFJvb20ucmVxdWlyZXNSZWFzb25cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAod2ggPT09IERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMucmVzZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5wZXJmb3JtU2VhcmNoKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gd2g7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zLmNvbnRpbnVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jYW5jZWw7XHJcbiAgfVxyXG5cclxuICBnZXRUZXJtc0FuZENvbmQoXHJcbiAgICBob3RlbFJvb206IEhvdGVsUm9vbSxcclxuICAgIGhvdGVsUXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1JhdGUgSW5mb3JtYXRpb24nLFxyXG4gICAgICAgIHZhbHVlOiBob3RlbFJvb20ucmF0ZURlc2NyaXB0aW9uXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnQ2FuY2VsbGF0aW9uIFBvbGljeScsXHJcbiAgICAgICAgdmFsdWU6IGhvdGVsUm9vbS5wb2xpY2llcy5jYW5jZWxsYXRpb25cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdSYXRlIENvZGUnLFxyXG4gICAgICAgIHZhbHVlOiBob3RlbFJvb20ucmF0ZUNvZGVcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdSb29tIEluZm9ybWF0aW9uJyxcclxuICAgICAgICB2YWx1ZTogaG90ZWxSb29tLnJvb21EZXNjcmlwdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0RlcG9zaXQgQW1vdW50JyxcclxuICAgICAgICB2YWx1ZTpcclxuICAgICAgICAgIChob3RlbFJvb20udG90YWwgKiBob3RlbFF1ZXJ5LnJvb21zKS50b1N0cmluZygpICsgaG90ZWxRdWVyeS5jdXJyZW5jeVxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVNlYXJjaChob3RlbE5hbWU6IHN0cmluZyA9IG51bGwpOiBPYnNlcnZhYmxlPFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHQ+IHtcclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIGNvbnN0IGZhdm91cml0ZVNlYXJjaFF1ZXJ5ID0gdGhpcy51cGRhdGVTZXJjaFF1ZXJ5KHF1ZXJ5KTtcclxuICAgICAgaWYgKGhvdGVsTmFtZSkgZmF2b3VyaXRlU2VhcmNoUXVlcnkuaG90ZWxOYW1lID0gaG90ZWxOYW1lO1xyXG4gICAgICBjb25zdCBzZWFyY2hJbmZvID0ge1xyXG4gICAgICAgIG5hbWU6IGAke21vbWVudCgpfWAsXHJcbiAgICAgICAgc2VydmljZVR5cGU6IFNlcnZpY2VUeXBlLkhvdGVsLFxyXG4gICAgICAgIHNlYXJjaEFyZ3M6IGZhdm91cml0ZVNlYXJjaFF1ZXJ5XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZUZhdm91cml0ZVNlYXJjaChzZWFyY2hJbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFwcGx5RmF2b3VyaXRlKGZhdjogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLm5vX29mX29jY3VwYW50cyA9IGZhdi5hZHVsdHM7XHJcbiAgICB0aGlzLm5vX29mX3Jvb21zID0gZmF2LnJvb21zO1xyXG4gICAgdGhpcy5kaXN0YW5jZSA9IGZhdi5kaXN0YW5jZTtcclxuICAgIHRoaXMuY3VycmVuY3kgPSBmYXYuY3VycmVuY3k7XHJcbiAgICBsZXQgbG9jYXRpb246IHtcclxuICAgICAgbGF0aXR1ZGU6IG51bWJlcjtcclxuICAgICAgbG9uZ2l0dWRlOiBudW1iZXI7XHJcbiAgICAgIGNvdW50cnlDb2RlOiBzdHJpbmc7XHJcbiAgICAgIG5hbWU/OiBzdHJpbmc7XHJcbiAgICAgIHR5cGU/OiBzdHJpbmc7XHJcbiAgICB9ID0ge1xyXG4gICAgICBsYXRpdHVkZTogZmF2LmxhdGl0dWRlLFxyXG4gICAgICBsb25naXR1ZGU6IGZhdi5sb25naXR1ZGUsXHJcbiAgICAgIGNvdW50cnlDb2RlOiBmYXYuY291bnRyeUNvZGUsXHJcbiAgICAgIG5hbWU6IGZhdi5jaXR5TmFtZVxyXG4gICAgfTtcclxuICAgIGlmIChmYXYudHJhaW5TdGF0aW9uQ29kZSkgbG9jYXRpb24udHlwZSA9IExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uO1xyXG4gICAgZWxzZSBpZiAoZmF2Lm9mZmljZUlkKSBsb2NhdGlvbi50eXBlID0gTG9jYXRpb25UeXBlcy5PZmZpY2U7XHJcbiAgICBlbHNlIGlmIChmYXYuaWF0YSkgbG9jYXRpb24udHlwZSA9IExvY2F0aW9uVHlwZXMuQWlycG9ydDtcclxuICAgIGVsc2UgaWYgKGZhdi5wb3N0T3JaaXBDb2RlKSBsb2NhdGlvbi50eXBlID0gTG9jYXRpb25UeXBlcy5Qb3N0Y29kZTtcclxuICAgIGVsc2UgbG9jYXRpb24udHlwZSA9IExvY2F0aW9uVHlwZXMuQ2l0eTtcclxuICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcclxuICAgIHRoaXMuaG90ZWxfbmFtZSA9IGZhdi5ob3RlbE5hbWU7XHJcbiAgICBpZiAoZmF2Lmdyb3VwTmFtZSkgdGhpcy5ob3RlbF9jaGFpbiA9IHsgbmFtZTogZmF2Lmdyb3VwTmFtZSB9O1xyXG4gICAgZWxzZSB0aGlzLmhvdGVsX2NoYWluID0gbnVsbDtcclxuICB9XHJcbn1cclxuIl19
|