@sabstravtech/obtservices 0.0.19020100 → 0.0.22041208
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular/components/with-component.d.ts +2 -1
- package/angular/fetchers.d.ts +17 -12
- package/angular/lib/vendor/classes/helpers.d.ts +8 -0
- package/angular/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/apply-jit-flight-rules.d.ts +7 -0
- package/angular/lib/vendor/fetchers/basket-fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/conferma-office.fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/flight-fare-rules.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/flight-quote.fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/get-conferma-room-images.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-covid-microsite-token.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-flight-seat-map-fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-rail-live-departures.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-user-favourite-searches.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/irl-discount-card-fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/search-airlines-fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/search-airports-fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/user-fetcher.d.ts +2 -1
- package/angular/lib/vendor/services/my-bookings.service.d.ts +4 -3
- package/angular/lib/vendor/services/search.service.d.ts +15 -3
- package/angular/lib/vendor/services/user.service.d.ts +4 -3
- package/angular/lib/vendor/types/graphql.angular.types.d.ts +1062 -1062
- package/angular/lib/vendor/updaters/cancel-booking-updater.d.ts +6 -0
- package/angular/lib/vendor/updaters/confirm-messages-updater.d.ts +6 -0
- package/angular/lib/vendor/updaters/remove-favourite-search.updater.d.ts +6 -0
- package/angular/lib/vendor/updaters/save-favourite-search.updater.d.ts +6 -0
- package/angular/sabstravtech-obtservices-angular.d.ts +14 -9
- package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
- package/angular/updaters.d.ts +3 -0
- package/base/classes.d.ts +1 -0
- package/base/fetchers.d.ts +27 -3
- package/base/interfaces.d.ts +3 -3
- package/base/lib/vendor/classes/base-enterprise.d.ts +5 -2
- package/base/lib/vendor/classes/bookable-basket.d.ts +1 -1
- package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +8 -7
- package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +11 -2
- package/base/lib/vendor/classes/enviroment.d.ts +2 -0
- package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +26 -69
- package/base/lib/vendor/classes/flight-enterprise-search.d.ts +39 -22
- package/base/lib/vendor/classes/helpers.d.ts +49 -6
- package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +19 -8
- package/base/lib/vendor/classes/irl-direction.enum.d.ts +4 -0
- package/base/lib/vendor/classes/irl-enterprise-search.d.ts +285 -30
- package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +7 -3
- package/base/lib/vendor/classes/management-info-and-valid.d.ts +1 -0
- package/base/lib/vendor/classes/modal-types.enum.d.ts +4 -0
- package/base/lib/vendor/classes/parking-enterprise-search.d.ts +7 -3
- package/base/lib/vendor/classes/rail-direction.enum.d.ts +2 -2
- package/base/lib/vendor/classes/rail-enterprise-search.d.ts +83 -54
- package/base/lib/vendor/classes/rail-index-to-ticket.d.ts +9 -0
- package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +1 -0
- package/base/lib/vendor/classes/user-favourite.enum.d.ts +3 -0
- package/base/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.d.ts +23 -0
- package/base/lib/vendor/fetchers/apply-jit-flight-rules.d.ts +21 -0
- package/base/lib/vendor/fetchers/basket-fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/conferma-office.fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/flight-fare-rules.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/flight-quote.fetcher.d.ts +6 -2
- package/base/lib/vendor/fetchers/get-conferma-room-images.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-covid-microsite-token.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-flight-seat-map-fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-rail-live-departures.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-user-favourite-searches.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/irl-discount-card-fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/list-fetchable-enterprise.d.ts +1 -1
- package/base/lib/vendor/fetchers/object-fetchable-enterprise.d.ts +3 -1
- package/base/lib/vendor/fetchers/search-airlines.fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/search-airports-fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/user-fetcher.d.ts +2 -1
- package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +3 -2
- package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +4 -1
- package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +4 -3
- package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +8 -4
- package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +15 -4
- package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +8 -22
- package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +15 -10
- package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +4 -2
- package/base/lib/vendor/interfaces/Imybookings.service.d.ts +2 -1
- package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +3 -2
- package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +31 -31
- package/base/lib/vendor/interfaces/Isearch.service.d.ts +12 -3
- package/base/lib/vendor/interfaces/Iuser.service.d.ts +3 -1
- package/base/lib/vendor/interfaces/cab-hire-search-arg.interface.d.ts +10 -0
- package/base/lib/vendor/interfaces/car-hire-search-arg.interface.d.ts +42 -0
- package/base/lib/vendor/interfaces/enable-fresh-chat-interface.d.ts +7 -0
- package/base/lib/vendor/interfaces/eurostar-search-arg.interface.d.ts +6 -0
- package/base/lib/vendor/interfaces/flight-filters.interface.d.ts +1 -0
- package/base/lib/vendor/interfaces/flight-search-args.interface.d.ts +8 -0
- package/base/lib/vendor/interfaces/hotel-recent-search-args.interface.d.ts +4 -0
- package/base/lib/vendor/interfaces/irl-search-arg.interface.d.ts +5 -0
- package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +11 -5
- package/base/lib/vendor/interfaces/rail-recent-search-args.interface.d.ts +16 -11
- package/base/lib/vendor/interfaces/rail-selected-ticket.interface.d.ts +4 -9
- package/base/lib/vendor/interfaces/summary-interface.d.ts +23 -0
- package/base/lib/vendor/interfaces/terms-and-conditions.interface.d.ts +4 -0
- package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
- package/base/lib/vendor/services/enterprise-basket.service.d.ts +5 -3
- package/base/lib/vendor/services/hotel-avallibility.service.d.ts +5 -3
- package/base/lib/vendor/services/my-bookings.service.d.ts +6 -3
- package/base/lib/vendor/services/search.service.d.ts +46 -10
- package/base/lib/vendor/services/user.service.d.ts +9 -4
- package/base/lib/vendor/types/graphql.types.d.ts +982 -1051
- package/base/lib/vendor/types/types.d.ts +187 -14
- package/base/lib/vendor/updaters/cancel-booking-updater.d.ts +20 -0
- package/base/lib/vendor/updaters/confirm-messages-updater.d.ts +19 -0
- package/base/lib/vendor/updaters/remove-favourite-search-updater.d.ts +19 -0
- package/base/lib/vendor/updaters/save-favourite-search-updater.d.ts +20 -0
- package/base/sabstravtech-obtservices-base.metadata.json +1 -1
- package/base/updaters.d.ts +4 -0
- package/bundles/sabstravtech-obtservices-angular.umd.js +763 -158
- 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 +8805 -7342
- 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 +9 -5
- package/esm2015/angular/components/with-component.js +7 -4
- package/esm2015/angular/fetchers.js +18 -13
- package/esm2015/angular/lib/vendor/classes/helpers.js +21 -4
- package/esm2015/angular/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/apply-jit-flight-rules.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/basket-fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/conferma-office.fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/flight-fare-rules.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/flight-quote.fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/get-conferma-room-images.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-covid-microsite-token.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-flight-seat-map-fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-rail-live-departures.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-user-favourite-searches.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/irl-discount-card-fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/search-airlines-fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/search-airports-fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/user-fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/services/my-bookings.service.js +8 -5
- package/esm2015/angular/lib/vendor/services/search.service.js +69 -33
- package/esm2015/angular/lib/vendor/services/user.service.js +9 -6
- package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +1467 -2520
- package/esm2015/angular/lib/vendor/updaters/cancel-booking-updater.js +22 -0
- package/esm2015/angular/lib/vendor/updaters/confirm-messages-updater.js +22 -0
- package/esm2015/angular/lib/vendor/updaters/remove-favourite-search.updater.js +22 -0
- package/esm2015/angular/lib/vendor/updaters/save-favourite-search.updater.js +22 -0
- package/esm2015/angular/obtservices.module.js +17 -1
- package/esm2015/angular/sabstravtech-obtservices-angular.js +15 -10
- package/esm2015/angular/updaters.js +4 -1
- package/esm2015/base/classes.js +2 -1
- package/esm2015/base/fetchers.js +28 -4
- package/esm2015/base/interfaces.js +4 -4
- package/esm2015/base/lib/vendor/classes/base-enterprise.js +14 -14
- package/esm2015/base/lib/vendor/classes/bookable-basket.js +11 -6
- package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +76 -103
- package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +121 -18
- package/esm2015/base/lib/vendor/classes/enviroment.js +3 -1
- package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +540 -677
- package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +676 -298
- package/esm2015/base/lib/vendor/classes/helpers.js +260 -70
- package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +289 -123
- package/esm2015/base/lib/vendor/classes/irl-direction.enum.js +6 -0
- package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +412 -694
- package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +98 -5
- package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +49 -30
- package/esm2015/base/lib/vendor/classes/modal-types.enum.js +5 -1
- package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +61 -5
- package/esm2015/base/lib/vendor/classes/rail-direction.enum.js +3 -3
- package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +1024 -682
- package/esm2015/base/lib/vendor/classes/rail-index-to-ticket.js +48 -0
- package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +16 -4
- package/esm2015/base/lib/vendor/classes/user-favourite.enum.js +4 -1
- package/esm2015/base/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.js +22 -0
- package/esm2015/base/lib/vendor/fetchers/apply-jit-flight-rules.js +10 -0
- package/esm2015/base/lib/vendor/fetchers/basket-fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/conferma-office.fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/flight-fare-rules.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/flight-quote.fetcher.js +12 -4
- package/esm2015/base/lib/vendor/fetchers/get-conferma-room-images.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-covid-microsite-token.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-flight-seat-map-fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-rail-live-departures.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-user-favourite-searches.fetcher.js +10 -0
- package/esm2015/base/lib/vendor/fetchers/irl-discount-card-fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/list-fetchable-enterprise.js +5 -3
- package/esm2015/base/lib/vendor/fetchers/object-fetchable-enterprise.js +4 -3
- package/esm2015/base/lib/vendor/fetchers/search-airlines.fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/search-airports-fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/search-conferma-cities.fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/user-fetcher.js +3 -3
- 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/Iflight-enterprise-search.js +7 -1
- package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +1 -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/Imybookings.service.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/Iuser.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/cab-hire-search-arg.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/car-hire-search-arg.interface.js +3 -0
- package/esm2015/base/lib/vendor/interfaces/enable-fresh-chat-interface.js +3 -0
- package/esm2015/base/lib/vendor/interfaces/eurostar-search-arg.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/flight-filters.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/flight-search-args.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/hotel-recent-search-args.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/irl-search-arg.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/rail-recent-search-args.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/rail-selected-ticket.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/summary-interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/terms-and-conditions.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
- package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +107 -57
- package/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +43 -5
- package/esm2015/base/lib/vendor/services/my-bookings.service.js +6 -2
- package/esm2015/base/lib/vendor/services/search.service.js +110 -46
- package/esm2015/base/lib/vendor/services/user.service.js +13 -2
- package/esm2015/base/lib/vendor/types/graphql.types.js +35 -28
- package/esm2015/base/lib/vendor/types/types.js +35 -2
- package/esm2015/base/lib/vendor/updaters/cancel-booking-updater.js +11 -0
- package/esm2015/base/lib/vendor/updaters/confirm-messages-updater.js +11 -0
- package/esm2015/base/lib/vendor/updaters/remove-favourite-search-updater.js +11 -0
- package/esm2015/base/lib/vendor/updaters/save-favourite-search-updater.js +11 -0
- package/esm2015/base/updaters.js +5 -1
- package/fesm2015/sabstravtech-obtservices-angular.js +1554 -2350
- package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
- package/fesm2015/sabstravtech-obtservices-base.js +8088 -6752
- package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
- package/package.json +1 -1
- package/base/lib/vendor/interfaces/rail-journey-leg.interface.d.ts +0 -6
- package/base/lib/vendor/interfaces/rail-ticket-group.interface.d.ts +0 -26
- package/base/lib/vendor/interfaces/rail-ticket-groups.interface.d.ts +0 -4
- package/esm2015/base/lib/vendor/interfaces/rail-journey-leg.interface.js +0 -2
- package/esm2015/base/lib/vendor/interfaces/rail-ticket-group.interface.js +0 -2
- package/esm2015/base/lib/vendor/interfaces/rail-ticket-groups.interface.js +0 -2
|
@@ -7,6 +7,7 @@ import { URLS } from './../services/url.service';
|
|
|
7
7
|
import { LocationTypes, includedExpression, excludedExpression, SearchHandler } from '../types/types';
|
|
8
8
|
import { DistanceTypes, ServiceType } from '../types/graphql.types';
|
|
9
9
|
import { HotelFilters, HotelView } from '../interfaces/Ihotel-enterprise-search';
|
|
10
|
+
import _ from 'lodash';
|
|
10
11
|
export var SortTypesHotel;
|
|
11
12
|
(function (SortTypesHotel) {
|
|
12
13
|
SortTypesHotel["distance"] = "distance";
|
|
@@ -16,30 +17,9 @@ export var SortTypesHotel;
|
|
|
16
17
|
const CLIENT_PREFERRED_VALUE = 1;
|
|
17
18
|
const AGENT_PREFERRED_VALUE = 2;
|
|
18
19
|
export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
19
|
-
constructor(hotelFetcher, helpers, userService, environment, avaliabilityService, basketService, storageService, searchService, httpCallService, quickListFetcher, getRailStationFetcher) {
|
|
20
|
-
super(storageService,
|
|
21
|
-
this.results_details.maxDistance = 0;
|
|
22
|
-
this.results_details.chains = new Set();
|
|
23
|
-
return resultsToMap.map((hotelResult, index) => {
|
|
24
|
-
this.results_details.maxDistance = Math.max(this.results_details.maxDistance, hotelResult.location.distance);
|
|
25
|
-
this.filters.distanceRange.max = this.results_details.maxDistance;
|
|
26
|
-
this.results_details.chains.add(hotelResult.group);
|
|
27
|
-
if (index < this.environment.numberHotelToPreload) {
|
|
28
|
-
this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotelResult));
|
|
29
|
-
}
|
|
30
|
-
// this.getHotelAvailability(hotelResult);
|
|
31
|
-
return Object.assign({ sortedTags: this.sortTags(hotelResult.tags), Details: {
|
|
32
|
-
distance_airport: 0,
|
|
33
|
-
distance_metro: 0,
|
|
34
|
-
distance_rail: 0,
|
|
35
|
-
airport_details: { name: 'Not returned' },
|
|
36
|
-
metro_details: { name: 'Not returned' },
|
|
37
|
-
rail_details: { name: 'Not returned' }
|
|
38
|
-
} }, hotelResult);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
20
|
+
constructor(hotelFetcher, helpers, userService, environment, avaliabilityService, basketService, storageService, searchService, httpCallService, quickListFetcher, getRailStationFetcher, applyHotelRulesFetcher) {
|
|
21
|
+
super(storageService, helpers);
|
|
41
22
|
this.hotelFetcher = hotelFetcher;
|
|
42
|
-
this.helpers = helpers;
|
|
43
23
|
this.userService = userService;
|
|
44
24
|
this.environment = environment;
|
|
45
25
|
this.avaliabilityService = avaliabilityService;
|
|
@@ -48,6 +28,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
48
28
|
this.httpCallService = httpCallService;
|
|
49
29
|
this.quickListFetcher = quickListFetcher;
|
|
50
30
|
this.getRailStationFetcher = getRailStationFetcher;
|
|
31
|
+
this.applyHotelRulesFetcher = applyHotelRulesFetcher;
|
|
51
32
|
this.type = ServiceType.Hotel;
|
|
52
33
|
this.location_types = new BehaviorSubject([]);
|
|
53
34
|
this.offices = new BehaviorSubject([]);
|
|
@@ -59,6 +40,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
59
40
|
amenities: [],
|
|
60
41
|
maxDistance: 0
|
|
61
42
|
};
|
|
43
|
+
this._bookedTravellers = [];
|
|
62
44
|
// Event Emitters
|
|
63
45
|
this.filterChange = new Subject();
|
|
64
46
|
this.selectItemMapView = new Subject();
|
|
@@ -87,7 +69,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
87
69
|
// For NgForing over in the templates
|
|
88
70
|
this._max_no_of_rooms = 4;
|
|
89
71
|
this._max_rooms_array = new Array(this._max_no_of_rooms).fill(0);
|
|
90
|
-
this._max_no_of_occupants =
|
|
72
|
+
this._max_no_of_occupants = 8;
|
|
91
73
|
this._max_occupant_array = new Array(this._max_no_of_occupants).fill(0);
|
|
92
74
|
this._distance_list = [1, 2, 5, 10, 20, 25]; // copied from old frontend for now
|
|
93
75
|
this._default_currency = null;
|
|
@@ -136,7 +118,10 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
136
118
|
results
|
|
137
119
|
.slice(0, this.environment.numberHotelToPreload)
|
|
138
120
|
.forEach((hotel) => {
|
|
139
|
-
this.
|
|
121
|
+
if (this.searchService.canBook(ServiceType.Hotel)) {
|
|
122
|
+
// need this check because on refresh we are getting errors - theory that user hasn't fully loaded in yet
|
|
123
|
+
this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotel), hotel);
|
|
124
|
+
}
|
|
140
125
|
});
|
|
141
126
|
results.forEach((hotelResult) => {
|
|
142
127
|
this.results_details.chains.add(hotelResult.group);
|
|
@@ -166,6 +151,10 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
166
151
|
this.localFilters.priceRange.max = maxNumber;
|
|
167
152
|
}
|
|
168
153
|
this._cheapestResultPrice = this.updateLowestPrice(results);
|
|
154
|
+
if (this.searchService.canBook(ServiceType.Hotel)) {
|
|
155
|
+
// need this check because on refresh we are getting errors - theory that user hasn't fully loaded in yet
|
|
156
|
+
this._applyTravelRules();
|
|
157
|
+
}
|
|
169
158
|
}
|
|
170
159
|
});
|
|
171
160
|
}
|
|
@@ -246,7 +235,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
246
235
|
return this.tempParams.no_of_occupants;
|
|
247
236
|
}
|
|
248
237
|
set no_of_occupants(newOcc) {
|
|
249
|
-
if (newOcc < 1
|
|
238
|
+
if (newOcc < 1) {
|
|
250
239
|
return;
|
|
251
240
|
}
|
|
252
241
|
this.tempParams.no_of_occupants = newOcc;
|
|
@@ -348,8 +337,55 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
348
337
|
get filters() {
|
|
349
338
|
return this.localFilters;
|
|
350
339
|
}
|
|
340
|
+
processResults(resultsToMap) {
|
|
341
|
+
this.results_details.maxDistance = 0;
|
|
342
|
+
this.results_details.chains = new Set();
|
|
343
|
+
return resultsToMap.map((hotelResult, index) => {
|
|
344
|
+
this.results_details.maxDistance = Math.max(this.results_details.maxDistance, hotelResult.location.distance);
|
|
345
|
+
this.filters.distanceRange.max = this.results_details.maxDistance;
|
|
346
|
+
this.results_details.chains.add(hotelResult.group);
|
|
347
|
+
if (index < this.environment.numberHotelToPreload) {
|
|
348
|
+
this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotelResult), hotelResult);
|
|
349
|
+
}
|
|
350
|
+
// this.getHotelAvailability(hotelResult);
|
|
351
|
+
return Object.assign({ sortedTags: this.sortTags(hotelResult.tags), Details: {
|
|
352
|
+
distance_airport: 0,
|
|
353
|
+
distance_metro: 0,
|
|
354
|
+
distance_rail: 0,
|
|
355
|
+
airport_details: { name: 'Not returned' },
|
|
356
|
+
metro_details: { name: 'Not returned' },
|
|
357
|
+
rail_details: { name: 'Not returned' }
|
|
358
|
+
} }, hotelResult);
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
_applyTravelRules() {
|
|
362
|
+
const data = this.helpers
|
|
363
|
+
.clone(this.fullResults || [])
|
|
364
|
+
.map((hotel) => {
|
|
365
|
+
return this.avaliabilityService.updateHotel(hotel);
|
|
366
|
+
})
|
|
367
|
+
.filter((hotel) => {
|
|
368
|
+
return Object.keys(hotel.availableRates || {}).length > 0;
|
|
369
|
+
});
|
|
370
|
+
if (data.length === 0) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
this.applyHotelRulesFetcher
|
|
374
|
+
.fetchKeyedObject('id', {
|
|
375
|
+
data
|
|
376
|
+
})
|
|
377
|
+
.pipe(take(1))
|
|
378
|
+
.subscribe((data1) => {
|
|
379
|
+
this.results.next(this.fullResults.map((hotel) => {
|
|
380
|
+
if (data1[hotel.id]) {
|
|
381
|
+
return this.avaliabilityService.setHotelAvalability(data1[hotel.id]);
|
|
382
|
+
}
|
|
383
|
+
return hotel;
|
|
384
|
+
}));
|
|
385
|
+
});
|
|
386
|
+
}
|
|
351
387
|
makeLocations(location) {
|
|
352
|
-
return this.helpers.arrayToObjectArray(location, 'distanceType');
|
|
388
|
+
return this.helpers.arrayToObjectArray(location, ['distanceType']);
|
|
353
389
|
}
|
|
354
390
|
sortTags(tags) {
|
|
355
391
|
if (tags) {
|
|
@@ -420,7 +456,8 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
420
456
|
}
|
|
421
457
|
break;
|
|
422
458
|
case LocationTypes.TrainStation:
|
|
423
|
-
if (!((_e = (_d = this.tempParams.location) === null || _d === void 0 ? void 0 : _d.railstation) === null || _e === void 0 ? void 0 : _e.stationCode) &&
|
|
459
|
+
if (!((_e = (_d = this.tempParams.location) === null || _d === void 0 ? void 0 : _d.railstation) === null || _e === void 0 ? void 0 : _e.stationCode) &&
|
|
460
|
+
!((_f = this.trainsStation) === null || _f === void 0 ? void 0 : _f.stationCode)) {
|
|
424
461
|
this.validationMessages.push('Please select a train station.');
|
|
425
462
|
}
|
|
426
463
|
break;
|
|
@@ -458,25 +495,21 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
458
495
|
this.results.next([]);
|
|
459
496
|
this.avaliabilityService.reset();
|
|
460
497
|
if (this.isValid.value) {
|
|
498
|
+
this._originalUserSearch = Object.freeze(this.helpers.clone(this.tempParams));
|
|
461
499
|
// build the query
|
|
462
500
|
this.buildQuery();
|
|
463
501
|
const query = this.getSearchQuery();
|
|
464
502
|
this.searchService.saveRecentSearch(this.getRecentSearchQuery(this.getSearchQuery()));
|
|
465
|
-
return this._startSearch(this.tempParams.location_type_select === LocationTypes.Shortlist
|
|
466
|
-
this.quickListFetcher.fetchList({ countryCode: this.country.cCode })
|
|
467
|
-
this.hotelFetcher.fetchList(query));
|
|
503
|
+
return this._startSearch(this.tempParams.location_type_select === LocationTypes.Shortlist
|
|
504
|
+
? this.quickListFetcher.fetchList({ countryCode: this.country.cCode })
|
|
505
|
+
: this.hotelFetcher.fetchList(query));
|
|
468
506
|
}
|
|
469
507
|
else {
|
|
470
508
|
return Promise.resolve(false);
|
|
471
509
|
}
|
|
472
510
|
}
|
|
473
511
|
getRecentSearchQuery(query) {
|
|
474
|
-
|
|
475
|
-
const recentSearchQuery = query;
|
|
476
|
-
recentSearchQuery.location_type_select = this.location_type_select;
|
|
477
|
-
if ((_a = this.location) === null || _a === void 0 ? void 0 : _a.name) {
|
|
478
|
-
recentSearchQuery.cityName = this.location.name;
|
|
479
|
-
}
|
|
512
|
+
const recentSearchQuery = this.updateSerchQuery(query);
|
|
480
513
|
return {
|
|
481
514
|
serviceType: ServiceType.Hotel,
|
|
482
515
|
searchArgs: recentSearchQuery,
|
|
@@ -484,6 +517,26 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
484
517
|
travellers: this.helpers.getTravellersId(this.travellers)
|
|
485
518
|
};
|
|
486
519
|
}
|
|
520
|
+
updateSerchQuery(query) {
|
|
521
|
+
var _a;
|
|
522
|
+
const searchQuery = query;
|
|
523
|
+
searchQuery.location_type_select = this.location_type_select;
|
|
524
|
+
if ((_a = this.location) === null || _a === void 0 ? void 0 : _a.name) {
|
|
525
|
+
searchQuery.cityName = this.location.name;
|
|
526
|
+
}
|
|
527
|
+
switch (searchQuery.location_type_select) {
|
|
528
|
+
case LocationTypes.Office:
|
|
529
|
+
searchQuery.officeName = this.office.name;
|
|
530
|
+
break;
|
|
531
|
+
case LocationTypes.TrainStation:
|
|
532
|
+
searchQuery.trainsStationDetail = this.trainsStation;
|
|
533
|
+
break;
|
|
534
|
+
case LocationTypes.Airport:
|
|
535
|
+
searchQuery.airportDetail = this.location.airport;
|
|
536
|
+
break;
|
|
537
|
+
}
|
|
538
|
+
return searchQuery;
|
|
539
|
+
}
|
|
487
540
|
startRecentSearch(recentSearch) {
|
|
488
541
|
this.location_type_select = recentSearch.searchArgs.location_type_select;
|
|
489
542
|
this.currency = recentSearch.searchArgs.currency;
|
|
@@ -500,8 +553,10 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
500
553
|
// get location_type_select
|
|
501
554
|
switch (this.location_type_select) {
|
|
502
555
|
case LocationTypes.Airport:
|
|
503
|
-
this.searchService
|
|
504
|
-
|
|
556
|
+
this.searchService
|
|
557
|
+
.getAirportByCode(recentSearch.searchArgs.iata)
|
|
558
|
+
.subscribe((iata) => {
|
|
559
|
+
const airport = {
|
|
505
560
|
airport: {
|
|
506
561
|
gateway: iata.iataMatch.iata
|
|
507
562
|
}
|
|
@@ -516,7 +571,8 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
516
571
|
cName: ''
|
|
517
572
|
};
|
|
518
573
|
// should be one search metod for the city search: location or postcode
|
|
519
|
-
if (recentSearch.searchArgs.latitude &&
|
|
574
|
+
if (recentSearch.searchArgs.latitude &&
|
|
575
|
+
recentSearch.searchArgs.longitude) {
|
|
520
576
|
this.location = {
|
|
521
577
|
name: recentSearch.searchArgs.cityName,
|
|
522
578
|
latitude: recentSearch.searchArgs.latitude,
|
|
@@ -532,7 +588,10 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
532
588
|
this.searchService.startSearches();
|
|
533
589
|
break;
|
|
534
590
|
case LocationTypes.Office:
|
|
535
|
-
this.searchService
|
|
591
|
+
this.searchService
|
|
592
|
+
.getOffice(recentSearch.searchArgs.officeId)
|
|
593
|
+
.pipe(take(1))
|
|
594
|
+
.subscribe((office) => {
|
|
536
595
|
this.office = {
|
|
537
596
|
id: office.id,
|
|
538
597
|
name: office.name
|
|
@@ -559,72 +618,78 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
559
618
|
}
|
|
560
619
|
getRailStationByCode(code) {
|
|
561
620
|
if (code) {
|
|
562
|
-
return this.getRailStationFetcher
|
|
621
|
+
return this.getRailStationFetcher
|
|
622
|
+
.fetchList({ id: null, code })
|
|
623
|
+
.pipe(take(1));
|
|
563
624
|
}
|
|
564
625
|
else {
|
|
565
626
|
return of();
|
|
566
627
|
}
|
|
567
628
|
}
|
|
568
|
-
getSearchQuery() {
|
|
569
|
-
this.buildQuery();
|
|
629
|
+
getSearchQuery(ogSearch = false) {
|
|
630
|
+
this.buildQuery(ogSearch);
|
|
570
631
|
return this.helpers.removeNulls(this.query);
|
|
571
632
|
}
|
|
572
|
-
buildQuery() {
|
|
633
|
+
buildQuery(ogSearch = false) {
|
|
573
634
|
var _a, _b, _c, _d, _e, _f;
|
|
635
|
+
const tempParams = ogSearch ? this.originalUserSearch : this.tempParams;
|
|
574
636
|
const query = {
|
|
575
|
-
startDate:
|
|
576
|
-
endDate:
|
|
577
|
-
rooms:
|
|
578
|
-
adults:
|
|
579
|
-
currency:
|
|
580
|
-
distance:
|
|
637
|
+
startDate: tempParams.checkin_date.format('YYYY-MM-DD'),
|
|
638
|
+
endDate: tempParams.checkout_date.format('YYYY-MM-DD'),
|
|
639
|
+
rooms: tempParams.no_of_rooms,
|
|
640
|
+
adults: tempParams.no_of_occupants,
|
|
641
|
+
currency: tempParams.currency ? tempParams.currency : null,
|
|
642
|
+
distance: tempParams.distance,
|
|
581
643
|
distanceType: DistanceTypes.M,
|
|
582
644
|
maxResults: 100
|
|
583
645
|
};
|
|
584
646
|
this.getRoomNumber();
|
|
585
|
-
|
|
586
|
-
switch (this.tempParams.location_type_select) {
|
|
647
|
+
switch (tempParams.location_type_select) {
|
|
587
648
|
case LocationTypes.Airport:
|
|
588
|
-
query.iata =
|
|
649
|
+
query.iata = tempParams.location.airport.gateway;
|
|
589
650
|
break;
|
|
590
651
|
case LocationTypes.City:
|
|
591
|
-
query.countryCode =
|
|
652
|
+
query.countryCode = tempParams.country.cCode;
|
|
592
653
|
// should be one search metod for the city search: location or postcode
|
|
593
654
|
if (this.location) {
|
|
594
|
-
query.latitude =
|
|
595
|
-
query.longitude =
|
|
655
|
+
query.latitude = tempParams.location.latitude;
|
|
656
|
+
query.longitude = tempParams.location.longitude;
|
|
596
657
|
}
|
|
597
|
-
else if (
|
|
598
|
-
query.postOrZipCode =
|
|
658
|
+
else if (tempParams.postcode) {
|
|
659
|
+
query.postOrZipCode = tempParams.postcode.name;
|
|
599
660
|
}
|
|
600
661
|
break;
|
|
601
662
|
case LocationTypes.TrainStation:
|
|
602
|
-
if ((_b = (_a =
|
|
603
|
-
query.trainStationCode =
|
|
663
|
+
if ((_b = (_a = tempParams.location) === null || _a === void 0 ? void 0 : _a.railstation) === null || _b === void 0 ? void 0 : _b.stationCode) {
|
|
664
|
+
query.trainStationCode = tempParams.location.railstation.stationCode;
|
|
604
665
|
}
|
|
605
|
-
else if ((_c =
|
|
606
|
-
query.trainStationCode =
|
|
666
|
+
else if ((_c = tempParams.trainsStation) === null || _c === void 0 ? void 0 : _c.stationCode) {
|
|
667
|
+
query.trainStationCode = tempParams.trainsStation.stationCode;
|
|
607
668
|
}
|
|
608
669
|
break;
|
|
609
670
|
case LocationTypes.Office: // Needs to fix in next PR
|
|
610
|
-
if ((_d =
|
|
611
|
-
query.officeId = +
|
|
671
|
+
if ((_d = tempParams.location) === null || _d === void 0 ? void 0 : _d.id) {
|
|
672
|
+
query.officeId = +tempParams.location.id;
|
|
612
673
|
}
|
|
613
|
-
else if ((_e =
|
|
614
|
-
query.officeId = +
|
|
674
|
+
else if ((_e = tempParams.office) === null || _e === void 0 ? void 0 : _e.id) {
|
|
675
|
+
query.officeId = +tempParams.office.id;
|
|
615
676
|
}
|
|
616
677
|
break;
|
|
617
678
|
case LocationTypes.Shortlist:
|
|
618
|
-
query.countryCode =
|
|
679
|
+
query.countryCode = tempParams.country.cCode;
|
|
680
|
+
break;
|
|
681
|
+
case LocationTypes.Postcode:
|
|
682
|
+
query.countryCode = tempParams.country.cCode;
|
|
683
|
+
query.postOrZipCode = tempParams.location.name;
|
|
619
684
|
break;
|
|
620
685
|
}
|
|
621
686
|
// Add hotel name in the query
|
|
622
|
-
if (
|
|
623
|
-
query.hotelName =
|
|
687
|
+
if (tempParams.hotel_name) {
|
|
688
|
+
query.hotelName = tempParams.hotel_name;
|
|
624
689
|
}
|
|
625
690
|
// add chain or group name int he query
|
|
626
|
-
if (
|
|
627
|
-
query.groupName = (_f =
|
|
691
|
+
if (tempParams.hotel_chain) {
|
|
692
|
+
query.groupName = (_f = tempParams.hotel_chain) === null || _f === void 0 ? void 0 : _f.name;
|
|
628
693
|
}
|
|
629
694
|
this.query = query;
|
|
630
695
|
}
|
|
@@ -638,6 +703,26 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
638
703
|
currency: 'GBP'
|
|
639
704
|
};
|
|
640
705
|
}
|
|
706
|
+
resultsHaveTag(searchTag) {
|
|
707
|
+
let resultsContainTag;
|
|
708
|
+
let filteredResults = this.fullResults.filter((hotel) => {
|
|
709
|
+
let filteredTags = hotel.tags.filter((tag) => {
|
|
710
|
+
if (tag.name) {
|
|
711
|
+
let name = this.convertToOneString(tag.name).toLowerCase();
|
|
712
|
+
if (name.includes(this.convertToOneString(searchTag).toLowerCase())) {
|
|
713
|
+
return true;
|
|
714
|
+
}
|
|
715
|
+
return false;
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
let containsSearchTag = filteredTags && filteredTags.length > 0 ? true : false;
|
|
719
|
+
// console.log(`Hotel ${hotel.name} with filter applied`, hotel?.tags, isTrue);
|
|
720
|
+
return containsSearchTag;
|
|
721
|
+
});
|
|
722
|
+
resultsContainTag =
|
|
723
|
+
filteredResults && filteredResults.length > 0 ? true : false;
|
|
724
|
+
return resultsContainTag;
|
|
725
|
+
}
|
|
641
726
|
inPriceRange(hotel) {
|
|
642
727
|
const availability = this.avaliabilityService.getAvailabilityValue(hotel);
|
|
643
728
|
if (availability) {
|
|
@@ -687,24 +772,31 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
687
772
|
breakfastTypeFilter(hotel) {
|
|
688
773
|
if (!this.filters.breakfastType.length)
|
|
689
774
|
return true;
|
|
690
|
-
const hotelObject = this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotel));
|
|
775
|
+
const hotelObject = this.avaliabilityService.getAvailabilityForId(this.makeHotelAvalilityObject(hotel), hotel);
|
|
691
776
|
if (!hotelObject && !hotelObject.value)
|
|
692
777
|
return false;
|
|
693
778
|
const hotelObjectValue = hotelObject.value;
|
|
694
779
|
const isBreakfastIncluded = this.filters.breakfastType.includes(SearchHandler.BREAKFAST_INCLUDED);
|
|
695
780
|
const isBreakfastExcluded = this.filters.breakfastType.includes(SearchHandler.BREAKFAST_NOT_INCLUDED);
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
781
|
+
if (hotelObjectValue === null || hotelObjectValue === void 0 ? void 0 : hotelObjectValue.rooms) {
|
|
782
|
+
const breakfastMatches = hotelObjectValue.rooms.filter((rooms) => {
|
|
783
|
+
if (isBreakfastIncluded && isBreakfastExcluded) {
|
|
784
|
+
return rooms;
|
|
785
|
+
}
|
|
786
|
+
else if (isBreakfastIncluded) {
|
|
787
|
+
return (rooms.rateDescription.match(includedExpression) &&
|
|
788
|
+
!rooms.rateDescription.match(excludedExpression));
|
|
789
|
+
}
|
|
790
|
+
else if (isBreakfastExcluded) {
|
|
791
|
+
return (!rooms.rateDescription.match(includedExpression) ||
|
|
792
|
+
rooms.rateDescription.match(excludedExpression));
|
|
793
|
+
}
|
|
794
|
+
});
|
|
795
|
+
return !!breakfastMatches.length;
|
|
796
|
+
}
|
|
797
|
+
else {
|
|
798
|
+
return false;
|
|
799
|
+
}
|
|
708
800
|
}
|
|
709
801
|
byMostExpensive() {
|
|
710
802
|
this.sortByPrice(false);
|
|
@@ -758,22 +850,27 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
758
850
|
}
|
|
759
851
|
}
|
|
760
852
|
sortByName() {
|
|
761
|
-
this.results.next(this.
|
|
853
|
+
this.results.next(this.helpers
|
|
854
|
+
.clone(this.fullResults)
|
|
855
|
+
.sort((fst, snd) => {
|
|
762
856
|
return fst.name.toLowerCase().localeCompare(snd.name.toLowerCase());
|
|
763
857
|
}));
|
|
764
858
|
}
|
|
765
859
|
sortByDistance() {
|
|
766
|
-
|
|
767
|
-
results = results.sort((a, b) => {
|
|
860
|
+
this.results.next(this.helpers.clone(this.fullResults).sort((a, b) => {
|
|
768
861
|
return Number(a.location.distance) - Number(b.location.distance);
|
|
769
|
-
});
|
|
770
|
-
this.results.next(results);
|
|
862
|
+
}));
|
|
771
863
|
}
|
|
772
864
|
byPreferred() {
|
|
773
865
|
let results = this.results.value || [];
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
866
|
+
try {
|
|
867
|
+
results = results.sort((a, b) => {
|
|
868
|
+
return this.preferredToInt(b) - this.preferredToInt(a);
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
catch (error) {
|
|
872
|
+
console.error('+++ Error sorting by preferred: ', error, ' +++');
|
|
873
|
+
}
|
|
777
874
|
this.results.next(results);
|
|
778
875
|
}
|
|
779
876
|
preferredToInt(hotel) {
|
|
@@ -923,7 +1020,7 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
923
1020
|
calcDayDiff() {
|
|
924
1021
|
const checkout = moment(this.checkout_date);
|
|
925
1022
|
const checkin = moment(this.checkin_date);
|
|
926
|
-
return checkout.startOf().diff(checkin.startOf(), 'days');
|
|
1023
|
+
return checkout.startOf('day').diff(checkin.startOf('day'), 'days');
|
|
927
1024
|
}
|
|
928
1025
|
updateLowestPrice(results) {
|
|
929
1026
|
const currenciesKey = Object.keys(this.avaliabilityService.currencies);
|
|
@@ -960,7 +1057,12 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
960
1057
|
* @desc - return the occupancy for a room - need to calculate based on no of rooms, no of travellers and currently occupied rooms;
|
|
961
1058
|
**/
|
|
962
1059
|
calcRoomOccupancy(no_of_rooms, travellers) {
|
|
963
|
-
console.log('No of Travellers: ' +
|
|
1060
|
+
console.log('No of Travellers: ' +
|
|
1061
|
+
travellers +
|
|
1062
|
+
'| No of rooms: ' +
|
|
1063
|
+
no_of_rooms +
|
|
1064
|
+
' | Assigned: ' +
|
|
1065
|
+
this.occupied);
|
|
964
1066
|
let roomOccupancy = Math.ceil(travellers / no_of_rooms);
|
|
965
1067
|
if (travellers - this.occupied < roomOccupancy) {
|
|
966
1068
|
console.log('We have run out of occupiers!');
|
|
@@ -974,6 +1076,9 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
974
1076
|
}
|
|
975
1077
|
addHotelRoomToBasket(hotel, hotelRoom, hotelQuery, travellers) {
|
|
976
1078
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1079
|
+
console.log(hotel);
|
|
1080
|
+
console.log(hotelRoom);
|
|
1081
|
+
console.log(hotelQuery);
|
|
977
1082
|
if (hotel.unavailable) {
|
|
978
1083
|
return Promise.resolve(false);
|
|
979
1084
|
}
|
|
@@ -983,44 +1088,105 @@ export class HotelEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
983
1088
|
// create copy of hotelQuery and delete 'adults' property as searchQuerySchema for hotel (conferma) does not seem to support it being added
|
|
984
1089
|
const searchQuery = Object.assign({}, hotelQuery);
|
|
985
1090
|
delete searchQuery.adults;
|
|
1091
|
+
const detailRooms = [];
|
|
1092
|
+
detailRooms.push({
|
|
1093
|
+
rateDescription: hotelRoom.rateDescription,
|
|
1094
|
+
roomDescription: hotelRoom.roomDescription,
|
|
1095
|
+
roomId: hotelRoom.roomId,
|
|
1096
|
+
roomType: hotelRoom.roomType,
|
|
1097
|
+
rateCode: hotelRoom.rateCode,
|
|
1098
|
+
checkIn: hotelQuery.startDate,
|
|
1099
|
+
checkOut: hotelQuery.endDate
|
|
1100
|
+
});
|
|
986
1101
|
const intBasket = yield this.basketService.getDefaultBasket();
|
|
987
1102
|
const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
|
|
988
1103
|
if (basket) {
|
|
1104
|
+
// ENT-2447 add in chunks with people per room
|
|
1105
|
+
const paxPerRoom = this.tempParams.no_of_occupants;
|
|
1106
|
+
// ENT-3048 To be changed when travllers flow added
|
|
1107
|
+
const roomArray = new Array(this.tempParams.no_of_rooms).fill('TEST');
|
|
1108
|
+
const numberToSplit = this.tempParams.no_of_rooms === paxPerRoom ? 1 : 2;
|
|
1109
|
+
const bookedTravellersChunks = _.chunk(this.travellers, numberToSplit);
|
|
989
1110
|
const { address: hotelAaddress } = hotel;
|
|
990
|
-
const
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1111
|
+
const termsAndConditions = this.getTermsAndCond(hotelRoom, hotelQuery);
|
|
1112
|
+
// bookedTravellersChunks.forEach((chunk: Traveller[], index: number) => {
|
|
1113
|
+
roomArray.forEach((chunk, index) => {
|
|
1114
|
+
this.basketService.addToBasket({
|
|
1115
|
+
adults: numberToSplit,
|
|
1116
|
+
basket: basket.id,
|
|
1117
|
+
service: hotel.sourceId.toString(),
|
|
1118
|
+
detail: {
|
|
1119
|
+
hotelAddress: {
|
|
1120
|
+
streetName: hotelAaddress.addressLine1,
|
|
1121
|
+
town: hotelAaddress.addressLine2,
|
|
1122
|
+
county: hotelAaddress.addressLine3,
|
|
1123
|
+
postcode: hotelAaddress.postOrZipCode,
|
|
1124
|
+
countryCode: hotelAaddress.countryCode
|
|
1125
|
+
},
|
|
1126
|
+
hotelDescription: hotel.group,
|
|
1127
|
+
hotelId: hotel.id,
|
|
1128
|
+
hotelName: hotel.name,
|
|
1129
|
+
// this should always be 1 as we book 1 room as a time
|
|
1130
|
+
numberOfRooms: 1,
|
|
1131
|
+
rooms: detailRooms,
|
|
1132
|
+
termsAndCond: termsAndConditions
|
|
1004
1133
|
},
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1134
|
+
// no longer * no of rooms as each room is added 1 by 1
|
|
1135
|
+
price: hotelRoom.total,
|
|
1136
|
+
currency: hotelRoom.currencyCode,
|
|
1137
|
+
searchQuery,
|
|
1138
|
+
outboundDate: hotelQuery.startDate
|
|
1139
|
+
}, intBasket, this.searchService,
|
|
1140
|
+
// this is an array of 1 or 2 travellers which go in 1 room
|
|
1141
|
+
// chunk
|
|
1142
|
+
bookedTravellersChunks[index] || []);
|
|
1143
|
+
// if (index === bookedTravellersChunks.length - 1) {
|
|
1144
|
+
if (index === roomArray.length - 1) {
|
|
1145
|
+
return Promise.resolve(true);
|
|
1146
|
+
}
|
|
1147
|
+
});
|
|
1018
1148
|
}
|
|
1019
1149
|
return Promise.resolve(false);
|
|
1020
1150
|
});
|
|
1021
1151
|
}
|
|
1152
|
+
getTermsAndCond(hotelRoom, hotelQuery) {
|
|
1153
|
+
return [
|
|
1154
|
+
{
|
|
1155
|
+
name: 'Rate Information',
|
|
1156
|
+
value: hotelRoom.rateDescription
|
|
1157
|
+
},
|
|
1158
|
+
{
|
|
1159
|
+
name: 'Cancellation Policy',
|
|
1160
|
+
value: hotelRoom.policies.cancellation
|
|
1161
|
+
},
|
|
1162
|
+
{
|
|
1163
|
+
name: 'Rate Code',
|
|
1164
|
+
value: hotelRoom.rateCode
|
|
1165
|
+
},
|
|
1166
|
+
{
|
|
1167
|
+
name: 'Room Information',
|
|
1168
|
+
value: hotelRoom.roomDescription
|
|
1169
|
+
},
|
|
1170
|
+
{
|
|
1171
|
+
name: 'Deposit Amount',
|
|
1172
|
+
value: (hotelRoom.total * hotelQuery.rooms).toString() + hotelQuery.currency
|
|
1173
|
+
}
|
|
1174
|
+
];
|
|
1175
|
+
}
|
|
1176
|
+
saveSearch() {
|
|
1177
|
+
if (this.isValid.value) {
|
|
1178
|
+
const query = this.getSearchQuery();
|
|
1179
|
+
const favouriteSearchQuery = this.updateSerchQuery(query);
|
|
1180
|
+
const searchInfo = {
|
|
1181
|
+
name: `${moment()}`,
|
|
1182
|
+
serviceType: ServiceType.Hotel,
|
|
1183
|
+
searchArgs: favouriteSearchQuery
|
|
1184
|
+
};
|
|
1185
|
+
return this.searchService.saveFavouriteSearch(searchInfo);
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1022
1188
|
}
|
|
1023
1189
|
HotelEnterpriseSearch.MAX_HOTEL_ROOMS = 4;
|
|
1024
1190
|
HotelEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_hotel';
|
|
1025
1191
|
HotelEnterpriseSearch.STORAGE_SESSION_RESULTS = 'results_hotel';
|
|
1026
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsZUFBZSxFQUFRLEVBQUUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUlMLGFBQWEsRUFJYixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFHZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFLTCxhQUFhLEVBUWIsV0FBVyxFQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFpQmhDLE9BQU8sRUFNTCxZQUFZLEVBRVosU0FBUyxFQUVWLE1BQU0sd0NBQXdDLENBQUM7QUFPaEQsTUFBTSxDQUFOLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN4Qix1Q0FBcUIsQ0FBQTtJQUNyQiwrQkFBYSxDQUFBO0lBQ2IsaUNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSlcsY0FBYyxLQUFkLGNBQWMsUUFJekI7QUFFRCxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUVoQyxNQUFNLE9BQU8scUJBTVgsU0FBUSxvQkFJUDtJQTRTRCxZQUNVLFlBQXlDLEVBQ3pDLE9BQTJCLEVBQzNCLFdBQWlDLEVBQ2pDLFdBQTRCLEVB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QkFDakIsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO29CQUNsQyxNQUFNLEVBQUU7d0JBQ04sT0FBTyxFQUFFLFVBQVUsQ0FBQyxTQUFTO3dCQUM3QixRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU87d0JBQzVCLFlBQVksRUFBRTs0QkFDWixVQUFVLEVBQUUsYUFBYSxDQUFDLFlBQVk7NEJBQ3RDLElBQUksRUFBRSxhQUFhLENBQUMsWUFBWTs0QkFDaEMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxZQUFZOzRCQUNsQyxRQUFRLEVBQUUsYUFBYSxDQUFDLGFBQWE7NEJBQ3JDLFdBQVcsRUFBRSxhQUFhLENBQUMsV0FBVzt5QkFDdkM7d0JBQ0QsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEtBQUs7d0JBQzdCLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTt3QkFDckIsYUFBYSxFQUFFLFVBQVUsQ0FBQyxLQUFLO3dCQUMvQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsTUFBTTt3QkFDTixRQUFRO3FCQUNUO29CQUNELEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSztvQkFDdEIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxZQUE0QjtvQkFDaEQsV0FBVztvQkFDWCxZQUFZLEVBQUUsVUFBVSxDQUFDLFNBQVM7aUJBQ25DLEVBQ0QsU0FBUyxFQUNULElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7YUFDSDtZQUVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO0tBQUE7O0FBcndDZSxxQ0FBZSxHQUFHLENBQUMsQ0FBQztBQUNwQiw0Q0FBc0IsR0FBRyxjQUFjLENBQUM7QUFDeEMsNkNBQXVCLEdBQUcsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBCYXNlRW50ZXJwcmlzZVNlYXJjaCB9IGZyb20gJy4vYmFzZS1lbnRlcnByaXNlJztcclxuaW1wb3J0IHsgQmFzZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZUhlbHBlclJvdXRpbmVzIH0gZnJvbSAnLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tLCBvZiwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJhc2VFbnZpcm9ubWVudCB9IGZyb20gJy4vZW52aXJvbWVudCc7XHJcbmltcG9ydCB7IEJhc2VIb3RlbEF2YWxpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2hvdGVsLWF2YWxsaWJpbGl0eS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVVJMUyB9IGZyb20gJy4vLi4vc2VydmljZXMvdXJsLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIENvdW50cnksXHJcbiAgSG90ZWxRdW90ZVJlc3VsdCxcclxuICBIb3RlbFF1b3RlUmVzdWx0QXJyYXksXHJcbiAgTG9jYXRpb25UeXBlcyxcclxuICBOZ2JEYXRlU3RydWN0LFxyXG4gIExvY2F0aW9uRGV0YWlscyxcclxuICBIb3RlbEF2YWxpYmlsaXR5UXVvdGVSZXN1bHQsXHJcbiAgaW5jbHVkZWRFeHByZXNzaW9uLFxyXG4gIGV4Y2x1ZGVkRXhwcmVzc2lvbixcclxuICBTZWFyY2hIYW5kbGVyLFxyXG4gIFJlY2VudFNlYXJjaCxcclxuICBBaXJwb3J0U2VhcmNoUmVzdWx0c1xyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICBCYXNrZXRJdGVtLFxyXG4gIENvbmZlcm1hT2ZmaWNlTmFtZXMsXHJcbiAgQ29uZmVybWFPZmZpY2VJbmZvLFxyXG4gIEN1cnJlbmN5Q29kZSxcclxuICBEaXN0YW5jZVR5cGVzLFxyXG4gIEhvdGVsTG9jYXRpb24sXHJcbiAgSG90ZWxSb29tLFxyXG4gIEhvdGVsVGFnLFxyXG4gIFJhaWxTdGF0aW9uLFxyXG4gIFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyxcclxuICBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyxcclxuICBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyxcclxuICBTZXJ2aWNlVHlwZVxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VIb3RlbFF1b3RlRmV0Y2hlcixcclxuICBIb3RlbFF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9ob3RlbC1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBGdWxsVXNlckRldGFpbHMsXHJcbiAgVXNlclNlcnZpY2VJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0l1c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXNlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RIdHRwQ2FsbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9odHRwLWNhbGwuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBIb3RlbEF2YWxpbmlsaXR5RmV0Y2hlclR5cGUgfSBmcm9tICcuLi9mZXRjaGVycy9ob3RlbC1hdmFsaWFiaWxpdHktZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0llbnRlcnByaXNlLWJhc2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBBdmFpbGFiaWxpdHlPYmplY3QsXHJcbiAgRGlzcGxheUZpbHRlclNldHRpbmdzLFxyXG4gIEhvdGVsRGV0YWlscyxcclxuICBIb3RlbERldGFpbHNBcnJheSxcclxuICBIb3RlbEVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgSG90ZWxGaWx0ZXJzLFxyXG4gIEhvdGVsVGVtcFBhcmFtcyxcclxuICBIb3RlbFZpZXcsXHJcbiAgUmVzdWx0RGV0YWlsc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWhvdGVsLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgSUNoZWFwZXN0UHJpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NoZWFwZXN0LXByaWNlJztcclxuaW1wb3J0IHsgVHJhdmVsbGVyIH0gZnJvbSAnLi4vbW9kZWxzL3RyYXZlbGxlci5vYmplY3QnO1xyXG5pbXBvcnQgeyBCYXNlU2VhcmNoQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyLCBDb25mZXJtYVF1aWNrbGlzdEZldGNoZXJUeXBlIH0gZnJvbSAnLi4vZmV0Y2hlcnMvY29uZmVybWEtcXVpY2tsaXN0LmZldGNoZXInO1xyXG5pbXBvcnQgeyBCYXNlR2V0UmFpbFN0YXRpb25GZXRjaGVyLCBHZXRSYWlsU3RhdGlvbkZldGNoZXJUeXBlIH0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LXJhaWwtc3RhdGlvbi5mZXRjaGVyJztcclxuaW1wb3J0IHsgSG90ZWxSZWNlbnRTZWFyY2hBcmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ob3RlbC1yZWNlbnQtc2VhcmNoLWFyZ3MuaW50ZXJmYWNlJztcclxuXHJcbmV4cG9ydCBlbnVtIFNvcnRUeXBlc0hvdGVsIHtcclxuICBkaXN0YW5jZSA9ICdkaXN0YW5jZScsXHJcbiAgbmFtZSA9ICduYW1lJyxcclxuICBwcmljZSA9ICdwcmljZSdcclxufVxyXG5cclxuY29uc3QgQ0xJRU5UX1BSRUZFUlJFRF9WQUxVRSA9IDE7XHJcbmNvbnN0IEFHRU5UX1BSRUZFUlJFRF9WQUxVRSA9IDI7XHJcblxyXG5leHBvcnQgY2xhc3MgSG90ZWxFbnRlcnByaXNlU2VhcmNoPFxyXG4gIEhRX1EgZXh0ZW5kcyBIb3RlbFF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgSEFfUSBleHRlbmRzIEhvdGVsQXZhbGluaWxpdHlGZXRjaGVyVHlwZSxcclxuICBRTF9RIGV4dGVuZHMgQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyVHlwZSxcclxuICBHUlNfUSBleHRlbmRzIEdldFJhaWxTdGF0aW9uRmV0Y2hlclR5cGVcclxuICA+XHJcbiAgZXh0ZW5kcyBCYXNlRW50ZXJwcmlzZVNlYXJjaDxcclxuICBIb3RlbFRlbXBQYXJhbXMsXHJcbiAgSG90ZWxRdW90ZVJlc3VsdEFycmF5LFxyXG4gIEhvdGVsRGV0YWlsc0FycmF5XHJcbiAgPlxyXG4gIGltcGxlbWVudHMgSG90ZWxFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlIHtcclxuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0hPVEVMX1JPT01TID0gNDtcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyA9ICdzZWFyY2hfaG90ZWwnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUkVTVUxUUyA9ICdyZXN1bHRzX2hvdGVsJztcclxuXHJcbiAgcHVibGljIHR5cGU6IFNlcnZpY2VUeXBlID0gU2VydmljZVR5cGUuSG90ZWw7XHJcbiAgcHJpdmF0ZSB0cmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXTtcclxuICBwdWJsaWMgbG9jYXRpb25fdHlwZXM6IEJlaGF2aW9yU3ViamVjdDxMb2NhdGlvblR5cGVzW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcclxuICAgIExvY2F0aW9uVHlwZXNbXVxyXG4gID4oW10pO1xyXG4gIHB1YmxpYyBvZmZpY2VzOiBCZWhhdmlvclN1YmplY3Q8TG9jYXRpb25UeXBlc1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XHJcbiAgICBMb2NhdGlvblR5cGVzW11cclxuICA+KFtdKTtcclxuICBwdWJsaWMgbGFzdEFjdGl2ZVBhZ2U6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcclxuXHJcbiAgcmVhZG9ubHkgZ2FsbGVyaWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcclxuICBwcml2YXRlIG9jY3VwaWVkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgcmVzdWx0c19kZXRhaWxzOiBSZXN1bHREZXRhaWxzID0ge1xyXG4gICAgY2hhaW5zOiBuZXcgU2V0PHN0cmluZz4oKSxcclxuICAgIGFtZW5pdGllczogW10sXHJcbiAgICBtYXhEaXN0YW5jZTogMFxyXG4gIH07XHJcbiAgcHJpdmF0ZSBfY2hlY2tpbl9kYXRlX25nYjogTmdiRGF0ZVN0cnVjdDtcclxuICBwcml2YXRlIF9jaGVja291dF9kYXRlX25nYjogTmdiRGF0ZVN0cnVjdDtcclxuXHJcbiAgZ2V0IGNoYWlucygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWluc107XHJcbiAgfVxyXG5cclxuICBnZXQgYW1lbml0aWVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5yZXN1bHRzX2RldGFpbHMuYW1lbml0aWVzXTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhEaXN0YW5jZSgpOiBudW1iZXIge1xyXG4gICAgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4ID0gTWF0aC5jZWlsKFxyXG4gICAgICBNYXRoLm1heC5hcHBseShcclxuICAgICAgICBNYXRoLFxyXG4gICAgICAgIHRoaXMucmVzdWx0cy52YWx1ZS5tYXAoKG8pID0+IG8ubG9jYXRpb24uZGlzdGFuY2UpXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSA9IHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlLm1heDtcclxuICAgIHJldHVybiB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhQcmljZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmZpbHRlcnMucHJpY2VSYW5nZS5tYXgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGN1cnJlbmN5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeSA9IHZhbHVlO1xyXG4gIH1cclxuICAvLyBFdmVudCBFbWl0dGVyc1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2U6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHVibGljIHNlbGVjdEl0ZW1NYXBWaWV3OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwdWJsaWMgZGlzcGxheTogRGlzcGxheUZpbHRlclNldHRpbmdzID0ge1xyXG4gICAgbWlucHJpY2U6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcclxuICAgIG1heHByaWNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICBmaWx0ZXJzOiB7XHJcbiAgICAgIGJyZWFrZmFzdFR5cGU6IFtdXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy8gcHVibGljIHZhcmlhYmxlc1xyXG4gIHB1YmxpYyBtaW5fZGF0ZSA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSwgLy8gbmdiRGF0ZSBtb250aHMgYXJlIG5vdCAwIGluZGV4ZWRcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIG1pbl9yZXR1cm5fZGF0ZSA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSwgLy8gbmdiRGF0ZSBtb250aHMgYXJlIG5vdCAwIGluZGV4ZWRcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpICsgMSAvLyBtaW4gMSBuaWdodCBzdGF5XHJcbiAgfTtcclxuXHJcbiAgLy8gcHJpdmF0ZSB2YXJpYWJsZXNcclxuICAvLyBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRpbWVzIGhlcmUgLSBtYXliZSBub3JtYWxpc2UgdGhlc2UgaW4gdGhlIHJlcXVlc3QgYm9keT9cclxuXHJcbiAgcHJpdmF0ZSBsb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50VmlldzogSG90ZWxWaWV3ID0gSG90ZWxWaWV3LkxJU1Q7XHJcblxyXG4gIC8vIEZvciBOZ0ZvcmluZyBvdmVyIGluIHRoZSB0ZW1wbGF0ZXNcclxuICBwcml2YXRlIF9tYXhfbm9fb2Zfcm9vbXMgPSA0O1xyXG4gIHByaXZhdGUgX21heF9yb29tc19hcnJheSA9IG5ldyBBcnJheSh0aGlzLl9tYXhfbm9fb2Zfcm9vbXMpLmZpbGwoMCk7XHJcbiAgcHJpdmF0ZSBfbWF4X25vX29mX29jY3VwYW50cyA9IDI7XHJcbiAgcHJpdmF0ZSBfbWF4X29jY3VwYW50X2FycmF5ID0gbmV3IEFycmF5KHRoaXMuX21heF9ub19vZl9vY2N1cGFudHMpLmZpbGwoMCk7XHJcbiAgcHJpdmF0ZSBfZGlzdGFuY2VfbGlzdCA9IFsxLCAyLCA1LCAxMCwgMjAsIDI1XTsgLy8gY29waWVkIGZyb20gb2xkIGZyb250ZW5kIGZvciBub3dcclxuICBwcml2YXRlIF9kZWZhdWx0X2N1cnJlbmN5OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gIGdldCBjaGVja2luX2RhdGVfbmdiKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWNraW5fZGF0ZV9uZ2I7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hlY2tpbl9kYXRlX25nYih2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5fY2hlY2tpbl9kYXRlX25nYiA9IHZhbHVlO1xyXG5cclxuICAgIHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy5jaGVja2luX2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNrb3V0X2RhdGVfbmdiKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWNrb3V0X2RhdGVfbmdiO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNrb3V0X2RhdGVfbmdiKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9jaGVja291dF9kYXRlX25nYiA9IHZhbHVlO1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNraW5fZGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNraW5fZGF0ZShuZXdEYXRlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICBpZiAobmV3RGF0ZSAmJiBuZXdEYXRlLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlID0gbW9tZW50KG5ld0RhdGUpO1xyXG4gICAgICB0aGlzLl9jaGVja2luX2RhdGVfbmdiID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGUpO1xyXG4gICAgICBpZiAobmV3RGF0ZS5pc1NhbWVPckJlZm9yZSh0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZSkpIHtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgPSBtb21lbnQobmV3RGF0ZSkuYWRkKDEsICdkYXknKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY2hlY2tvdXRfZGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBjaGVja291dF9kYXRlKG5ld0RhdGU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIC8vIGlmIChuZXdEYXRlLmlzU2FtZU9yQmVmb3JlKHRoaXMuY2hlY2tpbl9kYXRlKSkgeyAgLy8gbm90IGFsbG93ZWRcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKG5ld0RhdGUgJiYgbmV3RGF0ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUgPSBuZXdEYXRlO1xyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGVfbmdiID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGUpO1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbm9fb2Zfcm9vbXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXM7XHJcbiAgfVxyXG5cclxuICBzZXQgbm9fb2Zfcm9vbXMobmV3Um9vbXM6IG51bWJlcikge1xyXG4gICAgaWYgKG5ld1Jvb21zID4gNCB8fCBuZXdSb29tcyA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyA9IG5ld1Jvb21zO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vX29mX29jY3VwYW50cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHM7XHJcbiAgfVxyXG5cclxuICBzZXQgbm9fb2Zfb2NjdXBhbnRzKG5ld09jYzogbnVtYmVyKSB7XHJcbiAgICBpZiAobmV3T2NjIDwgMSB8fCBuZXdPY2MgPiAzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzID0gbmV3T2NjO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRlZmF1bHRfY3VycmVuY3koKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3k7XHJcbiAgfVxyXG5cclxuICBzZXQgZGVmYXVsdF9jdXJyZW5jeShjdXJyZW5jeTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY3VycmVuY3kgPSBjdXJyZW5jeTtcclxuICB9XHJcblxyXG4gIC8vIG1heSBoYXZlIHRvIG1vZGlmeSB0aGVzZVxyXG4gIGdldCBsb2NhdGlvbigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBsb2NhdGlvbihuZXdMb2M6IGFueSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uID0gbmV3TG9jO1xyXG5cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBmb3JtYXR0ZWRfbG9jYXRpb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25cclxuICAgICAgPyB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24uZGVzdGluYXRpb25cclxuICAgICAgOiAnTm8gTG9jYXRpb24gU2V0JzsgLy8gVE9ETyAtICBleHBhbmQgdGhpcyBmb3IgZGlmZmVyZW50IHR5cGVzXHJcbiAgfVxyXG5cclxuICBnZXQgZGlzdGFuY2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuZGlzdGFuY2U7XHJcbiAgfVxyXG5cclxuICBzZXQgZGlzdGFuY2UobmV3RGlzdDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuZGlzdGFuY2UgPSBuZXdEaXN0O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByZWZlcmVkX2hvdGVsc19vbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJlZF9ob3RlbHNfb25seTtcclxuICB9XHJcblxyXG4gIHNldCBwcmVmZXJlZF9ob3RlbHNfb25seShuZXdQcmVmOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucHJlZmVyZWRfaG90ZWxzX29ubHkgPSBuZXdQcmVmO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvdW50cnkoKTogQ291bnRyeSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNvdW50cnk7XHJcbiAgfVxyXG5cclxuICBzZXQgY291bnRyeShuZXdDb250OiBDb3VudHJ5KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY291bnRyeSA9IG5ld0NvbnQ7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zdGNvZGUoKTogTG9jYXRpb25EZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucG9zdGNvZGU7XHJcbiAgfVxyXG5cclxuICBzZXQgcG9zdGNvZGUocG9zdGNvZGU6IExvY2F0aW9uRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnBvc3Rjb2RlID0gcG9zdGNvZGU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdHJhaW5zU3RhdGlvbigpOiBMb2NhdGlvbkRldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy50cmFpbnNTdGF0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHRyYWluc1N0YXRpb24oc3RhdGlvbjogTG9jYXRpb25EZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbiA9IHN0YXRpb247XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgb2ZmaWNlKCk6IENvbmZlcm1hT2ZmaWNlTmFtZXMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5vZmZpY2U7XHJcbiAgfVxyXG5cclxuICBzZXQgb2ZmaWNlKG9mZmljZTogQ29uZmVybWFPZmZpY2VOYW1lcykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm9mZmljZSA9IG9mZmljZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8vIEFkZGl0aW9uYWwgVmFyaWFibGVzXHJcbiAgZ2V0IGhvdGVsX25hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuaG90ZWxfbmFtZTtcclxuICB9XHJcblxyXG4gIHNldCBob3RlbF9uYW1lKG5ld05hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmhvdGVsX25hbWUgPSBuZXdOYW1lO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhvdGVsX2NoYWluKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmhvdGVsX2NoYWluO1xyXG4gIH1cclxuXHJcbiAgc2V0IGhvdGVsX2NoYWluKG5ld0NoYWluOiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9jaGFpbiA9IG5ld0NoYWluO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0dGVycyBPbmx5XHJcblxyXG4gIGdldCBtYXhfcm9vbXNfYXJyYXkoKTogbnVtYmVyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heF9yb29tc19hcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhfb2NjdXBhbnRfYXJyYXkoKTogbnVtYmVyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heF9vY2N1cGFudF9hcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBkaXN0YW5jZV9saXN0KCk6IG51bWJlcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXN0YW5jZV9saXN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxvY2F0aW9uX3R5cGVfc2VsZWN0KCk6IExvY2F0aW9uVHlwZXMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdDtcclxuICB9XHJcblxyXG4gIHNldCBsb2NhdGlvbl90eXBlX3NlbGVjdCh2YWx1ZTogTG9jYXRpb25UeXBlcykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVycygpOiBIb3RlbEZpbHRlcnMge1xyXG4gICAgcmV0dXJuIHRoaXMubG9jYWxGaWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGhvdGVsRmV0Y2hlcjogQmFzZUhvdGVsUXVvdGVGZXRjaGVyPEhRX1E+LFxyXG4gICAgcHJpdmF0ZSBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgZW52aXJvbm1lbnQ6IEJhc2VFbnZpcm9ubWVudCxcclxuICAgIHByaXZhdGUgYXZhbGlhYmlsaXR5U2VydmljZTogQmFzZUhvdGVsQXZhbGliaWxpdHlTZXJ2aWNlPEhBX1E+LFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRTZXJ2aWNlOiBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICAgIHN0b3JhZ2VTZXJ2aWNlOiBCYXNlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwQ2FsbFNlcnZpY2U6IEFic3RyYWN0SHR0cENhbGxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBxdWlja0xpc3RGZXRjaGVyOiBCYXNlU2VhcmNoQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyPFFMX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRSYWlsU3RhdGlvbkZldGNoZXI6IEJhc2VHZXRSYWlsU3RhdGlvbkZldGNoZXI8R1JTX1E+XHJcbiAgKSB7XHJcbiAgICBzdXBlcihzdG9yYWdlU2VydmljZSwgKHJlc3VsdHNUb01hcDogSG90ZWxRdW90ZVJlc3VsdEFycmF5KSA9PiB7XHJcbiAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLm1heERpc3RhbmNlID0gMDtcclxuICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIHJldHVybiByZXN1bHRzVG9NYXAubWFwKFxyXG4gICAgICAgIChob3RlbFJlc3VsdDogSG90ZWxRdW90ZVJlc3VsdCwgaW5kZXg6IG51bWJlcik6IEhvdGVsRGV0YWlscyA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSxcclxuICAgICAgICAgICAgaG90ZWxSZXN1bHQubG9jYXRpb24uZGlzdGFuY2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZS5tYXggPSB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZTtcclxuICAgICAgICAgIHRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWlucy5hZGQoaG90ZWxSZXN1bHQuZ3JvdXApO1xyXG4gICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5lbnZpcm9ubWVudC5udW1iZXJIb3RlbFRvUHJlbG9hZCkge1xyXG4gICAgICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5Rm9ySWQoXHJcbiAgICAgICAgICAgICAgdGhpcy5tYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWxSZXN1bHQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyB0aGlzLmdldEhvdGVsQXZhaWxhYmlsaXR5KGhvdGVsUmVzdWx0KTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNvcnRlZFRhZ3M6IHRoaXMuc29ydFRhZ3MoaG90ZWxSZXN1bHQudGFncyksXHJcbiAgICAgICAgICAgIERldGFpbHM6IHtcclxuICAgICAgICAgICAgICBkaXN0YW5jZV9haXJwb3J0OiAwLFxyXG4gICAgICAgICAgICAgIGRpc3RhbmNlX21ldHJvOiAwLFxyXG4gICAgICAgICAgICAgIGRpc3RhbmNlX3JhaWw6IDAsXHJcbiAgICAgICAgICAgICAgYWlycG9ydF9kZXRhaWxzOiB7IG5hbWU6ICdOb3QgcmV0dXJuZWQnIH0sXHJcbiAgICAgICAgICAgICAgbWV0cm9fZGV0YWlsczogeyBuYW1lOiAnTm90IHJldHVybmVkJyB9LFxyXG4gICAgICAgICAgICAgIHJhaWxfZGV0YWlsczogeyBuYW1lOiAnTm90IHJldHVybmVkJyB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC8vIGF2aWxhYmlsaXR5OiB0aGlzLmhvdGVsX2F2YWlsYWJpbGl0eSxcclxuICAgICAgICAgICAgLi4uaG90ZWxSZXN1bHRcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5jaGFpbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGNvbnN0IGRhdGE6IHtcclxuICAgICAgdGVtcFBhcmFtczogSG90ZWxUZW1wUGFyYW1zO1xyXG4gICAgfSA9IHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtKFxyXG4gICAgICBIb3RlbEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNU1xyXG4gICAgKSB8fCB7XHJcbiAgICAgICAgdGVtcFBhcmFtczoge30gYXMgSG90ZWxUZW1wUGFyYW1zXHJcbiAgICAgIH07XHJcblxyXG4gICAgdGhpcy5kZWZhdWx0X2N1cnJlbmN5ID0gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5XHJcbiAgICAgID8gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5XHJcbiAgICAgIDogdGhpcy5fZGVmYXVsdF9jdXJyZW5jeTtcclxuICAgIHRoaXMudXBkYXRlVGVtcFBhcmFtcyhzZWFyY2hTZXJ2aWNlLm1ha2VIb3RlbFF1ZXJ5KGRhdGEudGVtcFBhcmFtcykpO1xyXG5cclxuICAgIGlmIChzZWFyY2hTZXJ2aWNlLnNob3VsZEFkZFRyYXZlbGxlclN1YnNjcmlwdGlvbigpKSB7XHJcbiAgICAgIHNlYXJjaFNlcnZpY2UudHJhdmVsbGVySW5mb3JtYXRpb24uc3Vic2NyaWJlKFxyXG4gICAgICAgICh0cmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50cmF2ZWxsZXJzID0gdHJhdmVsbGVycztcclxuICAgICAgICAgIGNvbnN0IHNwbGl0VHJhdmVsbGVycyA9IHRoaXMuaGVscGVycy5zZWxlY3RlZFRyYXZlbGxlcnMoXHJcbiAgICAgICAgICAgIHRyYXZlbGxlcnMsXHJcbiAgICAgICAgICAgIFNlcnZpY2VUeXBlLkhvdGVsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50cyA9IHNwbGl0VHJhdmVsbGVycy5hZHVsdHMubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy50cmF2ZWxsZXJzID0gdHJhdmVsbGVycztcclxuICAgICAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzdWx0cyA9XHJcbiAgICAgIHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtQXNMaXN0PEhvdGVsRGV0YWlsc0FycmF5PihcclxuICAgICAgICB0aGlzLnJlc3VsdHNTZXNzaW9uTmFtZVxyXG4gICAgICApIHx8IFtdO1xyXG4gICAgcmVzdWx0c1xyXG4gICAgICAuc2xpY2UoMCwgdGhpcy5lbnZpcm9ubWVudC5udW1iZXJIb3RlbFRvUHJlbG9hZClcclxuICAgICAgLmZvckVhY2goKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5Rm9ySWQoXHJcbiAgICAgICAgICB0aGlzLm1ha2VIb3RlbEF2YWxpbGl0eU9iamVjdChob3RlbClcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKGhvdGVsUmVzdWx0OiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zLmFkZChob3RlbFJlc3VsdC5ncm91cCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZnVsbFJlc3VsdHMgPSByZXN1bHRzO1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcblxyXG4gICAgdGhpcy51c2VyU2VydmljZS5jaGFuZ2VVc2VyLnN1YnNjcmliZSgodXNlcjogUGFydGlhbDxGdWxsVXNlckRldGFpbHM+KSA9PiB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25fdHlwZXMubmV4dChbXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5BaXJwb3J0LFxyXG4gICAgICAgIExvY2F0aW9uVHlwZXMuQ2l0eSxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLk9mZmljZSxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLlNob3J0bGlzdCxcclxuICAgICAgICBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvblxyXG4gICAgICBdKTtcclxuICAgICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkRmV0Y2hBbGxPZmZpY2VzKCkpIHtcclxuICAgICAgICB0aGlzLm9mZmljZXMubmV4dChbXSk7IC8vIFRPRE8gZmV0Y2ggb2ZmaWNlc1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycyA9IG5ldyBIb3RlbEZpbHRlcnMoKTtcclxuXHJcbiAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZmV0Y2hpbmcuc3Vic2NyaWJlKChpc0ZldGNoaW5nOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIGlmICghaXNGZXRjaGluZykge1xyXG4gICAgICAgIC8vIFdlJ3ZlIGp1c3QgZmluaXNoZWQgZmV0Y2hpbmcgYXZhbGliaWxpdHkgc28gdXBkYXRlIGZpbHRlcnMuXHJcblxyXG4gICAgICAgIGNvbnN0IG1heE51bWJlciA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5tYXhQcmljZUZvckN1cnJlbmN5KCdHQlAnKTtcclxuICAgICAgICBpZiAobWF4TnVtYmVyID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UubWF4ID0gbWF4TnVtYmVyO1xyXG4gICAgICAgICAgdGhpcy5sb2NhbEZpbHRlcnMucHJpY2VSYW5nZS5tYXggPSBtYXhOdW1iZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NoZWFwZXN0UmVzdWx0UHJpY2UgPSB0aGlzLnVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPSBIb3RlbEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcbiAgcHJvdGVjdGVkIG11bHRpUmVzdWx0c1Nlc3Npb25OYW1lID0gSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG5cclxuXHJcbiAgcHJpdmF0ZSBxdWVyeTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMgPSB7fSBhcyBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcztcclxuXHJcbiAgbWFrZUxvY2F0aW9ucyhsb2NhdGlvbjogSG90ZWxMb2NhdGlvbltdKTogeyBba2V5OiBzdHJpbmddOiBIb3RlbExvY2F0aW9uW10gfSB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLmFycmF5VG9PYmplY3RBcnJheTxIb3RlbExvY2F0aW9uPihcclxuICAgICAgbG9jYXRpb24sXHJcbiAgICAgICdkaXN0YW5jZVR5cGUnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc29ydFRhZ3ModGFnczogSG90ZWxUYWdbXSk6IGFueVtdIHtcclxuICAgIGlmICh0YWdzKSB7XHJcbiAgICAgIHJldHVybiBbLi4udGFnc11cclxuICAgICAgICAuc29ydCgoYTogSG90ZWxUYWcsIGI6IEhvdGVsVGFnKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYS5uYW1lIDwgYi5uYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS5uYW1lID4gYi5uYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAubWFwKCh0YWc6IEhvdGVsVGFnKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50YWcsXHJcbiAgICAgICAgICAgIGljb246IHRoaXMuZW52aXJvbm1lbnQudGFnTWFwW3RhZy5uYW1lXSB8fCB0YWcuaWNvblxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXNldFF1ZXJ5KCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlSG90ZWxRdWVyeSgpKTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzID0gbmV3IEhvdGVsRmlsdGVycygpO1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMgPSB7XHJcbiAgICAgIGNoYWluczogbmV3IFNldDxzdHJpbmc+KCksXHJcbiAgICAgIGFtZW5pdGllczogW10sXHJcbiAgICAgIG1heERpc3RhbmNlOiAwXHJcbiAgICB9O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNWYWxpZCgpIHtcclxuICAgIGlmICghdGhpcy5kb0NoZWNrcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB0aGlzLnRlbXBQYXJhbXNcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLm1pbl9yZXR1cm5fZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZVxyXG4gICAgKTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNraW5fZGF0ZS5pc1NhbWVPckFmdGVyKHRoaXMudGVtcFBhcmFtcy5jaGVja291dF9kYXRlKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSA9IG1vbWVudCh0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlKS5hZGQoMSwgJ2RheScpOyAvLyBlbnN1cmUgdGhhdCBjaGVja291dCBkYXRlIGlzIG1pbiAxIGRheSBhZnRlciBjaGVja2luIGRhdGVcclxuICAgIH1cclxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3QpIHtcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkNpdHk6XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnkpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgY291bnRyeScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMubG9jYXRpb24gJiYgIXRoaXMucG9zdGNvZGUpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgICAgICdQbGVhc2Ugc2VsZWN0IGEgaG90ZWwgbG9jYXRpb24gb3IgZW50ZXIgYSBwb3N0Y29kZS4nXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5PZmZpY2U6XHJcbiAgICAgICAgaWYgKHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbj8udHlwZSAhPT0gJ09mZmljZScgJiYgIXRoaXMub2ZmaWNlKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGFuIG9mZmljZS4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICBpZiAodGhpcy50ZW1wUGFyYW1zPy5sb2NhdGlvbikge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24uYWlycG9ydD8uZ2F0ZXdheSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgYWlycG9ydC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2Ugc2VsZWN0IGEgYWlycG9ydC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIGlmICghdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uPy5yYWlsc3RhdGlvbj8uc3RhdGlvbkNvZGUgJiYgIXRoaXMudHJhaW5zU3RhdGlvbj8uc3RhdGlvbkNvZGUpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSB0cmFpbiBzdGF0aW9uLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q6XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnkpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgY291bnRyeScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGUuaXNTYW1lT3JCZWZvcmUodGhpcy5jaGVja2luX2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnQ2hlY2tvdXQgZGF0ZSBtdXN0IGJlIGFmdGVyIGNoZWNraW4gZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoZWNrb3V0X2RhdGUgJiYgdGhpcy5jaGVja291dF9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja291dCBkYXRlIG11c3Qgbm90IGJlIGluIHRoZSBwYXN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hlY2tpbl9kYXRlICYmIHRoaXMuY2hlY2tpbl9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja2luIGRhdGUgbXVzdCBub3QgYmUgaW4gdGhlIHBhc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZS5pc0FmdGVyKHRoaXMuY2hlY2tvdXRfZGF0ZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdDaGVja291dCBkYXRhIG11c3QgYmUgYWZ0ZXIgdGhlIGNoZWNraW4gZGF0ZSdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjdWxhdGluZyBPY2N1cGFuY3lcclxuICAgIGNvbnN0IG9jY3VwYW5jeSA9IHRoaXMubm9fb2Zfb2NjdXBhbnRzIC8gdGhpcy5ub19vZl9yb29tcztcclxuXHJcbiAgICBpZiAoIShvY2N1cGFuY3kgPT09IDEgfHwgb2NjdXBhbmN5ID09PSAyKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdPY2N1cGFudHMgcGVyIHJvb20gbXVzdCBiZSAxIG9yIDIsIGlmIHlvdSBoYXZlIGFuIG9kZCBudW1iZXIgb2YgdHJhdmVsbGVycyAoZ3JlYXRlciB0aGFuIG9uZSksIHRoZSBubyBvZiByb29tcyBtdXN0IGJlIGVxdWFsJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICAgIHRoaXMuaXNWYWxpZC5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB0aGlzLm1lc3NhZ2VzLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2goKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChbXSk7XHJcbiAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UucmVzZXQoKTtcclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgLy8gYnVpbGQgdGhlIHF1ZXJ5XHJcbiAgICAgIHRoaXMuYnVpbGRRdWVyeSgpO1xyXG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0U2VhcmNoUXVlcnkoKTtcclxuICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNhdmVSZWNlbnRTZWFyY2godGhpcy5nZXRSZWNlbnRTZWFyY2hRdWVyeSh0aGlzLmdldFNlYXJjaFF1ZXJ5KCkpKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0U2VhcmNoKFxyXG4gICAgICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9PT0gTG9jYXRpb25UeXBlcy5TaG9ydGxpc3QgP1xyXG4gICAgICAgIHRoaXMucXVpY2tMaXN0RmV0Y2hlci5mZXRjaExpc3Qoe2NvdW50cnlDb2RlOiB0aGlzLmNvdW50cnkuY0NvZGV9KSA6XHJcbiAgICAgICAgdGhpcy5ob3RlbEZldGNoZXIuZmV0Y2hMaXN0KFxyXG4gICAgICAgICAgcXVlcnlcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyk6IFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyB7XHJcbiAgICBjb25zdCByZWNlbnRTZWFyY2hRdWVyeTogSG90ZWxSZWNlbnRTZWFyY2hBcmdzID0gcXVlcnk7XHJcbiAgICByZWNlbnRTZWFyY2hRdWVyeS5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3Q7XHJcbiAgICBpZiAodGhpcy5sb2NhdGlvbj8ubmFtZSkge1xyXG4gICAgICByZWNlbnRTZWFyY2hRdWVyeS5jaXR5TmFtZSA9IHRoaXMubG9jYXRpb24ubmFtZTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNlcnZpY2VUeXBlOiBTZXJ2aWNlVHlwZS5Ib3RlbCxcclxuICAgICAgc2VhcmNoQXJnczogcmVjZW50U2VhcmNoUXVlcnksXHJcbiAgICAgIHRyYXZlbERhdGU6IHRoaXMuY2hlY2tpbl9kYXRlLmZvcm1hdCgpLFxyXG4gICAgICB0cmF2ZWxsZXJzOiB0aGlzLmhlbHBlcnMuZ2V0VHJhdmVsbGVyc0lkKHRoaXMudHJhdmVsbGVycylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRSZWNlbnRTZWFyY2gocmVjZW50U2VhcmNoOiBSZWNlbnRTZWFyY2gpOiB2b2lkIHtcclxuICAgIHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sb2NhdGlvbl90eXBlX3NlbGVjdDtcclxuICAgIHRoaXMuY3VycmVuY3kgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5jdXJyZW5jeTtcclxuICAgIHRoaXMuZGlzdGFuY2UgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5kaXN0YW5jZTtcclxuICAgIHRoaXMubm9fb2Zfcm9vbXMgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yb29tcztcclxuICAgIHRoaXMuY2hlY2tpbl9kYXRlID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnN0YXJ0RGF0ZSk7XHJcbiAgICB0aGlzLmNoZWNrb3V0X2RhdGUgPSBtb21lbnQocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZW5kRGF0ZSk7XHJcbiAgICB0aGlzLmhvdGVsX25hbWUgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5ob3RlbE5hbWU7XHJcblxyXG4gICAgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmdyb3VwTmFtZSkge1xyXG4gICAgICB0aGlzLmhvdGVsX2NoYWluID0ge1xyXG4gICAgICAgIG5hbWU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmdyb3VwTmFtZVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IGxvY2F0aW9uX3R5cGVfc2VsZWN0XHJcbiAgICBzd2l0Y2ggKHRoaXMubG9jYXRpb25fdHlwZV9zZWxlY3QpIHtcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ6XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLmdldEFpcnBvcnRCeUNvZGUocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuaWF0YSkuc3Vic2NyaWJlKChpYXRhOiBBaXJwb3J0U2VhcmNoUmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgbGV0IGFpcnBvcnQgPSB7XHJcbiAgICAgICAgICAgIGFpcnBvcnQ6IHtcclxuICAgICAgICAgICAgICBnYXRld2F5OiBpYXRhLmlhdGFNYXRjaC5pYXRhXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9jYXRpb24gPSB7IC4uLmFpcnBvcnQsIC4uLmlhdGEuaWF0YU1hdGNoIH07XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5DaXR5OlxyXG4gICAgICAgIHRoaXMuY291bnRyeSA9IHtcclxuICAgICAgICAgIGNDb2RlOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5jb3VudHJ5Q29kZSxcclxuICAgICAgICAgIGNOYW1lOiAnJyBcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2hvdWxkIGJlIG9uZSBzZWFyY2ggbWV0b2QgZm9yIHRoZSBjaXR5IHNlYXJjaDogbG9jYXRpb24gb3IgcG9zdGNvZGVcclxuICAgICAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubGF0aXR1ZGUgJiYgcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9uZ2l0dWRlKSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uID0ge1xyXG4gICAgICAgICAgICBuYW1lOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5jaXR5TmFtZSxcclxuICAgICAgICAgICAgbGF0aXR1ZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxhdGl0dWRlLFxyXG4gICAgICAgICAgICBsb25naXR1ZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxvbmdpdHVkZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucG9zdE9yWmlwQ29kZSkge1xyXG4gICAgICAgICAgdGhpcy5wb3N0Y29kZSA9IHtcclxuICAgICAgICAgICAgbmFtZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucG9zdE9yWmlwQ29kZSxcclxuICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5Qb3N0Y29kZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuT2ZmaWNlOlxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5nZXRPZmZpY2UocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub2ZmaWNlSWQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChvZmZpY2U6IENvbmZlcm1hT2ZmaWNlSW5mbykgPT4geyBcclxuICAgICAgICAgIHRoaXMub2ZmaWNlID0ge1xyXG4gICAgICAgICAgICBpZDogb2ZmaWNlLmlkLFxyXG4gICAgICAgICAgICBuYW1lOiBvZmZpY2UubmFtZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbjpcclxuICAgICAgICB0aGlzLmdldFJhaWxTdGF0aW9uQnlDb2RlKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRyYWluU3RhdGlvbkNvZGUpLnN1YnNjcmliZSgodHJhaW5zU3RhdGlvbjogUmFpbFN0YXRpb24pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhaW5zU3RhdGlvbiA9IHRyYWluc1N0YXRpb24gYXMgTG9jYXRpb25EZXRhaWxzXHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuU2hvcnRsaXN0OlxyXG4gICAgICAgIHRoaXMuY291bnRyeSA9IHtcclxuICAgICAgICAgIGNDb2RlOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5jb3VudHJ5Q29kZSxcclxuICAgICAgICAgIGNOYW1lOiAnJyBcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UmFpbFN0YXRpb25CeUNvZGUoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxSYWlsU3RhdGlvbj4ge1xyXG4gICAgaWYgKGNvZGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UmFpbFN0YXRpb25GZXRjaGVyLmZldGNoTGlzdCh7IGlkOiBudWxsLCBjb2RlOiBjb2RlIH0pLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hRdWVyeSgpOiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyB7XHJcbiAgICB0aGlzLmJ1aWxkUXVlcnkoKTtcclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHM8U2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXM+KHRoaXMucXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgYnVpbGRRdWVyeSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyA9IHtcclxuICAgICAgc3RhcnREYXRlOiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxyXG4gICAgICBlbmREYXRlOiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgcm9vbXM6IHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyxcclxuICAgICAgYWR1bHRzOiB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfb2NjdXBhbnRzLFxyXG4gICAgICBjdXJyZW5jeTogdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5ID8gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5IDogbnVsbCxcclxuICAgICAgZGlzdGFuY2U6IHRoaXMudGVtcFBhcmFtcy5kaXN0YW5jZSxcclxuICAgICAgZGlzdGFuY2VUeXBlOiBEaXN0YW5jZVR5cGVzLk0sXHJcbiAgICAgIG1heFJlc3VsdHM6IDEwMFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdldFJvb21OdW1iZXIoKTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMubG9jYXRpb24pXHJcbiAgICBzd2l0Y2ggKHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICBxdWVyeS5pYXRhID0gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uLmFpcnBvcnQuZ2F0ZXdheTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5DaXR5OlxyXG4gICAgICAgIHF1ZXJ5LmNvdW50cnlDb2RlID0gdGhpcy5jb3VudHJ5LmNDb2RlO1xyXG4gICAgICAgIC8vIHNob3VsZCBiZSBvbmUgc2VhcmNoIG1ldG9kIGZvciB0aGUgY2l0eSBzZWFyY2g6IGxvY2F0aW9uIG9yIHBvc3Rjb2RlXHJcbiAgICAgICAgaWYgKHRoaXMubG9jYXRpb24pIHtcclxuICAgICAgICAgIHF1ZXJ5LmxhdGl0dWRlID0gdGhpcy5sb2NhdGlvbi5sYXRpdHVkZTtcclxuICAgICAgICAgIHF1ZXJ5LmxvbmdpdHVkZSA9IHRoaXMubG9jYXRpb24ubG9uZ2l0dWRlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3N0Y29kZSkge1xyXG4gICAgICAgICAgcXVlcnkucG9zdE9yWmlwQ29kZSA9IHRoaXMucG9zdGNvZGUubmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb246XHJcbiAgICAgICAgaWYgKHRoaXMubG9jYXRpb24/LnJhaWxzdGF0aW9uPy5zdGF0aW9uQ29kZSkge1xyXG4gICAgICAgICAgcXVlcnkudHJhaW5TdGF0aW9uQ29kZSA9IHRoaXMubG9jYXRpb24ucmFpbHN0YXRpb24uc3RhdGlvbkNvZGU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyYWluc1N0YXRpb24/LnN0YXRpb25Db2RlKSB7XHJcbiAgICAgICAgICBxdWVyeS50cmFpblN0YXRpb25Db2RlID0gdGhpcy50cmFpbnNTdGF0aW9uLnN0YXRpb25Db2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5PZmZpY2U6IC8vIE5lZWRzIHRvIGZpeCBpbiBuZXh0IFBSXHJcbiAgICAgICAgaWYgKHRoaXMubG9jYXRpb24/LmlkKSB7XHJcbiAgICAgICAgICBxdWVyeS5vZmZpY2VJZCA9ICt0aGlzLmxvY2F0aW9uLmlkO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vZmZpY2U/LmlkKSB7XHJcbiAgICAgICAgICBxdWVyeS5vZmZpY2VJZCA9ICt0aGlzLm9mZmljZS5pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuU2hvcnRsaXN0OiBcclxuICAgICAgICBxdWVyeS5jb3VudHJ5Q29kZSA9IHRoaXMuY291bnRyeS5jQ29kZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIGhvdGVsIG5hbWUgaW4gdGhlIHF1ZXJ5XHJcbiAgICBpZiAodGhpcy5ob3RlbF9uYW1lKSB7XHJcbiAgICAgIHF1ZXJ5LmhvdGVsTmFtZSA9IHRoaXMudGVtcFBhcmFtcy5ob3RlbF9uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFkZCBjaGFpbiBvciBncm91cCBuYW1lIGludCBoZSBxdWVyeVxyXG4gICAgaWYgKHRoaXMuaG90ZWxfY2hhaW4pIHtcclxuICAgICAgcXVlcnkuZ3JvdXBOYW1lID0gdGhpcy50ZW1wUGFyYW1zLmhvdGVsX2NoYWluPy5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcclxuICB9XHJcblxyXG4gIG1ha2VIb3RlbEF2YWxpbGl0eU9iamVjdChob3RlbDogSG90ZWxRdW90ZVJlc3VsdCk6IEF2YWlsYWJpbGl0eU9iamVjdCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBob3RlbDogaG90ZWwuaWQsXHJcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGUodGhpcy5jaGVja2luX2RhdGUpLFxyXG4gICAgICBlbmREYXRlOiB0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZSh0aGlzLmNoZWNrb3V0X2RhdGUpLFxyXG4gICAgICByb29tczogdGhpcy5ub19vZl9yb29tcyxcclxuICAgICAgb2NjdXBhbnRzOiB0aGlzLm5vX29mX29jY3VwYW50cyxcclxuICAgICAgY3VycmVuY3k6ICdHQlAnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRlclJlc3VsdHMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChcclxuICAgICAgdGhpcy5mdWxsUmVzdWx0cy5maWx0ZXIoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgdGhpcy5pblByaWNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmluRGlzdGFuY2VSYW5nZShob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuY29udGFpbnNIb3RlbG5hbWUoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmhhc0NoYWluKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5icmVha2Zhc3RUeXBlRmlsdGVyKGhvdGVsKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8vIExpZ2h0ZW5pbmcgRmlsdGVyc1xyXG4gIHB1YmxpYyBmaWx0ZXJMaWdodGVuaW5nUmVzdWx0cyA9ICgpID0+IHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFxyXG4gICAgICB0aGlzLmZ1bGxSZXN1bHRzLmZpbHRlcigoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICB0aGlzLmluTGlnaHRlbmluZ1ByaWNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5zSG90ZWxuYW1lKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5oYXNDaGFpbihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuaGFzUHJlZmVycmVkKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5icmVha2Zhc3RUeXBlRmlsdGVyKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5nZXRFeHRyYUZpbHRlcihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuZ2V0QW1lbml0aWVzRmlsdGVyKGhvdGVsKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgaW5QcmljZVJhbmdlKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShob3RlbCk7XHJcbiAgICBpZiAoYXZhaWxhYmlsaXR5KSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmluUmFuZ2UoYXZhaWxhYmlsaXR5Lm1heHByaWNlLCB0aGlzLmZpbHRlcnMucHJpY2VSYW5nZSkgJiZcclxuICAgICAgICB0aGlzLmhlbHBlcnMuaW5SYW5nZShhdmFpbGFiaWxpdHkubWlucHJpY2UsIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5EaXN0YW5jZVJhbmdlKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlLm1heCA9PT0gMCB8fFxyXG4gICAgICB0aGlzLmhlbHBlcnMuaW5SYW5nZShob3RlbC5sb2NhdGlvbi5kaXN0YW5jZSwgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb250YWluc0hvdGVsbmFtZShob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0b2NoZWNrID0gdGhpcy5maWx0ZXJzLmhvdGVsTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIHJldHVybiB0b2NoZWNrICYmIHRvY2hlY2subGVuZ3RoID4gMFxyXG4gICAgICA/IGhvdGVsLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0b2NoZWNrKVxyXG4gICAgICA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluTGlnaHRlbmluZ1ByaWNlUmFuZ2UoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYXZhaWxhYmlsaXR5ID0gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eVZhbHVlKGhvdGVsKTtcclxuICAgIGlmIChhdmFpbGFiaWxpdHkgJiYgT2JqZWN0LmtleXMoYXZhaWxhYmlsaXR5KS5sZW5ndGggIT09IDApIHtcclxuICAgICAgbGV0IG1heFJhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBmaW5kTWF4OiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgbWluUmFuZ2UgPSB0aGlzLmhlbHBlcnMuaW5SYW5nZShcclxuICAgICAgICBhdmFpbGFiaWxpdHkucHJwbixcclxuICAgICAgICB0aGlzLmZpbHRlcnMucHJpY2VSYW5nZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYXZhaWxhYmlsaXR5Py5tYXhwcmljZSkge1xyXG4gICAgICAgIGZpbmRNYXggPSBhdmFpbGFiaWxpdHkubWF4cHJpY2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZmluZE1heCA9IGF2YWlsYWJpbGl0eT8ucm9vbXMucmVkdWNlKFxyXG4gICAgICAgICAgKG9wLCBpdGVtKSA9PiAob3AgPSBvcCA+IGl0ZW0udG90YWwgPyBvcCA6IGl0ZW0udG90YWwpLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgbWF4UmFuZ2UgPSB0aGlzLmhlbHBlcnMuaW5SYW5nZShmaW5kTWF4LCB0aGlzLmZpbHRlcnMucHJpY2VSYW5nZSk7XHJcbiAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBtaW5SYW5nZSAmJiBtYXhSYW5nZTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNDaGFpbihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0b2NoZWNrID0gKHRoaXMuZmlsdGVycy5jaGFpbiB8fCBbXSkubWFwKChjaGFpbjogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgICAgcmV0dXJuIGNoYWluLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0b2NoZWNrICYmIHRvY2hlY2subGVuZ3RoXHJcbiAgICAgID8gISF0b2NoZWNrLmZpbmQoKGNoYWluOiBzdHJpbmcpID0+IHtcclxuICAgICAgICByZXR1cm4gaG90ZWwuZ3JvdXAudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhjaGFpbik7XHJcbiAgICAgIH0pXHJcbiAgICAgIDogdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBpZighdGhpcy5maWx0ZXJzLmJyZWFrZmFzdFR5cGUubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcclxuICAgIGNvbnN0IGhvdGVsT2JqZWN0ID0gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eUZvcklkKHRoaXMubWFrZUhvdGVsQXZhbGlsaXR5T2JqZWN0KGhvdGVsKSk7XHJcbiAgICBpZighaG90ZWxPYmplY3QgJiYgIWhvdGVsT2JqZWN0LnZhbHVlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBob3RlbE9iamVjdFZhbHVlOiBIb3RlbEF2YWxpYmlsaXR5UXVvdGVSZXN1bHQgPSBob3RlbE9iamVjdC52YWx1ZTtcclxuICAgIGNvbnN0IGlzQnJlYWtmYXN0SW5jbHVkZWQgPSB0aGlzLmZpbHRlcnMuYnJlYWtmYXN0VHlwZS5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkJSRUFLRkFTVF9JTkNMVURFRCk7XHJcbiAgICBjb25zdCBpc0JyZWFrZmFzdEV4Y2x1ZGVkID0gdGhpcy5maWx0ZXJzLmJyZWFrZmFzdFR5cGUuaW5jbHVkZXMoU2VhcmNoSGFuZGxlci5CUkVBS0ZBU1RfTk9UX0lOQ0xVREVEKTtcclxuXHJcbiAgICBjb25zdCBicmVha2Zhc3RNYXRjaGVzID0gaG90ZWxPYmplY3RWYWx1ZS5yb29tcy5maWx0ZXIoKHJvb21zOiBhbnkpID0+IHtcclxuICAgICAgICBpZihpc0JyZWFrZmFzdEluY2x1ZGVkICYmIGlzQnJlYWtmYXN0RXhjbHVkZWQpe1xyXG4gICAgICAgICAgcmV0dXJuIHJvb21zO1xyXG4gICAgICAgIH0gZWxzZSBpZihpc0JyZWFrZmFzdEluY2x1ZGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGluY2x1ZGVkRXhwcmVzc2lvbikgJiYgIXJvb21zLnJhdGVEZXNjcmlwdGlvbi5tYXRjaChleGNsdWRlZEV4cHJlc3Npb24pO1xyXG4gICAgICAgIH0gZWxzZSBpZihpc0JyZWFrZmFzdEV4Y2x1ZGVkKXtcclxuICAgICAgICAgIHJldHVybiAhcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGluY2x1ZGVkRXhwcmVzc2lvbikgfHwgcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGV4Y2x1ZGVkRXhwcmVzc2lvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgcmV0dXJuICEhYnJlYWtmYXN0TWF0Y2hlcy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBieU1vc3RFeHBlbnNpdmUoKSB7XHJcbiAgICB0aGlzLnNvcnRCeVByaWNlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbWluXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBkZWJ1ZyBzZXQgdGhpcyB0byB0cnVlIHRvIG91dHB1dCBjb25zb2xlIGxvZ3NcclxuICAgKiBAZGVzY3JpcHRpb24gc29ydHMgcmVzdWx0cyBieSBwcmljZSBhY2NvcmRpbmcgdG8gdGhlICdtaW4nIHBhcmFtYXRlci4gbWluID0gdHJ1ZSAobG93ZXN0IHByaWNlIGZpcnN0KSwgbWluID0gZmFsc2UgKGhpZ2hlc3QgcHJpY2UgZmlyc3QpXHJcbiAgICogSW4gc3VtbWFyeSwgdGhpcyBtZXRob2QgY3JlYXRlcyBhIHNvcnRlZCBhcnJheSBvZiBob3RlbHMgd2l0aCBwcmljZXMgYW5kIGFuIGFycmF5IG9mIGhvdGVscyBXSVRIT1VUIHByaWNlcyxcclxuICAgKiB0aGVuIGZpbmFsbHkgam9pbnMgdGhlc2UgMiB0ZW1wb3JhcnkgYXJyYXlzIHRvZ2V0aGVyIGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBuZXh0IG9ic2VydmFibGUuXHJcbiAgICovXHJcblxyXG4gIHNvcnRCeVByaWNlKG1pbiA9IHRydWUsIGRlYnVnID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIC8vIHN0b3JlIGFsbCByZXN1bHRzXHJcbiAgICBjb25zdCBob3RlbHM6IEhvdGVsRGV0YWlsc0FycmF5ID0gdGhpcy5mdWxsUmVzdWx0cztcclxuXHJcbiAgICAvLyBnZXQgaG90ZWxzIHdpdGggYW5kIHdpdGhvdXQgcHJpY2VzXHJcbiAgICBjb25zdCBob3RlbHNXaXRoUHJpY2VzOiBIb3RlbERldGFpbHNBcnJheSA9IFtdO1xyXG4gICAgY29uc3QgaG90ZWxzV2l0aG91dFByaWNlczogSG90ZWxEZXRhaWxzQXJyYXkgPSBbXTtcclxuICAgIGhvdGVscy5tYXAoKGhvdGVsUmVzdWx0KSA9PiB7XHJcbiAgICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShob3RlbFJlc3VsdCk/LnBycG5cclxuICAgICAgICA/IGhvdGVsc1dpdGhQcmljZXMucHVzaChob3RlbFJlc3VsdClcclxuICAgICAgICA6IGhvdGVsc1dpdGhvdXRQcmljZXMucHVzaChob3RlbFJlc3VsdCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzb3J0IGhvdGVscyB3aXRoIHByaWNlcyBhY2NvcmRpbmcgdG8gdGhlICdtaW4nIHBhcmFtZXRlciBmb3IgdGhlIG9yZGVyXHJcbiAgICBob3RlbHNXaXRoUHJpY2VzLnNvcnQoKGZpcnN0OiBIb3RlbERldGFpbHMsIHNlY29uZDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpcnN0UHJpY2UgPVxyXG4gICAgICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShmaXJzdCk/LnBycG47XHJcbiAgICAgIGNvbnN0IHNlY29uZFByaWNlID1cclxuICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoc2Vjb25kKT8ucHJwbjtcclxuICAgICAgcmV0dXJuIG1pblxyXG4gICAgICAgID8gZmlyc3RQcmljZSA+IHNlY29uZFByaWNlXHJcbiAgICAgICAgICA/IDFcclxuICAgICAgICAgIDogc2Vjb25kUHJpY2UgPiBmaXJzdFByaWNlXHJcbiAgICAgICAgICAgID8gLTFcclxuICAgICAgICAgICAgOiAwXHJcbiAgICAgICAgOiBmaXJzdFByaWNlIDwgc2Vjb25kUHJpY2VcclxuICAgICAgICAgID8gMVxyXG4gICAgICAgICAgOiBzZWNvbmRQcmljZSA8IGZpcnN0UHJpY2VcclxuICAgICAgICAgICAgPyAtMVxyXG4gICAgICAgICAgICA6IDA7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBqb2luIGhvdGVscyB3aXRoIHByaWNlcyB0byBob3RlbHMgV0lUSE9VVCBwcmljZXNcclxuICAgIGNvbnN0IHNvcnRlZEhvdGVscyA9IFsuLi5ob3RlbHNXaXRoUHJpY2VzLCAuLi5ob3RlbHNXaXRob3V0UHJpY2VzXTtcclxuXHJcbiAgICAvLyB0cmlnZ2VyIG5leHQgb2JzZXJ2YWJsZVxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoc29ydGVkSG90ZWxzKTtcclxuXHJcbiAgICAvLyBkaXNwbGF5IGNvbnNvbGUgbG9ncyBpZiBkZWJ1ZyBpcyB0cnVlIChjb3VsZCBwcm92ZSB1c2VmdWwgaW4gZnV0dXJlKVxyXG4gICAgaWYgKGRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBzb3J0QnlQcmljZSgpIGNhbGxlZCArKycpO1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgaG90ZWwgKysnLCBob3RlbHMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgaG90ZWxzV2l0aFByaWNlcyArKycsIGhvdGVsc1dpdGhQcmljZXMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgaG90ZWxzV2l0aG91dFByaWNlcyArKycsIGhvdGVsc1dpdGhvdXRQcmljZXMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnKysgc29ydGVkSG90ZWxzICsrJywgc29ydGVkSG90ZWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNvcnRCeU5hbWUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChcclxuICAgICAgdGhpcy5yZXN1bHRzLnZhbHVlLnNvcnQoXHJcbiAgICAgICAgKGZzdDogSG90ZWxEZXRhaWxzLCBzbmQ6IEhvdGVsRGV0YWlscyk6IG51bWJlciA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZnN0Lm5hbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKHNuZC5uYW1lLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNvcnRCeURpc3RhbmNlKCk6IHZvaWQge1xyXG4gICAgbGV0IHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMudmFsdWUgfHwgW107XHJcbiAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIoYS5sb2NhdGlvbi5kaXN0YW5jZSkgLSBOdW1iZXIoYi5sb2NhdGlvbi5kaXN0YW5jZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgYnlQcmVmZXJyZWQoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IHRoaXMucmVzdWx0cy52YWx1ZSB8fCBbXTtcclxuICAgIHJlc3VsdHMgPSByZXN1bHRzLnNvcnQoKGE6IEhvdGVsRGV0YWlscywgYjogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnByZWZlcnJlZFRvSW50KGIpIC0gdGhpcy5wcmVmZXJyZWRUb0ludChhKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZWZlcnJlZFRvSW50KGhvdGVsOiBIb3RlbERldGFpbHMpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgKGhvdGVsLnByZWZlcnJlZC5jbGllbnQgPyBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFIDogMCkgK1xyXG4gICAgICAoaG90ZWwucHJlZmVycmVkLmNvbnN1bWVyID8gQUdFTlRfUFJFRkVSUkVEX1ZBTFVFIDogMClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludFRvUHJlZmVycmVkKHByZWZlcnJlZDogMCB8IDEgfCAyIHwgMykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXHJcbiAgICAgIGNsaWVudDogKHByZWZlcnJlZCAmIENMSUVOVF9QUkVGRVJSRURfVkFMVUUpID09PSBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFLFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWJpdHdpc2VcclxuICAgICAgY29uc3VtZXI6IChwcmVmZXJyZWQgJiBBR0VOVF9QUkVGRVJSRURfVkFMVUUpID09PSBBR0VOVF9QUkVGRVJSRURfVkFMVUVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhZGRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcsIHR5cGU6IGtleW9mIEhvdGVsRmlsdGVycyk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsdDogYW55ID0gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgICBmaWx0W3R5cGVdLnB1c2goZmlsdGVyKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZpbHRlcihmaWx0ZXI6IHN0cmluZywgdHlwZToga2V5b2YgSG90ZWxGaWx0ZXJzKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWx0ID0gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0W3R5cGVdKSkge1xyXG4gICAgICAoZmlsdFt0eXBlXSBhcyBzdHJpbmdbXSkgPSAoZmlsdFt0eXBlXSBhcyBzdHJpbmdbXSkuZmlsdGVyKFxyXG4gICAgICAgIChjaGFpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZmlsdGVyICE9PSBjaGFpbjtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5jaGFpbiA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuYW1lbml0eXR5cGUgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLnByZWZlcnJlZCA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuZXh0cmEgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmhvdGVsTmFtZSA9ICcnO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuYnJlYWtmYXN0VHlwZSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRnJvbVByZXZpb3VzU2VhcmNoZXMoXHJcbiAgICBwcmV2aW91c0l0ZW1zOiBSZWNvcmQ8U2VydmljZVR5cGUsIEJhc2tldEl0ZW0+XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBmbGlnaHRJdGVtOiBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyA9XHJcbiAgICAgIHByZXZpb3VzSXRlbXNbU2VydmljZVR5cGUuRmxpZ2h0XT8uc2VhcmNoUXVlcnk7XHJcbiAgICBpZiAoZmxpZ2h0SXRlbSkge1xyXG4gICAgICAvLyBUT0RPIGZsaWdodHMgaGF2ZW4ndCBiZWVuIGRvbmUgeWV0LlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNQcmVmZXJyZWQoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcHJlZmVycmVkRmlsdGVycyA9IHRoaXMuZmlsdGVycy5wcmVmZXJyZWQ7XHJcblxyXG4gICAgLy8gRW1wdHkgcHJlZmVycmVkIGZpbHRlcnMgT1IgXCJBbnlcIlxyXG4gICAgaWYgKFxyXG4gICAgICAhcHJlZmVycmVkRmlsdGVycy5sZW5ndGggfHxcclxuICAgICAgcHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkFOWSlcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZ2VuY3kgKGNvbnN1bWVyKSAmJiBDbGllbnRcclxuICAgIGlmIChcclxuICAgICAgcHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkFHRU5DWSkgJiZcclxuICAgICAgcHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkNMSUVOVClcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGhvdGVsLnByZWZlcnJlZC5jb25zdW1lciA9PT0gdHJ1ZSAmJiBob3RlbC5wcmVmZXJyZWQuY2xpZW50ID09PSB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWdlbmN5XHJcbiAgICBpZiAocHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkFHRU5DWSkpIHtcclxuICAgICAgcmV0dXJuIGhvdGVsLnByZWZlcnJlZC5jb25zdW1lciA9PT0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDbGllbnRcclxuICAgIGlmIChwcmVmZXJyZWRGaWx0ZXJzLmluY2x1ZGVzKFNlYXJjaEhhbmRsZXIuQ0xJRU5UKSkge1xyXG4gICAgICByZXR1cm4gaG90ZWwucHJlZmVycmVkLmNsaWVudCA9PT0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRtYXhQcmljZUZvckN1cnJlbmN5KGN1cnJlbmN5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5tYXhQcmljZUZvckN1cnJlbmN5KGN1cnJlbmN5KTtcclxuICB9XHJcblxyXG4gIC8vIExpZ2h0ZW5pbmcgRXh0cmEgRmlsdGVyc1xyXG4gIHByaXZhdGUgZ2V0RXh0cmFGaWx0ZXIoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY2hlY2tBdmFpbGFiaWxpdHkgPSB0aGlzLmZpbHRlcnMuZXh0cmEuaW5jbHVkZXMoXHJcbiAgICAgIFNlYXJjaEhhbmRsZXIuQVZBSUxBQklMSVRZXHJcbiAgICApO1xyXG4gICAgaWYgKGNoZWNrQXZhaWxhYmlsaXR5KSB7XHJcbiAgICAgIHJldHVybiBob3RlbC51bmF2YWlsYWJsZSA9PT0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjaGVja0ZlbWFsZUZyaWVuZGx5ID0gdGhpcy5maWx0ZXJzLmV4dHJhLmluY2x1ZGVzKFxyXG4gICAgICBTZWFyY2hIYW5kbGVyLkZFTUFMRV9GUklFTkRMWVxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja0ZlbWFsZUZyaWVuZGx5KSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgaG90ZWwudGFncy5maWx0ZXIoKHRhZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHRhZy5uYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnZlcnRUb09uZVN0cmluZyh0YWcubmFtZSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5hbWUuaW5jbHVkZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcoXHJcbiAgICAgICAgICAgICAgICBTZWFyY2hIYW5kbGVyLkZFTUFMRV9GUklFTkRMWVxyXG4gICAgICAgICAgICAgICkudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkubGVuZ3RoID4gMFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyBMaWdodGVuaW5nIEFtZXJuaXRpZXMgRmlsdGVyc1xyXG4gIHByaXZhdGUgZ2V0QW1lbml0aWVzRmlsdGVyKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RydWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdGhpcy5maWx0ZXJzLmFtZW5pdHl0eXBlLmZvckVhY2goKHNlYXJjaCkgPT4ge1xyXG4gICAgICBsZXQgZmlsdGVyZWRSZXN1bHRzOiBhbnkgPSBob3RlbC50YWdzLmZpbHRlcigodGFnKSA9PiB7XHJcbiAgICAgICAgaWYgKHRhZy5uYW1lKSB7XHJcbiAgICAgICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcodGFnLm5hbWUpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyh0aGlzLmNvbnZlcnRUb09uZVN0cmluZyhzZWFyY2gpLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlzVHJ1ZSA9IGZpbHRlcmVkUmVzdWx0cyAmJiBmaWx0ZXJlZFJlc3VsdHMubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coYEhvdGVsICR7aG90ZWwubmFtZX0gd2l0aCBmaWx0ZXIgYXBwbGllZGAsIGhvdGVsPy50YWdzLCBpc1RydWUpO1xyXG4gICAgICByZXR1cm4gaXNUcnVlO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gaXNUcnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb252ZXJ0VG9PbmVTdHJpbmcoaXRlbTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gaXRlbS5yZXBsYWNlKC9bXmEtekEtWl0vZywgJycpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW1hZ2VzKEhvbGlkYXlDb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XHJcbiAgICBjb25zdCB1cmwgPVxyXG4gICAgICB0aGlzLmVudmlyb25tZW50Lmhvc3RCYXNlVXJsICtcclxuICAgICAgVVJMUy5DT05GSVJNQV9QSE9UT19VUkwgK1xyXG4gICAgICBIb2xpZGF5Q29kZS5zcGxpdCgnLCcpWzBdO1xyXG4gICAgY29uc3QgaW1nUHJvdmlkZXIgPSAnaHR0cHM6Ly93d3cudmZtaWkuY29tLyc7IC8vIGltZyBwcm92aWRlciB0aGF0cyBob2xkcyBpbWFnZXMsIHVzZWQgdG8gbWF0Y2ggd2hpY2ggaW1hZ2VzIG9uIHBhZ2UgYmVsb25ncyB0byBnYWxsZXJ5LlxyXG4gICAgaWYgKHRoaXMuZ2FsbGVyaWVzW0hvbGlkYXlDb2RlXSkge1xyXG4gICAgICByZXR1cm4gb2YodGhpcy5nYWxsZXJpZXNbSG9saWRheUNvZGVdKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2FsbFNlcnZpY2UuZ2V0KHVybCBhcyBVUkxTLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pLnBpcGUoXHJcbiAgICAgIG1hcCgoaW1hZ2VzSFRNTCkgPT4ge1xyXG4gICAgICAgIGlmICghaW1hZ2VzSFRNTCkge1xyXG4gICAgICAgICAgdGhyb3cgRXJyb3IoYEdhbGxlcnkgZm9yICR7SG9saWRheUNvZGV9IGNhbiBub3QgYmUgbG9hZGVkLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGVtcC5pbm5lckhUTUwgPSBpbWFnZXNIVE1MO1xyXG4gICAgICAgIGNvbnN0IGltYWdlcyA9IEFycmF5LmZyb20odGVtcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJykpLnJlZHVjZShcclxuICAgICAgICAgIChhY2MsIGltZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaW1nLnNyYy5pbmNsdWRlcyhpbWdQcm92aWRlcikpIHtcclxuICAgICAgICAgICAgICBhY2MucHVzaChpbWcuc3JjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFtdXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoIWltYWdlcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgICAgICBgVGhlcmUgaXMgbm8gbWVkaWEgY29udGVudCBwcm92aWRlZCBmb3IgdGhpcyBob3RlbCAke0hvbGlkYXlDb2RlfWBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAodGhpcy5nYWxsZXJpZXNbSG9saWRheUNvZGVdID0gaW1hZ2VzKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhZGRQYWdpbmF0aW9uUGFnZShjdXJyZW50UGFnZTogbnVtYmVyKTogYW55IHtcclxuICAgIGNvbnN0IGtleSA9ICdQYWdpbmF0aW9uUGFnZUNvdW50JztcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oa2V5LCBjdXJyZW50UGFnZSk7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShrZXkpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlVmlldygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSBIb3RlbFZpZXcuTElTVCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gSG90ZWxWaWV3Lk1BUDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSBIb3RlbFZpZXcuTElTVDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGNEYXlEaWZmKCk6IG51bWJlciB7XHJcbiAgICBjb25zdCBjaGVja291dCA9IG1vbWVudCh0aGlzLmNoZWNrb3V0X2RhdGUpO1xyXG4gICAgY29uc3QgY2hlY2tpbiA9IG1vbWVudCh0aGlzLmNoZWNraW5fZGF0ZSk7XHJcbiAgICByZXR1cm4gY2hlY2tvdXQuc3RhcnRPZigpLmRpZmYoY2hlY2tpbi5zdGFydE9mKCksICdkYXlzJyk7XHJcbiAgfVxyXG4gIHVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHM6IEhvdGVsRGV0YWlsc1tdKTogSUNoZWFwZXN0UHJpY2Uge1xyXG4gICAgY29uc3QgY3VycmVuY2llc0tleSA9IE9iamVjdC5rZXlzKHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5jdXJyZW5jaWVzKTtcclxuICAgIGlmICgoIXJlc3VsdHMubGVuZ3RoICYmICFjdXJyZW5jaWVzS2V5Lmxlbmd0aCkgfHwgIWN1cnJlbmNpZXNLZXkubGVuZ3RoKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBjdXJyZW5jaWUgPSBjdXJyZW5jaWVzS2V5WzBdO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFtb3VudDogdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmN1cnJlbmNpZXNbY3VycmVuY2llXS5taW5wcmljZSxcclxuICAgICAgY3VycmVuY3lDb2RlOiBjdXJyZW5jaWVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRSb29tTnVtYmVyKCkge1xyXG4gICAgbGV0IHJvb21zT2NjdXBhbmN5OiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOdW1iZXIodGhpcy50ZW1wUGFyYW1zLm5vX29mX3Jvb21zKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5ld1Jvb21PY2N1cGFuY3kgPSB7XHJcbiAgICAgICAgQWR1bHRzOiB0aGlzLmNhbGNSb29tT2NjdXBhbmN5KHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcywgdGhpcy50ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50cyksXHJcbiAgICAgICAgQ2hpbGRyZW46IDAsXHJcbiAgICAgICAgSW5mYW50czogMFxyXG4gICAgICB9O1xyXG4gICAgICByb29tc09jY3VwYW5jeS5wdXNoKG5ld1Jvb21PY2N1cGFuY3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByb29tczogbnVtYmVyW10gPSBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByb29tc09jY3VwYW5jeS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb29tc09jY3VwYW5jeVtpbmRleF0uQWR1bHRzOyBqKyspIHtcclxuICAgICAgICByb29tcy5wdXNoKGluZGV4KzEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIHNob3VsZCB3ZSBhZGQgbmV3IHByb3BlcnR5IHJvb21OdW1iZXIgZm9yIHRyYXZlbGxlcj8gLS1cclxuICAgIC8vIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRyYXZlbGxlcnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAvLyAgIHRoaXMudHJhdmVsbGVyc1tpbmRleF0ucm9vbU51bWJlciA9IHJvb21zW2luZGV4XTtcclxuICAgIC8vIH07XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICpcdEBkZXNjIC0gcmV0dXJuIHRoZSBvY2N1cGFuY3kgZm9yIGEgcm9vbSAtIG5lZWQgdG8gY2FsY3VsYXRlIGJhc2VkIG9uIG5vIG9mIHJvb21zLCBubyBvZiB0cmF2ZWxsZXJzIGFuZCBjdXJyZW50bHkgb2NjdXBpZWQgcm9vbXM7XHJcbiAgICoqL1xyXG5cclxuICAgY2FsY1Jvb21PY2N1cGFuY3kobm9fb2Zfcm9vbXM6IG51bWJlciwgdHJhdmVsbGVyczogbnVtYmVyKTogbnVtYmVye1xyXG4gICAgY29uc29sZS5sb2coJ05vIG9mIFRyYXZlbGxlcnM6ICcgKyB0cmF2ZWxsZXJzICsgJ3wgTm8gb2Ygcm9vbXM6ICcgKyBub19vZl9yb29tcyArICcgfCBBc3NpZ25lZDogJyArIHRoaXMub2NjdXBpZWQpO1xyXG4gICAgbGV0IHJvb21PY2N1cGFuY3k6IG51bWJlciA9IE1hdGguY2VpbCh0cmF2ZWxsZXJzL25vX29mX3Jvb21zKTtcclxuXHJcbiAgICBpZiAodHJhdmVsbGVycyAtIHRoaXMub2NjdXBpZWQgPCByb29tT2NjdXBhbmN5KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdXZSBoYXZlIHJ1biBvdXQgb2Ygb2NjdXBpZXJzIScpO1xyXG4gICAgICByb29tT2NjdXBhbmN5ID0gdHJhdmVsbGVycyAtIHRoaXMub2NjdXBpZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvb21PY2N1cGFuY3kgPD0gMCkge1xyXG4gICAgICByb29tT2NjdXBhbmN5ID0gMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9jY3VwaWVkICs9IHJvb21PY2N1cGFuY3k7XHJcbiAgICByZXR1cm4gcm9vbU9jY3VwYW5jeTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZEhvdGVsUm9vbVRvQmFza2V0KFxyXG4gICAgaG90ZWw6IEhvdGVsUXVvdGVSZXN1bHQsXHJcbiAgICBob3RlbFJvb206IEhvdGVsUm9vbSxcclxuICAgIGhvdGVsUXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzLFxyXG4gICAgdHJhdmVsbGVycz86IFRyYXZlbGxlcltdXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoaG90ZWwudW5hdmFpbGFibGUpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvLyBtb2RpZnkgdGhlICdzdGFydERhdGUnIGFuZCAnZW5kRGF0ZScgcHJvcGVydGllcyB0byBoYXZlIElTTyBmb3JtYXRcclxuICAgIGhvdGVsUXVlcnkuc3RhcnREYXRlID0gbmV3IERhdGUoaG90ZWxRdWVyeS5zdGFydERhdGUpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICBob3RlbFF1ZXJ5LmVuZERhdGUgPSBuZXcgRGF0ZShob3RlbFF1ZXJ5LmVuZERhdGUpLnRvSVNPU3RyaW5nKCk7XHJcblxyXG4gICAgLy8gY3JlYXRlIGNvcHkgb2YgaG90ZWxRdWVyeSBhbmQgZGVsZXRlICdhZHVsdHMnIHByb3BlcnR5IGFzIHNlYXJjaFF1ZXJ5U2NoZW1hIGZvciBob3RlbCAoY29uZmVybWEpIGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCBpdCBiZWluZyBhZGRlZFxyXG4gICAgY29uc3Qgc2VhcmNoUXVlcnkgPSB7IC4uLmhvdGVsUXVlcnkgfTtcclxuICAgIGRlbGV0ZSBzZWFyY2hRdWVyeS5hZHVsdHM7XHJcblxyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldEludGVyZmFjZSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmFza2V0U2VydmljZS5nZXREZWZhdWx0QmFza2V0KCk7XHJcbiAgICBjb25zdCBiYXNrZXQgPSBpbnRCYXNrZXQ/LnN1YmplY3QudmFsdWU7XHJcbiAgICBpZiAoYmFza2V0KSB7XHJcbiAgICAgIGNvbnN0IHsgYWRkcmVzczogaG90ZWxBYWRkcmVzcyB9ID0gaG90ZWw7XHJcbiAgICAgIGNvbnN0IHsgcmF0ZURlc2NyaXB0aW9uLCByb29tRGVzY3JpcHRpb24sIHJvb21JZCwgcm9vbVR5cGUgfSA9IGhvdGVsUm9vbTtcclxuICAgICAgcmV0dXJuIHRoaXMuYmFza2V0U2VydmljZS5hZGRUb0Jhc2tldChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBhZHVsdHM6IGhvdGVsUXVlcnkuYWR1bHRzLFxyXG4gICAgICAgICAgYmFza2V0OiBiYXNrZXQuaWQsXHJcbiAgICAgICAgICBzZXJ2aWNlOiBob3RlbC5zb3VyY2VJZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgIGNoZWNrSW46IGhvdGVsUXVlcnkuc3RhcnREYXRlLFxyXG4gICAgICAgICAgICBjaGVja091dDogaG90ZWxRdWVyeS5lbmREYXRlLFxyXG4gICAgICAgICAgICBob3RlbEFkZHJlc3M6IHtcclxuICAgICAgICAgICAgICBzdHJlZXROYW1lOiBob3RlbEFhZGRyZXNzLmFkZHJlc3NMaW5lMSxcclxuICAgICAgICAgICAgICB0b3duOiBob3RlbEFhZGRyZXNzLmFkZHJlc3NMaW5lMixcclxuICAgICAgICAgICAgICBjb3VudHk6IGhvdGVsQWFkZHJlc3MuYWRkcmVzc0xpbmUzLFxyXG4gICAgICAgICAgICAgIHBvc3Rjb2RlOiBob3RlbEFhZGRyZXNzLnBvc3RPclppcENvZGUsXHJcbiAgICAgICAgICAgICAgY291bnRyeUNvZGU6IGhvdGVsQWFkZHJlc3MuY291bnRyeUNvZGVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaG90ZWxEZXNjcmlwdGlvbjogaG90ZWwuZ3JvdXAsXHJcbiAgICAgICAgICAgIGhvdGVsTmFtZTogaG90ZWwubmFtZSxcclxuICAgICAgICAgICAgbnVtYmVyT2ZSb29tczogaG90ZWxRdWVyeS5yb29tcyxcclxuICAgICAgICAgICAgcmF0ZURlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICByb29tRGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIHJvb21JZCxcclxuICAgICAgICAgICAgcm9vbVR5cGVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwcmljZTogaG90ZWxSb29tLnRvdGFsLFxyXG4gICAgICAgICAgY3VycmVuY3k6IGhvdGVsUm9vbS5jdXJyZW5jeUNvZGUgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgICAgICAgc2VhcmNoUXVlcnksXHJcbiAgICAgICAgICBvdXRib3VuZERhdGU6IGhvdGVsUXVlcnkuc3RhcnREYXRlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBpbnRCYXNrZXQsXHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXMudHJhdmVsbGVyc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsZUFBZSxFQUFRLEVBQUUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUlMLGFBQWEsRUFJYixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFNZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFLTCxhQUFhLEVBUWIsV0FBVyxFQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFpQmhDLE9BQU8sRUFJTCxZQUFZLEVBRVosU0FBUyxFQUVWLE1BQU0sd0NBQXdDLENBQUM7QUFpQmhELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixNQUFNLENBQU4sSUFBWSxjQUlYO0FBSkQsV0FBWSxjQUFjO0lBQ3hCLHVDQUFxQixDQUFBO0lBQ3JCLCtCQUFhLENBQUE7SUFDYixpQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxjQUFjLEtBQWQsY0FBYyxRQUl6QjtBQUVELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sT0FBTyxxQkFPWCxTQUFRLG9CQUlQO0lBOFNELFlBQ1UsWUFBeUMsRUFDakQs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LENBQUM7QUFDeEMsNkNBQXVCLEdBQUcsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBCYXNlRW50ZXJwcmlzZVNlYXJjaCB9IGZyb20gJy4vYmFzZS1lbnRlcnByaXNlJztcclxuaW1wb3J0IHsgQmFzZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZUhlbHBlclJvdXRpbmVzIH0gZnJvbSAnLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tLCBvZiwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJhc2VFbnZpcm9ubWVudCB9IGZyb20gJy4vZW52aXJvbWVudCc7XHJcbmltcG9ydCB7IEJhc2VIb3RlbEF2YWxpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2hvdGVsLWF2YWxsaWJpbGl0eS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVVJMUyB9IGZyb20gJy4vLi4vc2VydmljZXMvdXJsLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIENvdW50cnksXHJcbiAgSG90ZWxRdW90ZVJlc3VsdCxcclxuICBIb3RlbFF1b3RlUmVzdWx0QXJyYXksXHJcbiAgTG9jYXRpb25UeXBlcyxcclxuICBOZ2JEYXRlU3RydWN0LFxyXG4gIExvY2F0aW9uRGV0YWlscyxcclxuICBIb3RlbEF2YWxpYmlsaXR5UXVvdGVSZXN1bHQsXHJcbiAgaW5jbHVkZWRFeHByZXNzaW9uLFxyXG4gIGV4Y2x1ZGVkRXhwcmVzc2lvbixcclxuICBTZWFyY2hIYW5kbGVyLFxyXG4gIFJlY2VudFNlYXJjaCxcclxuICBBaXJwb3J0U2VhcmNoUmVzdWx0cyxcclxuICBIb3RlbERldGFpbHMsXHJcbiAgSG90ZWxEZXRhaWxzQXJyYXksXHJcbiAgU2F2ZUZhdm91cml0ZVNlYXJjaFJlc3VsdFxyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICBCYXNrZXRJdGVtLFxyXG4gIENvbmZlcm1hT2ZmaWNlTmFtZXMsXHJcbiAgQ29uZmVybWFPZmZpY2VJbmZvLFxyXG4gIEN1cnJlbmN5Q29kZSxcclxuICBEaXN0YW5jZVR5cGVzLFxyXG4gIEhvdGVsTG9jYXRpb24sXHJcbiAgSG90ZWxSb29tLFxyXG4gIEhvdGVsVGFnLFxyXG4gIFJhaWxTdGF0aW9uLFxyXG4gIFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyxcclxuICBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyxcclxuICBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyxcclxuICBTZXJ2aWNlVHlwZVxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VIb3RlbFF1b3RlRmV0Y2hlcixcclxuICBIb3RlbFF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9ob3RlbC1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBGdWxsVXNlckRldGFpbHMsXHJcbiAgVXNlclNlcnZpY2VJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0l1c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXNlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RIdHRwQ2FsbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9odHRwLWNhbGwuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBIb3RlbEF2YWxpbmlsaXR5RmV0Y2hlclR5cGUgfSBmcm9tICcuLi9mZXRjaGVycy9ob3RlbC1hdmFsaWFiaWxpdHktZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0llbnRlcnByaXNlLWJhc2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBBdmFpbGFiaWxpdHlPYmplY3QsXHJcbiAgRGlzcGxheUZpbHRlclNldHRpbmdzLFxyXG4gIEhvdGVsRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZSxcclxuICBIb3RlbEZpbHRlcnMsXHJcbiAgSG90ZWxUZW1wUGFyYW1zLFxyXG4gIEhvdGVsVmlldyxcclxuICBSZXN1bHREZXRhaWxzXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBJQ2hlYXBlc3RQcmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlYXBlc3QtcHJpY2UnO1xyXG5pbXBvcnQgeyBUcmF2ZWxsZXIgfSBmcm9tICcuLi9tb2RlbHMvdHJhdmVsbGVyLm9iamVjdCc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlcixcclxuICBDb25mZXJtYVF1aWNrbGlzdEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvY29uZmVybWEtcXVpY2tsaXN0LmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRSYWlsU3RhdGlvbkZldGNoZXIsXHJcbiAgR2V0UmFpbFN0YXRpb25GZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC1yYWlsLXN0YXRpb24uZmV0Y2hlcic7XHJcbmltcG9ydCB7IEhvdGVsUmVjZW50U2VhcmNoQXJncyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaG90ZWwtcmVjZW50LXNlYXJjaC1hcmdzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IHJlc3VsdCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7XHJcbiAgQXBwbHlIb3RlbFJ1bGVzRmV0Y2hlclR5cGUsXHJcbiAgQmFzZUhvdGVsUnVsZXNGZXRjaGVyXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvYXBwbHktSklULWhvdGVsLXJ1bGVzLmZldGNoZXInO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuZXhwb3J0IGVudW0gU29ydFR5cGVzSG90ZWwge1xyXG4gIGRpc3RhbmNlID0gJ2Rpc3RhbmNlJyxcclxuICBuYW1lID0gJ25hbWUnLFxyXG4gIHByaWNlID0gJ3ByaWNlJ1xyXG59XHJcblxyXG5jb25zdCBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFID0gMTtcclxuY29uc3QgQUdFTlRfUFJFRkVSUkVEX1ZBTFVFID0gMjtcclxuXHJcbmV4cG9ydCBjbGFzcyBIb3RlbEVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBIUV9RIGV4dGVuZHMgSG90ZWxRdW90ZUZldGNoZXJUeXBlLFxyXG4gICAgSEFfUSBleHRlbmRzIEhvdGVsQXZhbGluaWxpdHlGZXRjaGVyVHlwZSxcclxuICAgIFFMX1EgZXh0ZW5kcyBDb25mZXJtYVF1aWNrbGlzdEZldGNoZXJUeXBlLFxyXG4gICAgR1JTX1EgZXh0ZW5kcyBHZXRSYWlsU3RhdGlvbkZldGNoZXJUeXBlLFxyXG4gICAgSFJfUSBleHRlbmRzIEFwcGx5SG90ZWxSdWxlc0ZldGNoZXJUeXBlXHJcbiAgPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBIb3RlbFRlbXBQYXJhbXMsXHJcbiAgICBIb3RlbFF1b3RlUmVzdWx0QXJyYXksXHJcbiAgICBIb3RlbERldGFpbHNBcnJheVxyXG4gID5cclxuICBpbXBsZW1lbnRzIEhvdGVsRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZVxyXG57XHJcbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9IT1RFTF9ST09NUyA9IDQ7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9QQVJBTVMgPSAnc2VhcmNoX2hvdGVsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAncmVzdWx0c19ob3RlbCc7XHJcblxyXG4gIHB1YmxpYyB0eXBlOiBTZXJ2aWNlVHlwZSA9IFNlcnZpY2VUeXBlLkhvdGVsO1xyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcbiAgcHVibGljIGxvY2F0aW9uX3R5cGVzOiBCZWhhdmlvclN1YmplY3Q8TG9jYXRpb25UeXBlc1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XHJcbiAgICBMb2NhdGlvblR5cGVzW11cclxuICA+KFtdKTtcclxuICBwdWJsaWMgb2ZmaWNlczogQmVoYXZpb3JTdWJqZWN0PExvY2F0aW9uVHlwZXNbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgTG9jYXRpb25UeXBlc1tdXHJcbiAgPihbXSk7XHJcbiAgcHVibGljIGxhc3RBY3RpdmVQYWdlOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XHJcblxyXG4gIHJlYWRvbmx5IGdhbGxlcmllczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgcHJpdmF0ZSBvY2N1cGllZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHJlc3VsdHNfZGV0YWlsczogUmVzdWx0RGV0YWlscyA9IHtcclxuICAgIGNoYWluczogbmV3IFNldDxzdHJpbmc+KCksXHJcbiAgICBhbWVuaXRpZXM6IFtdLFxyXG4gICAgbWF4RGlzdGFuY2U6IDBcclxuICB9O1xyXG4gIHByaXZhdGUgX2NoZWNraW5fZGF0ZV9uZ2I6IE5nYkRhdGVTdHJ1Y3Q7XHJcbiAgcHJpdmF0ZSBfY2hlY2tvdXRfZGF0ZV9uZ2I6IE5nYkRhdGVTdHJ1Y3Q7XHJcbiAgcHJpdmF0ZSBfYm9va2VkVHJhdmVsbGVyczogVHJhdmVsbGVyW10gPSBbXTtcclxuXHJcbiAgZ2V0IGNoYWlucygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMucmVzdWx0c19kZXRhaWxzLmNoYWluc107XHJcbiAgfVxyXG5cclxuICBnZXQgYW1lbml0aWVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5yZXN1bHRzX2RldGFpbHMuYW1lbml0aWVzXTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhEaXN0YW5jZSgpOiBudW1iZXIge1xyXG4gICAgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4ID0gTWF0aC5jZWlsKFxyXG4gICAgICBNYXRoLm1heC5hcHBseShcclxuICAgICAgICBNYXRoLFxyXG4gICAgICAgIHRoaXMucmVzdWx0cy52YWx1ZS5tYXAoKG8pID0+IG8ubG9jYXRpb24uZGlzdGFuY2UpXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSA9IHRoaXMuZmlsdGVycy5kaXN0YW5jZVJhbmdlLm1heDtcclxuICAgIHJldHVybiB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhQcmljZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmZpbHRlcnMucHJpY2VSYW5nZS5tYXgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGN1cnJlbmN5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jdXJyZW5jeSA9IHZhbHVlO1xyXG4gIH1cclxuICAvLyBFdmVudCBFbWl0dGVyc1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2U6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHVibGljIHNlbGVjdEl0ZW1NYXBWaWV3OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwdWJsaWMgZGlzcGxheTogRGlzcGxheUZpbHRlclNldHRpbmdzID0ge1xyXG4gICAgbWlucHJpY2U6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcclxuICAgIG1heHByaWNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICBmaWx0ZXJzOiB7XHJcbiAgICAgIGJyZWFrZmFzdFR5cGU6IFtdXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy8gcHVibGljIHZhcmlhYmxlc1xyXG4gIHB1YmxpYyBtaW5fZGF0ZSA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSwgLy8gbmdiRGF0ZSBtb250aHMgYXJlIG5vdCAwIGluZGV4ZWRcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIG1pbl9yZXR1cm5fZGF0ZSA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSwgLy8gbmdiRGF0ZSBtb250aHMgYXJlIG5vdCAwIGluZGV4ZWRcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpICsgMSAvLyBtaW4gMSBuaWdodCBzdGF5XHJcbiAgfTtcclxuXHJcbiAgLy8gcHJpdmF0ZSB2YXJpYWJsZXNcclxuICAvLyBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRpbWVzIGhlcmUgLSBtYXliZSBub3JtYWxpc2UgdGhlc2UgaW4gdGhlIHJlcXVlc3QgYm9keT9cclxuXHJcbiAgcHJpdmF0ZSBsb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50VmlldzogSG90ZWxWaWV3ID0gSG90ZWxWaWV3LkxJU1Q7XHJcblxyXG4gIC8vIEZvciBOZ0ZvcmluZyBvdmVyIGluIHRoZSB0ZW1wbGF0ZXNcclxuICBwcml2YXRlIF9tYXhfbm9fb2Zfcm9vbXMgPSA0O1xyXG4gIHByaXZhdGUgX21heF9yb29tc19hcnJheSA9IG5ldyBBcnJheSh0aGlzLl9tYXhfbm9fb2Zfcm9vbXMpLmZpbGwoMCk7XHJcbiAgcHJpdmF0ZSBfbWF4X25vX29mX29jY3VwYW50cyA9IDg7XHJcbiAgcHJpdmF0ZSBfbWF4X29jY3VwYW50X2FycmF5ID0gbmV3IEFycmF5KHRoaXMuX21heF9ub19vZl9vY2N1cGFudHMpLmZpbGwoMCk7XHJcbiAgcHJpdmF0ZSBfZGlzdGFuY2VfbGlzdCA9IFsxLCAyLCA1LCAxMCwgMjAsIDI1XTsgLy8gY29waWVkIGZyb20gb2xkIGZyb250ZW5kIGZvciBub3dcclxuICBwcml2YXRlIF9kZWZhdWx0X2N1cnJlbmN5OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gIGdldCBjaGVja2luX2RhdGVfbmdiKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWNraW5fZGF0ZV9uZ2I7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hlY2tpbl9kYXRlX25nYih2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5fY2hlY2tpbl9kYXRlX25nYiA9IHZhbHVlO1xyXG5cclxuICAgIHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy5jaGVja2luX2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNrb3V0X2RhdGVfbmdiKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWNrb3V0X2RhdGVfbmdiO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNrb3V0X2RhdGVfbmdiKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9jaGVja291dF9kYXRlX25nYiA9IHZhbHVlO1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNraW5fZGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoZWNraW5fZGF0ZShuZXdEYXRlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICBpZiAobmV3RGF0ZSAmJiBuZXdEYXRlLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlID0gbW9tZW50KG5ld0RhdGUpO1xyXG4gICAgICB0aGlzLl9jaGVja2luX2RhdGVfbmdiID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGUpO1xyXG4gICAgICBpZiAobmV3RGF0ZS5pc1NhbWVPckJlZm9yZSh0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZSkpIHtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0X2RhdGUgPSBtb21lbnQobmV3RGF0ZSkuYWRkKDEsICdkYXknKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY2hlY2tvdXRfZGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBjaGVja291dF9kYXRlKG5ld0RhdGU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIC8vIGlmIChuZXdEYXRlLmlzU2FtZU9yQmVmb3JlKHRoaXMuY2hlY2tpbl9kYXRlKSkgeyAgLy8gbm90IGFsbG93ZWRcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKG5ld0RhdGUgJiYgbmV3RGF0ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUgPSBuZXdEYXRlO1xyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGVfbmdiID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGUpO1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbm9fb2Zfcm9vbXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubm9fb2Zfcm9vbXM7XHJcbiAgfVxyXG5cclxuICBzZXQgbm9fb2Zfcm9vbXMobmV3Um9vbXM6IG51bWJlcikge1xyXG4gICAgaWYgKG5ld1Jvb21zID4gNCB8fCBuZXdSb29tcyA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyA9IG5ld1Jvb21zO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vX29mX29jY3VwYW50cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHM7XHJcbiAgfVxyXG5cclxuICBzZXQgbm9fb2Zfb2NjdXBhbnRzKG5ld09jYzogbnVtYmVyKSB7XHJcbiAgICBpZiAobmV3T2NjIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50cyA9IG5ld09jYztcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBkZWZhdWx0X2N1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGRlZmF1bHRfY3VycmVuY3koY3VycmVuY3k6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5ID0gY3VycmVuY3k7XHJcbiAgfVxyXG5cclxuICAvLyBtYXkgaGF2ZSB0byBtb2RpZnkgdGhlc2VcclxuICBnZXQgbG9jYXRpb24oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb247XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb24obmV3TG9jOiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbiA9IG5ld0xvYztcclxuXHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9ybWF0dGVkX2xvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uXHJcbiAgICAgID8gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uLmRlc3RpbmF0aW9uXHJcbiAgICAgIDogJ05vIExvY2F0aW9uIFNldCc7IC8vIFRPRE8gLSAgZXhwYW5kIHRoaXMgZm9yIGRpZmZlcmVudCB0eXBlc1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3RhbmNlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmRpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRpc3RhbmNlKG5ld0Rpc3Q6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmRpc3RhbmNlID0gbmV3RGlzdDtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBwcmVmZXJlZF9ob3RlbHNfb25seSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJlZmVyZWRfaG90ZWxzX29ubHk7XHJcbiAgfVxyXG5cclxuICBzZXQgcHJlZmVyZWRfaG90ZWxzX29ubHkobmV3UHJlZjogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnByZWZlcmVkX2hvdGVsc19vbmx5ID0gbmV3UHJlZjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBjb3VudHJ5KCk6IENvdW50cnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jb3VudHJ5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGNvdW50cnkobmV3Q29udDogQ291bnRyeSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNvdW50cnkgPSBuZXdDb250O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc3Rjb2RlKCk6IExvY2F0aW9uRGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnBvc3Rjb2RlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBvc3Rjb2RlKHBvc3Rjb2RlOiBMb2NhdGlvbkRldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wb3N0Y29kZSA9IHBvc3Rjb2RlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRyYWluc1N0YXRpb24oKTogTG9jYXRpb25EZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCB0cmFpbnNTdGF0aW9uKHN0YXRpb246IExvY2F0aW9uRGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnRyYWluc1N0YXRpb24gPSBzdGF0aW9uO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9mZmljZSgpOiBDb25mZXJtYU9mZmljZU5hbWVzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMub2ZmaWNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IG9mZmljZShvZmZpY2U6IENvbmZlcm1hT2ZmaWNlTmFtZXMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vZmZpY2UgPSBvZmZpY2U7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICAvLyBBZGRpdGlvbmFsIFZhcmlhYmxlc1xyXG4gIGdldCBob3RlbF9uYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmhvdGVsX25hbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgaG90ZWxfbmFtZShuZXdOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9uYW1lID0gbmV3TmFtZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBob3RlbF9jaGFpbigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5ob3RlbF9jaGFpbjtcclxuICB9XHJcblxyXG4gIHNldCBob3RlbF9jaGFpbihuZXdDaGFpbjogYW55KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaG90ZWxfY2hhaW4gPSBuZXdDaGFpbjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlcnMgT25seVxyXG5cclxuICBnZXQgbWF4X3Jvb21zX2FycmF5KCk6IG51bWJlcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhfcm9vbXNfYXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4X29jY3VwYW50X2FycmF5KCk6IG51bWJlcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhfb2NjdXBhbnRfYXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzdGFuY2VfbGlzdCgpOiBudW1iZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzdGFuY2VfbGlzdDtcclxuICB9XHJcblxyXG4gIGdldCBsb2NhdGlvbl90eXBlX3NlbGVjdCgpOiBMb2NhdGlvblR5cGVzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25fdHlwZV9zZWxlY3Q7XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb25fdHlwZV9zZWxlY3QodmFsdWU6IExvY2F0aW9uVHlwZXMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcnMoKTogSG90ZWxGaWx0ZXJzIHtcclxuICAgIHJldHVybiB0aGlzLmxvY2FsRmlsdGVycztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBob3RlbEZldGNoZXI6IEJhc2VIb3RlbFF1b3RlRmV0Y2hlcjxIUV9RPixcclxuICAgIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgcHJpdmF0ZSBlbnZpcm9ubWVudDogQmFzZUVudmlyb25tZW50LFxyXG4gICAgcHJpdmF0ZSBhdmFsaWFiaWxpdHlTZXJ2aWNlOiBCYXNlSG90ZWxBdmFsaWJpbGl0eVNlcnZpY2U8SEFfUT4sXHJcbiAgICBwcml2YXRlIGJhc2tldFNlcnZpY2U6IEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgc3RvcmFnZVNlcnZpY2U6IEJhc2VTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcml2YXRlIGh0dHBDYWxsU2VydmljZTogQWJzdHJhY3RIdHRwQ2FsbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHF1aWNrTGlzdEZldGNoZXI6IEJhc2VTZWFyY2hDb25mZXJtYVF1aWNrbGlzdEZldGNoZXI8UUxfUT4sXHJcbiAgICBwcml2YXRlIGdldFJhaWxTdGF0aW9uRmV0Y2hlcjogQmFzZUdldFJhaWxTdGF0aW9uRmV0Y2hlcjxHUlNfUT4sXHJcbiAgICBwcml2YXRlIGFwcGx5SG90ZWxSdWxlc0ZldGNoZXI6IEJhc2VIb3RlbFJ1bGVzRmV0Y2hlcjxIUl9RPlxyXG4gICkge1xyXG4gICAgc3VwZXIoc3RvcmFnZVNlcnZpY2UsIGhlbHBlcnMpO1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IEhvdGVsVGVtcFBhcmFtcztcclxuICAgIH0gPSBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShcclxuICAgICAgSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVNcclxuICAgICkgfHwge1xyXG4gICAgICB0ZW1wUGFyYW1zOiB7fSBhcyBIb3RlbFRlbXBQYXJhbXNcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5kZWZhdWx0X2N1cnJlbmN5ID0gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5XHJcbiAgICAgID8gdGhpcy50ZW1wUGFyYW1zLmN1cnJlbmN5XHJcbiAgICAgIDogdGhpcy5fZGVmYXVsdF9jdXJyZW5jeTtcclxuICAgIHRoaXMudXBkYXRlVGVtcFBhcmFtcyhzZWFyY2hTZXJ2aWNlLm1ha2VIb3RlbFF1ZXJ5KGRhdGEudGVtcFBhcmFtcykpO1xyXG5cclxuICAgIGlmIChzZWFyY2hTZXJ2aWNlLnNob3VsZEFkZFRyYXZlbGxlclN1YnNjcmlwdGlvbigpKSB7XHJcbiAgICAgIHNlYXJjaFNlcnZpY2UudHJhdmVsbGVySW5mb3JtYXRpb24uc3Vic2NyaWJlKFxyXG4gICAgICAgICh0cmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50cmF2ZWxsZXJzID0gdHJhdmVsbGVycztcclxuICAgICAgICAgIGNvbnN0IHNwbGl0VHJhdmVsbGVycyA9IHRoaXMuaGVscGVycy5zZWxlY3RlZFRyYXZlbGxlcnMoXHJcbiAgICAgICAgICAgIHRyYXZlbGxlcnMsXHJcbiAgICAgICAgICAgIFNlcnZpY2VUeXBlLkhvdGVsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm5vX29mX29jY3VwYW50cyA9IHNwbGl0VHJhdmVsbGVycy5hZHVsdHMubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy50cmF2ZWxsZXJzID0gdHJhdmVsbGVycztcclxuICAgICAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzdWx0cyA9XHJcbiAgICAgIHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtQXNMaXN0PEhvdGVsRGV0YWlsc0FycmF5PihcclxuICAgICAgICB0aGlzLnJlc3VsdHNTZXNzaW9uTmFtZVxyXG4gICAgICApIHx8IFtdO1xyXG4gICAgcmVzdWx0c1xyXG4gICAgICAuc2xpY2UoMCwgdGhpcy5lbnZpcm9ubWVudC5udW1iZXJIb3RlbFRvUHJlbG9hZClcclxuICAgICAgLmZvckVhY2goKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hTZXJ2aWNlLmNhbkJvb2soU2VydmljZVR5cGUuSG90ZWwpKSB7XHJcbiAgICAgICAgICAvLyBuZWVkIHRoaXMgY2hlY2sgYmVjYXVzZSBvbiByZWZyZXNoIHdlIGFyZSBnZXR0aW5nIGVycm9ycyAtIHRoZW9yeSB0aGF0IHVzZXIgaGFzbid0IGZ1bGx5IGxvYWRlZCBpbiB5ZXRcclxuICAgICAgICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlGb3JJZChcclxuICAgICAgICAgICAgdGhpcy5tYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWwpLFxyXG4gICAgICAgICAgICBob3RlbFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgoaG90ZWxSZXN1bHQ6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5jaGFpbnMuYWRkKGhvdGVsUmVzdWx0Lmdyb3VwKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mdWxsUmVzdWx0cyA9IHJlc3VsdHM7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChyZXN1bHRzKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuXHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmNoYW5nZVVzZXIuc3Vic2NyaWJlKCh1c2VyOiBQYXJ0aWFsPEZ1bGxVc2VyRGV0YWlscz4pID0+IHtcclxuICAgICAgdGhpcy5sb2NhdGlvbl90eXBlcy5uZXh0KFtcclxuICAgICAgICBMb2NhdGlvblR5cGVzLkFpcnBvcnQsXHJcbiAgICAgICAgTG9jYXRpb25UeXBlcy5DaXR5LFxyXG4gICAgICAgIExvY2F0aW9uVHlwZXMuT2ZmaWNlLFxyXG4gICAgICAgIExvY2F0aW9uVHlwZXMuU2hvcnRsaXN0LFxyXG4gICAgICAgIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uXHJcbiAgICAgIF0pO1xyXG4gICAgICBpZiAoc2VhcmNoU2VydmljZS5zaG91bGRGZXRjaEFsbE9mZmljZXMoKSkge1xyXG4gICAgICAgIHRoaXMub2ZmaWNlcy5uZXh0KFtdKTsgLy8gVE9ETyBmZXRjaCBvZmZpY2VzXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzID0gbmV3IEhvdGVsRmlsdGVycygpO1xyXG5cclxuICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5mZXRjaGluZy5zdWJzY3JpYmUoKGlzRmV0Y2hpbmc6IGJvb2xlYW4pID0+IHtcclxuICAgICAgaWYgKCFpc0ZldGNoaW5nKSB7XHJcbiAgICAgICAgLy8gV2UndmUganVzdCBmaW5pc2hlZCBmZXRjaGluZyBhdmFsaWJpbGl0eSBzbyB1cGRhdGUgZmlsdGVycy5cclxuXHJcbiAgICAgICAgY29uc3QgbWF4TnVtYmVyID0gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLm1heFByaWNlRm9yQ3VycmVuY3koJ0dCUCcpO1xyXG4gICAgICAgIGlmIChtYXhOdW1iZXIgPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnMucHJpY2VSYW5nZS5tYXggPSBtYXhOdW1iZXI7XHJcbiAgICAgICAgICB0aGlzLmxvY2FsRmlsdGVycy5wcmljZVJhbmdlLm1heCA9IG1heE51bWJlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hlYXBlc3RSZXN1bHRQcmljZSA9IHRoaXMudXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0cyk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoU2VydmljZS5jYW5Cb29rKFNlcnZpY2VUeXBlLkhvdGVsKSkge1xyXG4gICAgICAgICAgLy8gbmVlZCB0aGlzIGNoZWNrIGJlY2F1c2Ugb24gcmVmcmVzaCB3ZSBhcmUgZ2V0dGluZyBlcnJvcnMgLSB0aGVvcnkgdGhhdCB1c2VyIGhhc24ndCBmdWxseSBsb2FkZWQgaW4geWV0XHJcbiAgICAgICAgICB0aGlzLl9hcHBseVRyYXZlbFJ1bGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0cyhyZXN1bHRzVG9NYXA6IEhvdGVsUXVvdGVSZXN1bHRBcnJheSkge1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2UgPSAwO1xyXG4gICAgdGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICByZXR1cm4gcmVzdWx0c1RvTWFwLm1hcChcclxuICAgICAgKGhvdGVsUmVzdWx0OiBIb3RlbFF1b3RlUmVzdWx0LCBpbmRleDogbnVtYmVyKTogSG90ZWxEZXRhaWxzID0+IHtcclxuICAgICAgICB0aGlzLnJlc3VsdHNfZGV0YWlscy5tYXhEaXN0YW5jZSA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2UsXHJcbiAgICAgICAgICBob3RlbFJlc3VsdC5sb2NhdGlvbi5kaXN0YW5jZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4ID0gdGhpcy5yZXN1bHRzX2RldGFpbHMubWF4RGlzdGFuY2U7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRzX2RldGFpbHMuY2hhaW5zLmFkZChob3RlbFJlc3VsdC5ncm91cCk7XHJcbiAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5lbnZpcm9ubWVudC5udW1iZXJIb3RlbFRvUHJlbG9hZCkge1xyXG4gICAgICAgICAgdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eUZvcklkKFxyXG4gICAgICAgICAgICB0aGlzLm1ha2VIb3RlbEF2YWxpbGl0eU9iamVjdChob3RlbFJlc3VsdCksXHJcbiAgICAgICAgICAgIGhvdGVsUmVzdWx0XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLmdldEhvdGVsQXZhaWxhYmlsaXR5KGhvdGVsUmVzdWx0KTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgc29ydGVkVGFnczogdGhpcy5zb3J0VGFncyhob3RlbFJlc3VsdC50YWdzKSxcclxuICAgICAgICAgIERldGFpbHM6IHtcclxuICAgICAgICAgICAgZGlzdGFuY2VfYWlycG9ydDogMCxcclxuICAgICAgICAgICAgZGlzdGFuY2VfbWV0cm86IDAsXHJcbiAgICAgICAgICAgIGRpc3RhbmNlX3JhaWw6IDAsXHJcbiAgICAgICAgICAgIGFpcnBvcnRfZGV0YWlsczogeyBuYW1lOiAnTm90IHJldHVybmVkJyB9LFxyXG4gICAgICAgICAgICBtZXRyb19kZXRhaWxzOiB7IG5hbWU6ICdOb3QgcmV0dXJuZWQnIH0sXHJcbiAgICAgICAgICAgIHJhaWxfZGV0YWlsczogeyBuYW1lOiAnTm90IHJldHVybmVkJyB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgLy8gYXZpbGFiaWxpdHk6IHRoaXMuaG90ZWxfYXZhaWxhYmlsaXR5LFxyXG4gICAgICAgICAgLi4uaG90ZWxSZXN1bHRcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgcmVzdWx0c1Nlc3Npb25OYW1lID0gSG90ZWxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG4gIHByb3RlY3RlZCBtdWx0aVJlc3VsdHNTZXNzaW9uTmFtZSA9XHJcbiAgICBIb3RlbEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcblxyXG4gIHByaXZhdGUgcXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzID0ge30gYXMgU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXM7XHJcblxyXG4gIHByaXZhdGUgX2FwcGx5VHJhdmVsUnVsZXMoKSB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5oZWxwZXJzXHJcbiAgICAgIC5jbG9uZSh0aGlzLmZ1bGxSZXN1bHRzIHx8IFtdKVxyXG4gICAgICAubWFwKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS51cGRhdGVIb3RlbChob3RlbCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoaG90ZWwuYXZhaWxhYmxlUmF0ZXMgfHwge30pLmxlbmd0aCA+IDA7XHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYXBwbHlIb3RlbFJ1bGVzRmV0Y2hlclxyXG4gICAgICAuZmV0Y2hLZXllZE9iamVjdCgnaWQnLCB7XHJcbiAgICAgICAgZGF0YVxyXG4gICAgICB9KVxyXG4gICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhMTogUmVjb3JkPHN0cmluZywgSG90ZWxEZXRhaWxzPikgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzdWx0cy5uZXh0KFxyXG4gICAgICAgICAgdGhpcy5mdWxsUmVzdWx0cy5tYXAoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICAgICAgaWYgKGRhdGExW2hvdGVsLmlkXSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2Uuc2V0SG90ZWxBdmFsYWJpbGl0eShcclxuICAgICAgICAgICAgICAgIGRhdGExW2hvdGVsLmlkXVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGhvdGVsO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgbWFrZUxvY2F0aW9ucyhsb2NhdGlvbjogSG90ZWxMb2NhdGlvbltdKTogeyBba2V5OiBzdHJpbmddOiBIb3RlbExvY2F0aW9uW10gfSB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLmFycmF5VG9PYmplY3RBcnJheTxcclxuICAgICAgSG90ZWxMb2NhdGlvbixcclxuICAgICAgUmVjb3JkPHN0cmluZywgSG90ZWxMb2NhdGlvbltdPlxyXG4gICAgPihsb2NhdGlvbiwgWydkaXN0YW5jZVR5cGUnXSk7XHJcbiAgfVxyXG5cclxuICBzb3J0VGFncyh0YWdzOiBIb3RlbFRhZ1tdKTogYW55W10ge1xyXG4gICAgaWYgKHRhZ3MpIHtcclxuICAgICAgcmV0dXJuIFsuLi50YWdzXVxyXG4gICAgICAgIC5zb3J0KChhOiBIb3RlbFRhZywgYjogSG90ZWxUYWcpID0+IHtcclxuICAgICAgICAgIGlmIChhLm5hbWUgPCBiLm5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLm5hbWUgPiBiLm5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5tYXAoKHRhZzogSG90ZWxUYWcpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnRhZyxcclxuICAgICAgICAgICAgaWNvbjogdGhpcy5lbnZpcm9ubWVudC50YWdNYXBbdGFnLm5hbWVdIHx8IHRhZy5pY29uXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0UXVlcnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXModGhpcy5zZWFyY2hTZXJ2aWNlLm1ha2VIb3RlbFF1ZXJ5KCkpO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMgPSBuZXcgSG90ZWxGaWx0ZXJzKCk7XHJcbiAgICB0aGlzLnJlc3VsdHNfZGV0YWlscyA9IHtcclxuICAgICAgY2hhaW5zOiBuZXcgU2V0PHN0cmluZz4oKSxcclxuICAgICAgYW1lbml0aWVzOiBbXSxcclxuICAgICAgbWF4RGlzdGFuY2U6IDBcclxuICAgIH07XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZhbGlkKCkge1xyXG4gICAgaWYgKCF0aGlzLmRvQ2hlY2tzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBIb3RlbEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAge1xyXG4gICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtc1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMubWluX3JldHVybl9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKFxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlXHJcbiAgICApO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuY2hlY2tpbl9kYXRlLmlzU2FtZU9yQWZ0ZXIodGhpcy50ZW1wUGFyYW1zLmNoZWNrb3V0X2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jaGVja291dF9kYXRlID0gbW9tZW50KHRoaXMudGVtcFBhcmFtcy5jaGVja2luX2RhdGUpLmFkZCgxLCAnZGF5Jyk7IC8vIGVuc3VyZSB0aGF0IGNoZWNrb3V0IGRhdGUgaXMgbWluIDEgZGF5IGFmdGVyIGNoZWNraW4gZGF0ZVxyXG4gICAgfVxyXG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQ2l0eTpcclxuICAgICAgICBpZiAoIXRoaXMuY291bnRyeSkge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIHNlbGVjdCBjb3VudHJ5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5sb2NhdGlvbiAmJiAhdGhpcy5wb3N0Y29kZSkge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAgICAgJ1BsZWFzZSBzZWxlY3QgYSBob3RlbCBsb2NhdGlvbiBvciBlbnRlciBhIHBvc3Rjb2RlLidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTpcclxuICAgICAgICBpZiAodGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uPy50eXBlICE9PSAnT2ZmaWNlJyAmJiAhdGhpcy5vZmZpY2UpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYW4gb2ZmaWNlLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5BaXJwb3J0OlxyXG4gICAgICAgIGlmICh0aGlzLnRlbXBQYXJhbXM/LmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbi5haXJwb3J0Py5nYXRld2F5KSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSBhaXJwb3J0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSBhaXJwb3J0LicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICF0aGlzLnRlbXBQYXJhbXMubG9jYXRpb24/LnJhaWxzdGF0aW9uPy5zdGF0aW9uQ29kZSAmJlxyXG4gICAgICAgICAgIXRoaXMudHJhaW5zU3RhdGlvbj8uc3RhdGlvbkNvZGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgYSB0cmFpbiBzdGF0aW9uLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5TaG9ydGxpc3Q6XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50cnkpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBzZWxlY3QgY291bnRyeScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNrb3V0X2RhdGUuaXNTYW1lT3JCZWZvcmUodGhpcy5jaGVja2luX2RhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnQ2hlY2tvdXQgZGF0ZSBtdXN0IGJlIGFmdGVyIGNoZWNraW4gZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoZWNrb3V0X2RhdGUgJiYgdGhpcy5jaGVja291dF9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja291dCBkYXRlIG11c3Qgbm90IGJlIGluIHRoZSBwYXN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hlY2tpbl9kYXRlICYmIHRoaXMuY2hlY2tpbl9kYXRlLmlzQmVmb3JlKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdDaGVja2luIGRhdGUgbXVzdCBub3QgYmUgaW4gdGhlIHBhc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tvdXRfZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZSAmJlxyXG4gICAgICB0aGlzLmNoZWNraW5fZGF0ZS5pc0FmdGVyKHRoaXMuY2hlY2tvdXRfZGF0ZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdDaGVja291dCBkYXRhIG11c3QgYmUgYWZ0ZXIgdGhlIGNoZWNraW4gZGF0ZSdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjdWxhdGluZyBPY2N1cGFuY3lcclxuICAgIGNvbnN0IG9jY3VwYW5jeSA9IHRoaXMubm9fb2Zfb2NjdXBhbnRzIC8gdGhpcy5ub19vZl9yb29tcztcclxuICAgIGlmICghKG9jY3VwYW5jeSA9PT0gMSB8fCBvY2N1cGFuY3kgPT09IDIpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgJ09jY3VwYW50cyBwZXIgcm9vbSBtdXN0IGJlIDEgb3IgMiwgaWYgeW91IGhhdmUgYW4gb2RkIG51bWJlciBvZiB0cmF2ZWxsZXJzIChncmVhdGVyIHRoYW4gb25lKSwgdGhlIG5vIG9mIHJvb21zIG11c3QgYmUgZXF1YWwnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2codGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gICAgdGhpcy5pc1ZhbGlkLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID09PSAwKTtcclxuICAgIHRoaXMubWVzc2FnZXMubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgfVxyXG5cclxuICBzdGFydFNlYXJjaCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFtdKTtcclxuICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5yZXNldCgpO1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbFVzZXJTZWFyY2ggPSBPYmplY3QuZnJlZXplKFxyXG4gICAgICAgIHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLnRlbXBQYXJhbXMpXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIGJ1aWxkIHRoZSBxdWVyeVxyXG4gICAgICB0aGlzLmJ1aWxkUXVlcnkoKTtcclxuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zYXZlUmVjZW50U2VhcmNoKFxyXG4gICAgICAgIHRoaXMuZ2V0UmVjZW50U2VhcmNoUXVlcnkodGhpcy5nZXRTZWFyY2hRdWVyeSgpKVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWFyY2goXHJcbiAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID09PSBMb2NhdGlvblR5cGVzLlNob3J0bGlzdFxyXG4gICAgICAgICAgPyB0aGlzLnF1aWNrTGlzdEZldGNoZXIuZmV0Y2hMaXN0KHsgY291bnRyeUNvZGU6IHRoaXMuY291bnRyeS5jQ29kZSB9KVxyXG4gICAgICAgICAgOiB0aGlzLmhvdGVsRmV0Y2hlci5mZXRjaExpc3QocXVlcnkpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaEhvdGVsc1F1ZXJ5VmFyaWFibGVzXHJcbiAgKTogU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHJlY2VudFNlYXJjaFF1ZXJ5ID0gdGhpcy51cGRhdGVTZXJjaFF1ZXJ5KHF1ZXJ5KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuSG90ZWwsXHJcbiAgICAgIHNlYXJjaEFyZ3M6IHJlY2VudFNlYXJjaFF1ZXJ5LFxyXG4gICAgICB0cmF2ZWxEYXRlOiB0aGlzLmNoZWNraW5fZGF0ZS5mb3JtYXQoKSxcclxuICAgICAgdHJhdmVsbGVyczogdGhpcy5oZWxwZXJzLmdldFRyYXZlbGxlcnNJZCh0aGlzLnRyYXZlbGxlcnMpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTZXJjaFF1ZXJ5KHF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyk6IEhvdGVsUmVjZW50U2VhcmNoQXJnc3tcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5OiBIb3RlbFJlY2VudFNlYXJjaEFyZ3MgPSBxdWVyeTtcclxuICAgIHNlYXJjaFF1ZXJ5LmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gdGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdDtcclxuICAgIGlmICh0aGlzLmxvY2F0aW9uPy5uYW1lKSB7XHJcbiAgICAgIHNlYXJjaFF1ZXJ5LmNpdHlOYW1lID0gdGhpcy5sb2NhdGlvbi5uYW1lO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoKHNlYXJjaFF1ZXJ5LmxvY2F0aW9uX3R5cGVfc2VsZWN0KXtcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTpcclxuICAgICAgICBzZWFyY2hRdWVyeS5vZmZpY2VOYW1lID0gdGhpcy5vZmZpY2UubmFtZTtcclxuICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb246XHJcbiAgICAgICAgc2VhcmNoUXVlcnkudHJhaW5zU3RhdGlvbkRldGFpbCA9IHRoaXMudHJhaW5zU3RhdGlvblxyXG4gICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkFpcnBvcnQ6XHJcbiAgICAgICAgc2VhcmNoUXVlcnkuYWlycG9ydERldGFpbCA9IHRoaXMubG9jYXRpb24uYWlycG9ydDtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0UmVjZW50U2VhcmNoKHJlY2VudFNlYXJjaDogUmVjZW50U2VhcmNoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvY2F0aW9uX3R5cGVfc2VsZWN0ID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9jYXRpb25fdHlwZV9zZWxlY3Q7XHJcbiAgICB0aGlzLmN1cnJlbmN5ID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY3VycmVuY3k7XHJcbiAgICB0aGlzLmRpc3RhbmNlID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZGlzdGFuY2U7XHJcbiAgICB0aGlzLm5vX29mX3Jvb21zID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mucm9vbXM7XHJcbiAgICB0aGlzLmNoZWNraW5fZGF0ZSA9IG1vbWVudChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5zdGFydERhdGUpO1xyXG4gICAgdGhpcy5jaGVja291dF9kYXRlID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmVuZERhdGUpO1xyXG4gICAgdGhpcy5ob3RlbF9uYW1lID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuaG90ZWxOYW1lO1xyXG5cclxuICAgIGlmIChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5ncm91cE5hbWUpIHtcclxuICAgICAgdGhpcy5ob3RlbF9jaGFpbiA9IHtcclxuICAgICAgICBuYW1lOiByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5ncm91cE5hbWVcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgbG9jYXRpb25fdHlwZV9zZWxlY3RcclxuICAgIHN3aXRjaCAodGhpcy5sb2NhdGlvbl90eXBlX3NlbGVjdCkge1xyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuQWlycG9ydDpcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgICAgIC5nZXRBaXJwb3J0QnlDb2RlKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmlhdGEpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChpYXRhOiBBaXJwb3J0U2VhcmNoUmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhaXJwb3J0ID0ge1xyXG4gICAgICAgICAgICAgIGFpcnBvcnQ6IHtcclxuICAgICAgICAgICAgICAgIGdhdGV3YXk6IGlhdGEuaWF0YU1hdGNoLmlhdGFcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMubG9jYXRpb24gPSB7IC4uLmFpcnBvcnQsIC4uLmlhdGEuaWF0YU1hdGNoIH07XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLkNpdHk6XHJcbiAgICAgICAgdGhpcy5jb3VudHJ5ID0ge1xyXG4gICAgICAgICAgY0NvZGU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgY05hbWU6ICcnXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBzaG91bGQgYmUgb25lIHNlYXJjaCBtZXRvZCBmb3IgdGhlIGNpdHkgc2VhcmNoOiBsb2NhdGlvbiBvciBwb3N0Y29kZVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxhdGl0dWRlICYmXHJcbiAgICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sb25naXR1ZGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMubG9jYXRpb24gPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmNpdHlOYW1lLFxyXG4gICAgICAgICAgICBsYXRpdHVkZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubGF0aXR1ZGUsXHJcbiAgICAgICAgICAgIGxvbmdpdHVkZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9uZ2l0dWRlXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucG9zdE9yWmlwQ29kZSkge1xyXG4gICAgICAgICAgdGhpcy5wb3N0Y29kZSA9IHtcclxuICAgICAgICAgICAgbmFtZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucG9zdE9yWmlwQ29kZSxcclxuICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5Qb3N0Y29kZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLk9mZmljZTpcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgICAgIC5nZXRPZmZpY2UocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub2ZmaWNlSWQpXHJcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgob2ZmaWNlOiBDb25mZXJtYU9mZmljZUluZm8pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vZmZpY2UgPSB7XHJcbiAgICAgICAgICAgICAgaWQ6IG9mZmljZS5pZCxcclxuICAgICAgICAgICAgICBuYW1lOiBvZmZpY2UubmFtZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb246XHJcbiAgICAgICAgdGhpcy5nZXRSYWlsU3RhdGlvbkJ5Q29kZShcclxuICAgICAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRyYWluU3RhdGlvbkNvZGVcclxuICAgICAgICApLnN1YnNjcmliZSgodHJhaW5zU3RhdGlvbjogUmFpbFN0YXRpb24pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhaW5zU3RhdGlvbiA9IHRyYWluc1N0YXRpb24gYXMgTG9jYXRpb25EZXRhaWxzO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlNob3J0bGlzdDpcclxuICAgICAgICB0aGlzLmNvdW50cnkgPSB7XHJcbiAgICAgICAgICBjQ29kZTogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY291bnRyeUNvZGUsXHJcbiAgICAgICAgICBjTmFtZTogJydcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJhaWxTdGF0aW9uQnlDb2RlKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8UmFpbFN0YXRpb24+IHtcclxuICAgIGlmIChjb2RlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFJhaWxTdGF0aW9uRmV0Y2hlclxyXG4gICAgICAgIC5mZXRjaExpc3QoeyBpZDogbnVsbCwgY29kZSB9KVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hRdWVyeShvZ1NlYXJjaCA9IGZhbHNlKTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMge1xyXG4gICAgdGhpcy5idWlsZFF1ZXJ5KG9nU2VhcmNoKTtcclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHM8U2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXM+KHRoaXMucXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgYnVpbGRRdWVyeShvZ1NlYXJjaCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBjb25zdCB0ZW1wUGFyYW1zID0gb2dTZWFyY2ggPyB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaCA6IHRoaXMudGVtcFBhcmFtcztcclxuXHJcbiAgICBjb25zdCBxdWVyeTogU2VhcmNoSG90ZWxzUXVlcnlWYXJpYWJsZXMgPSB7XHJcbiAgICAgIHN0YXJ0RGF0ZTogdGVtcFBhcmFtcy5jaGVja2luX2RhdGUuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIGVuZERhdGU6IHRlbXBQYXJhbXMuY2hlY2tvdXRfZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgcm9vbXM6IHRlbXBQYXJhbXMubm9fb2Zfcm9vbXMsXHJcbiAgICAgIGFkdWx0czogdGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHMsXHJcbiAgICAgIGN1cnJlbmN5OiB0ZW1wUGFyYW1zLmN1cnJlbmN5ID8gdGVtcFBhcmFtcy5jdXJyZW5jeSA6IG51bGwsXHJcbiAgICAgIGRpc3RhbmNlOiB0ZW1wUGFyYW1zLmRpc3RhbmNlLFxyXG4gICAgICBkaXN0YW5jZVR5cGU6IERpc3RhbmNlVHlwZXMuTSxcclxuICAgICAgbWF4UmVzdWx0czogMTAwXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ2V0Um9vbU51bWJlcigpO1xyXG4gICAgc3dpdGNoICh0ZW1wUGFyYW1zLmxvY2F0aW9uX3R5cGVfc2VsZWN0KSB7XHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5BaXJwb3J0OlxyXG4gICAgICAgIHF1ZXJ5LmlhdGEgPSB0ZW1wUGFyYW1zLmxvY2F0aW9uLmFpcnBvcnQuZ2F0ZXdheTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5DaXR5OlxyXG4gICAgICAgIHF1ZXJ5LmNvdW50cnlDb2RlID0gdGVtcFBhcmFtcy5jb3VudHJ5LmNDb2RlO1xyXG4gICAgICAgIC8vIHNob3VsZCBiZSBvbmUgc2VhcmNoIG1ldG9kIGZvciB0aGUgY2l0eSBzZWFyY2g6IGxvY2F0aW9uIG9yIHBvc3Rjb2RlXHJcbiAgICAgICAgaWYgKHRoaXMubG9jYXRpb24pIHtcclxuICAgICAgICAgIHF1ZXJ5LmxhdGl0dWRlID0gdGVtcFBhcmFtcy5sb2NhdGlvbi5sYXRpdHVkZTtcclxuICAgICAgICAgIHF1ZXJ5LmxvbmdpdHVkZSA9IHRlbXBQYXJhbXMubG9jYXRpb24ubG9uZ2l0dWRlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGVtcFBhcmFtcy5wb3N0Y29kZSkge1xyXG4gICAgICAgICAgcXVlcnkucG9zdE9yWmlwQ29kZSA9IHRlbXBQYXJhbXMucG9zdGNvZGUubmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuVHJhaW5TdGF0aW9uOlxyXG4gICAgICAgIGlmICh0ZW1wUGFyYW1zLmxvY2F0aW9uPy5yYWlsc3RhdGlvbj8uc3RhdGlvbkNvZGUpIHtcclxuICAgICAgICAgIHF1ZXJ5LnRyYWluU3RhdGlvbkNvZGUgPSB0ZW1wUGFyYW1zLmxvY2F0aW9uLnJhaWxzdGF0aW9uLnN0YXRpb25Db2RlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGVtcFBhcmFtcy50cmFpbnNTdGF0aW9uPy5zdGF0aW9uQ29kZSkge1xyXG4gICAgICAgICAgcXVlcnkudHJhaW5TdGF0aW9uQ29kZSA9IHRlbXBQYXJhbXMudHJhaW5zU3RhdGlvbi5zdGF0aW9uQ29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIExvY2F0aW9uVHlwZXMuT2ZmaWNlOiAvLyBOZWVkcyB0byBmaXggaW4gbmV4dCBQUlxyXG4gICAgICAgIGlmICh0ZW1wUGFyYW1zLmxvY2F0aW9uPy5pZCkge1xyXG4gICAgICAgICAgcXVlcnkub2ZmaWNlSWQgPSArdGVtcFBhcmFtcy5sb2NhdGlvbi5pZDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRlbXBQYXJhbXMub2ZmaWNlPy5pZCkge1xyXG4gICAgICAgICAgcXVlcnkub2ZmaWNlSWQgPSArdGVtcFBhcmFtcy5vZmZpY2UuaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBMb2NhdGlvblR5cGVzLlNob3J0bGlzdDpcclxuICAgICAgICBxdWVyeS5jb3VudHJ5Q29kZSA9IHRlbXBQYXJhbXMuY291bnRyeS5jQ29kZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTG9jYXRpb25UeXBlcy5Qb3N0Y29kZTpcclxuICAgICAgICBxdWVyeS5jb3VudHJ5Q29kZSA9IHRlbXBQYXJhbXMuY291bnRyeS5jQ29kZTtcclxuICAgICAgICBxdWVyeS5wb3N0T3JaaXBDb2RlID0gdGVtcFBhcmFtcy5sb2NhdGlvbi5uYW1lO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCBob3RlbCBuYW1lIGluIHRoZSBxdWVyeVxyXG4gICAgaWYgKHRlbXBQYXJhbXMuaG90ZWxfbmFtZSkge1xyXG4gICAgICBxdWVyeS5ob3RlbE5hbWUgPSB0ZW1wUGFyYW1zLmhvdGVsX25hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWRkIGNoYWluIG9yIGdyb3VwIG5hbWUgaW50IGhlIHF1ZXJ5XHJcbiAgICBpZiAodGVtcFBhcmFtcy5ob3RlbF9jaGFpbikge1xyXG4gICAgICBxdWVyeS5ncm91cE5hbWUgPSB0ZW1wUGFyYW1zLmhvdGVsX2NoYWluPy5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcclxuICB9XHJcblxyXG4gIG1ha2VIb3RlbEF2YWxpbGl0eU9iamVjdChob3RlbDogSG90ZWxRdW90ZVJlc3VsdCk6IEF2YWlsYWJpbGl0eU9iamVjdCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBob3RlbDogaG90ZWwuaWQsXHJcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGUodGhpcy5jaGVja2luX2RhdGUpLFxyXG4gICAgICBlbmREYXRlOiB0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZSh0aGlzLmNoZWNrb3V0X2RhdGUpLFxyXG4gICAgICByb29tczogdGhpcy5ub19vZl9yb29tcyxcclxuICAgICAgb2NjdXBhbnRzOiB0aGlzLm5vX29mX29jY3VwYW50cyxcclxuICAgICAgY3VycmVuY3k6ICdHQlAnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRlclJlc3VsdHMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChcclxuICAgICAgdGhpcy5mdWxsUmVzdWx0cy5maWx0ZXIoKGhvdGVsOiBIb3RlbERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgdGhpcy5pblByaWNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmluRGlzdGFuY2VSYW5nZShob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuY29udGFpbnNIb3RlbG5hbWUoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmhhc0NoYWluKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5icmVha2Zhc3RUeXBlRmlsdGVyKGhvdGVsKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8vIExpZ2h0ZW5pbmcgRmlsdGVyc1xyXG4gIHB1YmxpYyBmaWx0ZXJMaWdodGVuaW5nUmVzdWx0cyA9ICgpID0+IHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFxyXG4gICAgICB0aGlzLmZ1bGxSZXN1bHRzLmZpbHRlcigoaG90ZWw6IEhvdGVsRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICB0aGlzLmluTGlnaHRlbmluZ1ByaWNlUmFuZ2UoaG90ZWwpICYmXHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5zSG90ZWxuYW1lKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5oYXNDaGFpbihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuaGFzUHJlZmVycmVkKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5icmVha2Zhc3RUeXBlRmlsdGVyKGhvdGVsKSAmJlxyXG4gICAgICAgICAgdGhpcy5nZXRFeHRyYUZpbHRlcihob3RlbCkgJiZcclxuICAgICAgICAgIHRoaXMuZ2V0QW1lbml0aWVzRmlsdGVyKGhvdGVsKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyByZXN1bHRzSGF2ZVRhZyhzZWFyY2hUYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdHNDb250YWluVGFnOiBib29sZWFuO1xyXG4gICAgbGV0IGZpbHRlcmVkUmVzdWx0cyA9IHRoaXMuZnVsbFJlc3VsdHMuZmlsdGVyKChob3RlbDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZFRhZ3M6IGFueSA9IGhvdGVsLnRhZ3MuZmlsdGVyKCh0YWc6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMuY29udmVydFRvT25lU3RyaW5nKHRhZy5uYW1lKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXModGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcoc2VhcmNoVGFnKS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgY29udGFpbnNTZWFyY2hUYWcgPVxyXG4gICAgICAgIGZpbHRlcmVkVGFncyAmJiBmaWx0ZXJlZFRhZ3MubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coYEhvdGVsICR7aG90ZWwubmFtZX0gd2l0aCBmaWx0ZXIgYXBwbGllZGAsIGhvdGVsPy50YWdzLCBpc1RydWUpO1xyXG4gICAgICByZXR1cm4gY29udGFpbnNTZWFyY2hUYWc7XHJcbiAgICB9KTtcclxuICAgIHJlc3VsdHNDb250YWluVGFnID1cclxuICAgICAgZmlsdGVyZWRSZXN1bHRzICYmIGZpbHRlcmVkUmVzdWx0cy5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgcmV0dXJuIHJlc3VsdHNDb250YWluVGFnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpblByaWNlUmFuZ2UoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYXZhaWxhYmlsaXR5ID0gdGhpcy5hdmFsaWFiaWxpdHlTZXJ2aWNlLmdldEF2YWlsYWJpbGl0eVZhbHVlKGhvdGVsKTtcclxuICAgIGlmIChhdmFpbGFiaWxpdHkpIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLmhlbHBlcnMuaW5SYW5nZShhdmFpbGFiaWxpdHkubWF4cHJpY2UsIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlKSAmJlxyXG4gICAgICAgIHRoaXMuaGVscGVycy5pblJhbmdlKGF2YWlsYWJpbGl0eS5taW5wcmljZSwgdGhpcy5maWx0ZXJzLnByaWNlUmFuZ2UpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbkRpc3RhbmNlUmFuZ2UoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5maWx0ZXJzLmRpc3RhbmNlUmFuZ2UubWF4ID09PSAwIHx8XHJcbiAgICAgIHRoaXMuaGVscGVycy5pblJhbmdlKGhvdGVsLmxvY2F0aW9uLmRpc3RhbmNlLCB0aGlzLmZpbHRlcnMuZGlzdGFuY2VSYW5nZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnRhaW5zSG90ZWxuYW1lKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRvY2hlY2sgPSB0aGlzLmZpbHRlcnMuaG90ZWxOYW1lLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRvY2hlY2sgJiYgdG9jaGVjay5sZW5ndGggPiAwXHJcbiAgICAgID8gaG90ZWwubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRvY2hlY2spXHJcbiAgICAgIDogdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5MaWdodGVuaW5nUHJpY2VSYW5nZShob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhdmFpbGFiaWxpdHkgPSB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoaG90ZWwpO1xyXG4gICAgaWYgKGF2YWlsYWJpbGl0eSAmJiBPYmplY3Qua2V5cyhhdmFpbGFiaWxpdHkpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBsZXQgbWF4UmFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgbGV0IGZpbmRNYXg6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBtaW5SYW5nZSA9IHRoaXMuaGVscGVycy5pblJhbmdlKFxyXG4gICAgICAgIGF2YWlsYWJpbGl0eS5wcnBuLFxyXG4gICAgICAgIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChhdmFpbGFiaWxpdHk/Lm1heHByaWNlKSB7XHJcbiAgICAgICAgZmluZE1heCA9IGF2YWlsYWJpbGl0eS5tYXhwcmljZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmaW5kTWF4ID0gYXZhaWxhYmlsaXR5Py5yb29tcy5yZWR1Y2UoXHJcbiAgICAgICAgICAob3AsIGl0ZW0pID0+IChvcCA9IG9wID4gaXRlbS50b3RhbCA/IG9wIDogaXRlbS50b3RhbCksXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBtYXhSYW5nZSA9IHRoaXMuaGVscGVycy5pblJhbmdlKGZpbmRNYXgsIHRoaXMuZmlsdGVycy5wcmljZVJhbmdlKTtcclxuICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IG1pblJhbmdlICYmIG1heFJhbmdlO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0NoYWluKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRvY2hlY2sgPSAodGhpcy5maWx0ZXJzLmNoYWluIHx8IFtdKS5tYXAoKGNoYWluOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gICAgICByZXR1cm4gY2hhaW4udG9Mb3dlckNhc2UoKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRvY2hlY2sgJiYgdG9jaGVjay5sZW5ndGhcclxuICAgICAgPyAhIXRvY2hlY2suZmluZCgoY2hhaW46IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGhvdGVsLmdyb3VwLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY2hhaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIDogdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnJlYWtmYXN0VHlwZUZpbHRlcihob3RlbDogSG90ZWxEZXRhaWxzKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVycy5icmVha2Zhc3RUeXBlLmxlbmd0aCkgcmV0dXJuIHRydWU7XHJcbiAgICBjb25zdCBob3RlbE9iamVjdCA9IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlGb3JJZChcclxuICAgICAgdGhpcy5tYWtlSG90ZWxBdmFsaWxpdHlPYmplY3QoaG90ZWwpLFxyXG4gICAgICBob3RlbFxyXG4gICAgKTtcclxuICAgIGlmICghaG90ZWxPYmplY3QgJiYgIWhvdGVsT2JqZWN0LnZhbHVlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBob3RlbE9iamVjdFZhbHVlOiBIb3RlbEF2YWxpYmlsaXR5UXVvdGVSZXN1bHQgPSBob3RlbE9iamVjdC52YWx1ZTtcclxuICAgIGNvbnN0IGlzQnJlYWtmYXN0SW5jbHVkZWQgPSB0aGlzLmZpbHRlcnMuYnJlYWtmYXN0VHlwZS5pbmNsdWRlcyhcclxuICAgICAgU2VhcmNoSGFuZGxlci5CUkVBS0ZBU1RfSU5DTFVERURcclxuICAgICk7XHJcbiAgICBjb25zdCBpc0JyZWFrZmFzdEV4Y2x1ZGVkID0gdGhpcy5maWx0ZXJzLmJyZWFrZmFzdFR5cGUuaW5jbHVkZXMoXHJcbiAgICAgIFNlYXJjaEhhbmRsZXIuQlJFQUtGQVNUX05PVF9JTkNMVURFRFxyXG4gICAgKTtcclxuICAgIGlmIChob3RlbE9iamVjdFZhbHVlPy5yb29tcykge1xyXG4gICAgICBjb25zdCBicmVha2Zhc3RNYXRjaGVzID0gaG90ZWxPYmplY3RWYWx1ZS5yb29tcy5maWx0ZXIoKHJvb21zOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoaXNCcmVha2Zhc3RJbmNsdWRlZCAmJiBpc0JyZWFrZmFzdEV4Y2x1ZGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gcm9vbXM7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0JyZWFrZmFzdEluY2x1ZGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICByb29tcy5yYXRlRGVzY3JpcHRpb24ubWF0Y2goaW5jbHVkZWRFeHByZXNzaW9uKSAmJlxyXG4gICAgICAgICAgICAhcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGV4Y2x1ZGVkRXhwcmVzc2lvbilcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0JyZWFrZmFzdEV4Y2x1ZGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAhcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGluY2x1ZGVkRXhwcmVzc2lvbikgfHxcclxuICAgICAgICAgICAgcm9vbXMucmF0ZURlc2NyaXB0aW9uLm1hdGNoKGV4Y2x1ZGVkRXhwcmVzc2lvbilcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuICEhYnJlYWtmYXN0TWF0Y2hlcy5sZW5ndGg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBieU1vc3RFeHBlbnNpdmUoKSB7XHJcbiAgICB0aGlzLnNvcnRCeVByaWNlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbWluXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBkZWJ1ZyBzZXQgdGhpcyB0byB0cnVlIHRvIG91dHB1dCBjb25zb2xlIGxvZ3NcclxuICAgKiBAZGVzY3JpcHRpb24gc29ydHMgcmVzdWx0cyBieSBwcmljZSBhY2NvcmRpbmcgdG8gdGhlICdtaW4nIHBhcmFtYXRlci4gbWluID0gdHJ1ZSAobG93ZXN0IHByaWNlIGZpcnN0KSwgbWluID0gZmFsc2UgKGhpZ2hlc3QgcHJpY2UgZmlyc3QpXHJcbiAgICogSW4gc3VtbWFyeSwgdGhpcyBtZXRob2QgY3JlYXRlcyBhIHNvcnRlZCBhcnJheSBvZiBob3RlbHMgd2l0aCBwcmljZXMgYW5kIGFuIGFycmF5IG9mIGhvdGVscyBXSVRIT1VUIHByaWNlcyxcclxuICAgKiB0aGVuIGZpbmFsbHkgam9pbnMgdGhlc2UgMiB0ZW1wb3JhcnkgYXJyYXlzIHRvZ2V0aGVyIGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBuZXh0IG9ic2VydmFibGUuXHJcbiAgICovXHJcblxyXG4gIHNvcnRCeVByaWNlKG1pbiA9IHRydWUsIGRlYnVnID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIC8vIHN0b3JlIGFsbCByZXN1bHRzXHJcbiAgICBjb25zdCBob3RlbHM6IEhvdGVsRGV0YWlsc0FycmF5ID0gdGhpcy5mdWxsUmVzdWx0cztcclxuXHJcbiAgICAvLyBnZXQgaG90ZWxzIHdpdGggYW5kIHdpdGhvdXQgcHJpY2VzXHJcbiAgICBjb25zdCBob3RlbHNXaXRoUHJpY2VzOiBIb3RlbERldGFpbHNBcnJheSA9IFtdO1xyXG4gICAgY29uc3QgaG90ZWxzV2l0aG91dFByaWNlczogSG90ZWxEZXRhaWxzQXJyYXkgPSBbXTtcclxuICAgIGhvdGVscy5tYXAoKGhvdGVsUmVzdWx0KSA9PiB7XHJcbiAgICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShob3RlbFJlc3VsdCk/LnBycG5cclxuICAgICAgICA/IGhvdGVsc1dpdGhQcmljZXMucHVzaChob3RlbFJlc3VsdClcclxuICAgICAgICA6IGhvdGVsc1dpdGhvdXRQcmljZXMucHVzaChob3RlbFJlc3VsdCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzb3J0IGhvdGVscyB3aXRoIHByaWNlcyBhY2NvcmRpbmcgdG8gdGhlICdtaW4nIHBhcmFtZXRlciBmb3IgdGhlIG9yZGVyXHJcbiAgICBob3RlbHNXaXRoUHJpY2VzLnNvcnQoKGZpcnN0OiBIb3RlbERldGFpbHMsIHNlY29uZDogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpcnN0UHJpY2UgPVxyXG4gICAgICAgIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5nZXRBdmFpbGFiaWxpdHlWYWx1ZShmaXJzdCk/LnBycG47XHJcbiAgICAgIGNvbnN0IHNlY29uZFByaWNlID1cclxuICAgICAgICB0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuZ2V0QXZhaWxhYmlsaXR5VmFsdWUoc2Vjb25kKT8ucHJwbjtcclxuICAgICAgcmV0dXJuIG1pblxyXG4gICAgICAgID8gZmlyc3RQcmljZSA+IHNlY29uZFByaWNlXHJcbiAgICAgICAgICA/IDFcclxuICAgICAgICAgIDogc2Vjb25kUHJpY2UgPiBmaXJzdFByaWNlXHJcbiAgICAgICAgICA/IC0xXHJcbiAgICAgICAgICA6IDBcclxuICAgICAgICA6IGZpcnN0UHJpY2UgPCBzZWNvbmRQcmljZVxyXG4gICAgICAgID8gMVxyXG4gICAgICAgIDogc2Vjb25kUHJpY2UgPCBmaXJzdFByaWNlXHJcbiAgICAgICAgPyAtMVxyXG4gICAgICAgIDogMDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGpvaW4gaG90ZWxzIHdpdGggcHJpY2VzIHRvIGhvdGVscyBXSVRIT1VUIHByaWNlc1xyXG4gICAgY29uc3Qgc29ydGVkSG90ZWxzID0gWy4uLmhvdGVsc1dpdGhQcmljZXMsIC4uLmhvdGVsc1dpdGhvdXRQcmljZXNdO1xyXG5cclxuICAgIC8vIHRyaWdnZXIgbmV4dCBvYnNlcnZhYmxlXHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChzb3J0ZWRIb3RlbHMpO1xyXG5cclxuICAgIC8vIGRpc3BsYXkgY29uc29sZSBsb2dzIGlmIGRlYnVnIGlzIHRydWUgKGNvdWxkIHByb3ZlIHVzZWZ1bCBpbiBmdXR1cmUpXHJcbiAgICBpZiAoZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJysrIHNvcnRCeVByaWNlKCkgY2FsbGVkICsrJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBob3RlbCArKycsIGhvdGVscyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBob3RlbHNXaXRoUHJpY2VzICsrJywgaG90ZWxzV2l0aFByaWNlcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBob3RlbHNXaXRob3V0UHJpY2VzICsrJywgaG90ZWxzV2l0aG91dFByaWNlcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcrKyBzb3J0ZWRIb3RlbHMgKysnLCBzb3J0ZWRIb3RlbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc29ydEJ5TmFtZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFxyXG4gICAgICB0aGlzLmhlbHBlcnNcclxuICAgICAgICAuY2xvbmUodGhpcy5mdWxsUmVzdWx0cylcclxuICAgICAgICAuc29ydCgoZnN0OiBIb3RlbERldGFpbHMsIHNuZDogSG90ZWxEZXRhaWxzKTogbnVtYmVyID0+IHtcclxuICAgICAgICAgIHJldHVybiBmc3QubmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoc25kLm5hbWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzb3J0QnlEaXN0YW5jZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFxyXG4gICAgICB0aGlzLmhlbHBlcnMuY2xvbmUodGhpcy5mdWxsUmVzdWx0cykuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIoYS5sb2NhdGlvbi5kaXN0YW5jZSkgLSBOdW1iZXIoYi5sb2NhdGlvbi5kaXN0YW5jZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYnlQcmVmZXJyZWQoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IHRoaXMucmVzdWx0cy52YWx1ZSB8fCBbXTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNvcnQoKGE6IEhvdGVsRGV0YWlscywgYjogSG90ZWxEZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlZmVycmVkVG9JbnQoYikgLSB0aGlzLnByZWZlcnJlZFRvSW50KGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJysrKyBFcnJvciBzb3J0aW5nIGJ5IHByZWZlcnJlZDogJywgZXJyb3IsICcgKysrJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZWZlcnJlZFRvSW50KGhvdGVsOiBIb3RlbERldGFpbHMpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgKGhvdGVsLnByZWZlcnJlZC5jbGllbnQgPyBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFIDogMCkgK1xyXG4gICAgICAoaG90ZWwucHJlZmVycmVkLmNvbnN1bWVyID8gQUdFTlRfUFJFRkVSUkVEX1ZBTFVFIDogMClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludFRvUHJlZmVycmVkKHByZWZlcnJlZDogMCB8IDEgfCAyIHwgMykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXHJcbiAgICAgIGNsaWVudDogKHByZWZlcnJlZCAmIENMSUVOVF9QUkVGRVJSRURfVkFMVUUpID09PSBDTElFTlRfUFJFRkVSUkVEX1ZBTFVFLFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWJpdHdpc2VcclxuICAgICAgY29uc3VtZXI6IChwcmVmZXJyZWQgJiBBR0VOVF9QUkVGRVJSRURfVkFMVUUpID09PSBBR0VOVF9QUkVGRVJSRURfVkFMVUVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhZGRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcsIHR5cGU6IGtleW9mIEhvdGVsRmlsdGVycyk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsdDogYW55ID0gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgICBmaWx0W3R5cGVdLnB1c2goZmlsdGVyKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZpbHRlcihmaWx0ZXI6IHN0cmluZywgdHlwZToga2V5b2YgSG90ZWxGaWx0ZXJzKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWx0ID0gdGhpcy5sb2NhbEZpbHRlcnM7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0W3R5cGVdKSkge1xyXG4gICAgICAoZmlsdFt0eXBlXSBhcyBzdHJpbmdbXSkgPSAoZmlsdFt0eXBlXSBhcyBzdHJpbmdbXSkuZmlsdGVyKFxyXG4gICAgICAgIChjaGFpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZmlsdGVyICE9PSBjaGFpbjtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvY2FsRmlsdGVycy5jaGFpbiA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuYW1lbml0eXR5cGUgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLnByZWZlcnJlZCA9IFtdO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuZXh0cmEgPSBbXTtcclxuICAgIHRoaXMubG9jYWxGaWx0ZXJzLmhvdGVsTmFtZSA9ICcnO1xyXG4gICAgdGhpcy5sb2NhbEZpbHRlcnMuYnJlYWtmYXN0VHlwZSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRnJvbVByZXZpb3VzU2VhcmNoZXMoXHJcbiAgICBwcmV2aW91c0l0ZW1zOiBSZWNvcmQ8U2VydmljZVR5cGUsIEJhc2tldEl0ZW0+XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBmbGlnaHRJdGVtOiBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyA9XHJcbiAgICAgIHByZXZpb3VzSXRlbXNbU2VydmljZVR5cGUuRmxpZ2h0XT8uc2VhcmNoUXVlcnk7XHJcbiAgICBpZiAoZmxpZ2h0SXRlbSkge1xyXG4gICAgICAvLyBUT0RPIGZsaWdodHMgaGF2ZW4ndCBiZWVuIGRvbmUgeWV0LlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNQcmVmZXJyZWQoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcHJlZmVycmVkRmlsdGVycyA9IHRoaXMuZmlsdGVycy5wcmVmZXJyZWQ7XHJcblxyXG4gICAgLy8gRW1wdHkgcHJlZmVycmVkIGZpbHRlcnMgT1IgXCJBbnlcIlxyXG4gICAgaWYgKFxyXG4gICAgICAhcHJlZmVycmVkRmlsdGVycy5sZW5ndGggfHxcclxuICAgICAgcHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkFOWSlcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZ2VuY3kgKGNvbnN1bWVyKSAmJiBDbGllbnRcclxuICAgIGlmIChcclxuICAgICAgcHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkFHRU5DWSkgJiZcclxuICAgICAgcHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkNMSUVOVClcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGhvdGVsLnByZWZlcnJlZC5jb25zdW1lciA9PT0gdHJ1ZSAmJiBob3RlbC5wcmVmZXJyZWQuY2xpZW50ID09PSB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWdlbmN5XHJcbiAgICBpZiAocHJlZmVycmVkRmlsdGVycy5pbmNsdWRlcyhTZWFyY2hIYW5kbGVyLkFHRU5DWSkpIHtcclxuICAgICAgcmV0dXJuIGhvdGVsLnByZWZlcnJlZC5jb25zdW1lciA9PT0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDbGllbnRcclxuICAgIGlmIChwcmVmZXJyZWRGaWx0ZXJzLmluY2x1ZGVzKFNlYXJjaEhhbmRsZXIuQ0xJRU5UKSkge1xyXG4gICAgICByZXR1cm4gaG90ZWwucHJlZmVycmVkLmNsaWVudCA9PT0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRtYXhQcmljZUZvckN1cnJlbmN5KGN1cnJlbmN5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5tYXhQcmljZUZvckN1cnJlbmN5KGN1cnJlbmN5KTtcclxuICB9XHJcblxyXG4gIC8vIExpZ2h0ZW5pbmcgRXh0cmEgRmlsdGVyc1xyXG4gIHByaXZhdGUgZ2V0RXh0cmFGaWx0ZXIoaG90ZWw6IEhvdGVsRGV0YWlscyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY2hlY2tBdmFpbGFiaWxpdHkgPSB0aGlzLmZpbHRlcnMuZXh0cmEuaW5jbHVkZXMoXHJcbiAgICAgIFNlYXJjaEhhbmRsZXIuQVZBSUxBQklMSVRZXHJcbiAgICApO1xyXG4gICAgaWYgKGNoZWNrQXZhaWxhYmlsaXR5KSB7XHJcbiAgICAgIHJldHVybiBob3RlbC51bmF2YWlsYWJsZSA9PT0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjaGVja0ZlbWFsZUZyaWVuZGx5ID0gdGhpcy5maWx0ZXJzLmV4dHJhLmluY2x1ZGVzKFxyXG4gICAgICBTZWFyY2hIYW5kbGVyLkZFTUFMRV9GUklFTkRMWVxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja0ZlbWFsZUZyaWVuZGx5KSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgaG90ZWwudGFncy5maWx0ZXIoKHRhZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHRhZy5uYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnZlcnRUb09uZVN0cmluZyh0YWcubmFtZSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5hbWUuaW5jbHVkZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcoXHJcbiAgICAgICAgICAgICAgICBTZWFyY2hIYW5kbGVyLkZFTUFMRV9GUklFTkRMWVxyXG4gICAgICAgICAgICAgICkudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkubGVuZ3RoID4gMFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyBMaWdodGVuaW5nIEFtZXJuaXRpZXMgRmlsdGVyc1xyXG4gIHByaXZhdGUgZ2V0QW1lbml0aWVzRmlsdGVyKGhvdGVsOiBIb3RlbERldGFpbHMpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RydWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdGhpcy5maWx0ZXJzLmFtZW5pdHl0eXBlLmZvckVhY2goKHNlYXJjaCkgPT4ge1xyXG4gICAgICBsZXQgZmlsdGVyZWRSZXN1bHRzOiBhbnkgPSBob3RlbC50YWdzLmZpbHRlcigodGFnKSA9PiB7XHJcbiAgICAgICAgaWYgKHRhZy5uYW1lKSB7XHJcbiAgICAgICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5jb252ZXJ0VG9PbmVTdHJpbmcodGFnLm5hbWUpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyh0aGlzLmNvbnZlcnRUb09uZVN0cmluZyhzZWFyY2gpLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlzVHJ1ZSA9IGZpbHRlcmVkUmVzdWx0cyAmJiBmaWx0ZXJlZFJlc3VsdHMubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coYEhvdGVsICR7aG90ZWwubmFtZX0gd2l0aCBmaWx0ZXIgYXBwbGllZGAsIGhvdGVsPy50YWdzLCBpc1RydWUpO1xyXG4gICAgICByZXR1cm4gaXNUcnVlO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gaXNUcnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb252ZXJ0VG9PbmVTdHJpbmcoaXRlbTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gaXRlbS5yZXBsYWNlKC9bXmEtekEtWl0vZywgJycpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW1hZ2VzKEhvbGlkYXlDb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XHJcbiAgICBjb25zdCB1cmwgPVxyXG4gICAgICB0aGlzLmVudmlyb25tZW50Lmhvc3RCYXNlVXJsICtcclxuICAgICAgVVJMUy5DT05GSVJNQV9QSE9UT19VUkwgK1xyXG4gICAgICBIb2xpZGF5Q29kZS5zcGxpdCgnLCcpWzBdO1xyXG4gICAgY29uc3QgaW1nUHJvdmlkZXIgPSAnaHR0cHM6Ly93d3cudmZtaWkuY29tLyc7IC8vIGltZyBwcm92aWRlciB0aGF0cyBob2xkcyBpbWFnZXMsIHVzZWQgdG8gbWF0Y2ggd2hpY2ggaW1hZ2VzIG9uIHBhZ2UgYmVsb25ncyB0byBnYWxsZXJ5LlxyXG4gICAgaWYgKHRoaXMuZ2FsbGVyaWVzW0hvbGlkYXlDb2RlXSkge1xyXG4gICAgICByZXR1cm4gb2YodGhpcy5nYWxsZXJpZXNbSG9saWRheUNvZGVdKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2FsbFNlcnZpY2UuZ2V0KHVybCBhcyBVUkxTLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pLnBpcGUoXHJcbiAgICAgIG1hcCgoaW1hZ2VzSFRNTCkgPT4ge1xyXG4gICAgICAgIGlmICghaW1hZ2VzSFRNTCkge1xyXG4gICAgICAgICAgdGhyb3cgRXJyb3IoYEdhbGxlcnkgZm9yICR7SG9saWRheUNvZGV9IGNhbiBub3QgYmUgbG9hZGVkLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGVtcC5pbm5lckhUTUwgPSBpbWFnZXNIVE1MO1xyXG4gICAgICAgIGNvbnN0IGltYWdlcyA9IEFycmF5LmZyb20odGVtcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJykpLnJlZHVjZShcclxuICAgICAgICAgIChhY2MsIGltZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaW1nLnNyYy5pbmNsdWRlcyhpbWdQcm92aWRlcikpIHtcclxuICAgICAgICAgICAgICBhY2MucHVzaChpbWcuc3JjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFtdXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoIWltYWdlcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgICAgICBgVGhlcmUgaXMgbm8gbWVkaWEgY29udGVudCBwcm92aWRlZCBmb3IgdGhpcyBob3RlbCAke0hvbGlkYXlDb2RlfWBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAodGhpcy5nYWxsZXJpZXNbSG9saWRheUNvZGVdID0gaW1hZ2VzKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhZGRQYWdpbmF0aW9uUGFnZShjdXJyZW50UGFnZTogbnVtYmVyKTogYW55IHtcclxuICAgIGNvbnN0IGtleSA9ICdQYWdpbmF0aW9uUGFnZUNvdW50JztcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oa2V5LCBjdXJyZW50UGFnZSk7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShrZXkpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlVmlldygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSBIb3RlbFZpZXcuTElTVCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gSG90ZWxWaWV3Lk1BUDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSBIb3RlbFZpZXcuTElTVDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGNEYXlEaWZmKCk6IG51bWJlciB7XHJcbiAgICBjb25zdCBjaGVja291dCA9IG1vbWVudCh0aGlzLmNoZWNrb3V0X2RhdGUpO1xyXG4gICAgY29uc3QgY2hlY2tpbiA9IG1vbWVudCh0aGlzLmNoZWNraW5fZGF0ZSk7XHJcbiAgICByZXR1cm4gY2hlY2tvdXQuc3RhcnRPZignZGF5JykuZGlmZihjaGVja2luLnN0YXJ0T2YoJ2RheScpLCAnZGF5cycpO1xyXG4gIH1cclxuICB1cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzOiBIb3RlbERldGFpbHNbXSk6IElDaGVhcGVzdFByaWNlIHtcclxuICAgIGNvbnN0IGN1cnJlbmNpZXNLZXkgPSBPYmplY3Qua2V5cyh0aGlzLmF2YWxpYWJpbGl0eVNlcnZpY2UuY3VycmVuY2llcyk7XHJcbiAgICBpZiAoKCFyZXN1bHRzLmxlbmd0aCAmJiAhY3VycmVuY2llc0tleS5sZW5ndGgpIHx8ICFjdXJyZW5jaWVzS2V5Lmxlbmd0aClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3QgY3VycmVuY2llID0gY3VycmVuY2llc0tleVswXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhbW91bnQ6IHRoaXMuYXZhbGlhYmlsaXR5U2VydmljZS5jdXJyZW5jaWVzW2N1cnJlbmNpZV0ubWlucHJpY2UsXHJcbiAgICAgIGN1cnJlbmN5Q29kZTogY3VycmVuY2llXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0Um9vbU51bWJlcigpIHtcclxuICAgIGxldCByb29tc09jY3VwYW5jeTogYW55W10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTnVtYmVyKHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyk7IGkrKykge1xyXG4gICAgICBjb25zdCBuZXdSb29tT2NjdXBhbmN5ID0ge1xyXG4gICAgICAgIEFkdWx0czogdGhpcy5jYWxjUm9vbU9jY3VwYW5jeShcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyxcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHNcclxuICAgICAgICApLFxyXG4gICAgICAgIENoaWxkcmVuOiAwLFxyXG4gICAgICAgIEluZmFudHM6IDBcclxuICAgICAgfTtcclxuICAgICAgcm9vbXNPY2N1cGFuY3kucHVzaChuZXdSb29tT2NjdXBhbmN5KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcm9vbXM6IG51bWJlcltdID0gW107XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm9vbXNPY2N1cGFuY3kubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9vbXNPY2N1cGFuY3lbaW5kZXhdLkFkdWx0czsgaisrKSB7XHJcbiAgICAgICAgcm9vbXMucHVzaChpbmRleCArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIHNob3VsZCB3ZSBhZGQgbmV3IHByb3BlcnR5IHJvb21OdW1iZXIgZm9yIHRyYXZlbGxlcj8gLS1cclxuICAgIC8vIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRyYXZlbGxlcnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAvLyAgIHRoaXMudHJhdmVsbGVyc1tpbmRleF0ucm9vbU51bWJlciA9IHJvb21zW2luZGV4XTtcclxuICAgIC8vIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlx0QGRlc2MgLSByZXR1cm4gdGhlIG9jY3VwYW5jeSBmb3IgYSByb29tIC0gbmVlZCB0byBjYWxjdWxhdGUgYmFzZWQgb24gbm8gb2Ygcm9vbXMsIG5vIG9mIHRyYXZlbGxlcnMgYW5kIGN1cnJlbnRseSBvY2N1cGllZCByb29tcztcclxuICAgKiovXHJcblxyXG4gIGNhbGNSb29tT2NjdXBhbmN5KG5vX29mX3Jvb21zOiBudW1iZXIsIHRyYXZlbGxlcnM6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgJ05vIG9mIFRyYXZlbGxlcnM6ICcgK1xyXG4gICAgICAgIHRyYXZlbGxlcnMgK1xyXG4gICAgICAgICd8IE5vIG9mIHJvb21zOiAnICtcclxuICAgICAgICBub19vZl9yb29tcyArXHJcbiAgICAgICAgJyB8IEFzc2lnbmVkOiAnICtcclxuICAgICAgICB0aGlzLm9jY3VwaWVkXHJcbiAgICApO1xyXG4gICAgbGV0IHJvb21PY2N1cGFuY3k6IG51bWJlciA9IE1hdGguY2VpbCh0cmF2ZWxsZXJzIC8gbm9fb2Zfcm9vbXMpO1xyXG5cclxuICAgIGlmICh0cmF2ZWxsZXJzIC0gdGhpcy5vY2N1cGllZCA8IHJvb21PY2N1cGFuY3kpIHtcclxuICAgICAgY29uc29sZS5sb2coJ1dlIGhhdmUgcnVuIG91dCBvZiBvY2N1cGllcnMhJyk7XHJcbiAgICAgIHJvb21PY2N1cGFuY3kgPSB0cmF2ZWxsZXJzIC0gdGhpcy5vY2N1cGllZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm9vbU9jY3VwYW5jeSA8PSAwKSB7XHJcbiAgICAgIHJvb21PY2N1cGFuY3kgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub2NjdXBpZWQgKz0gcm9vbU9jY3VwYW5jeTtcclxuICAgIHJldHVybiByb29tT2NjdXBhbmN5O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkSG90ZWxSb29tVG9CYXNrZXQoXHJcbiAgICBob3RlbDogSG90ZWxEZXRhaWxzLFxyXG4gICAgaG90ZWxSb29tOiBIb3RlbFJvb20sXHJcbiAgICBob3RlbFF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlcyxcclxuICAgIHRyYXZlbGxlcnM/OiBUcmF2ZWxsZXJbXVxyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc29sZS5sb2coaG90ZWwpO1xyXG4gICAgY29uc29sZS5sb2coaG90ZWxSb29tKTtcclxuICAgIGNvbnNvbGUubG9nKGhvdGVsUXVlcnkpO1xyXG5cclxuICAgIGlmIChob3RlbC51bmF2YWlsYWJsZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBtb2RpZnkgdGhlICdzdGFydERhdGUnIGFuZCAnZW5kRGF0ZScgcHJvcGVydGllcyB0byBoYXZlIElTTyBmb3JtYXRcclxuICAgIGhvdGVsUXVlcnkuc3RhcnREYXRlID0gbmV3IERhdGUoaG90ZWxRdWVyeS5zdGFydERhdGUpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICBob3RlbFF1ZXJ5LmVuZERhdGUgPSBuZXcgRGF0ZShob3RlbFF1ZXJ5LmVuZERhdGUpLnRvSVNPU3RyaW5nKCk7XHJcblxyXG4gICAgLy8gY3JlYXRlIGNvcHkgb2YgaG90ZWxRdWVyeSBhbmQgZGVsZXRlICdhZHVsdHMnIHByb3BlcnR5IGFzIHNlYXJjaFF1ZXJ5U2NoZW1hIGZvciBob3RlbCAoY29uZmVybWEpIGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCBpdCBiZWluZyBhZGRlZFxyXG4gICAgY29uc3Qgc2VhcmNoUXVlcnkgPSB7IC4uLmhvdGVsUXVlcnkgfTtcclxuICAgIGRlbGV0ZSBzZWFyY2hRdWVyeS5hZHVsdHM7XHJcblxyXG4gICAgY29uc3QgZGV0YWlsUm9vbXM6IHtcclxuICAgICAgcmF0ZURlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgICAgIHJvb21EZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gICAgICByb29tSWQ6IHN0cmluZztcclxuICAgICAgcm9vbVR5cGU6IHN0cmluZztcclxuICAgICAgcmF0ZUNvZGU6IHN0cmluZztcclxuICAgICAgY2hlY2tJbjogYW55O1xyXG4gICAgICBjaGVja091dDogYW55O1xyXG4gICAgfVtdID0gW107XHJcbiAgICBkZXRhaWxSb29tcy5wdXNoKHtcclxuICAgICAgcmF0ZURlc2NyaXB0aW9uOiBob3RlbFJvb20ucmF0ZURlc2NyaXB0aW9uLFxyXG4gICAgICByb29tRGVzY3JpcHRpb246IGhvdGVsUm9vbS5yb29tRGVzY3JpcHRpb24sXHJcbiAgICAgIHJvb21JZDogaG90ZWxSb29tLnJvb21JZCxcclxuICAgICAgcm9vbVR5cGU6IGhvdGVsUm9vbS5yb29tVHlwZSxcclxuICAgICAgcmF0ZUNvZGU6IGhvdGVsUm9vbS5yYXRlQ29kZSxcclxuICAgICAgY2hlY2tJbjogaG90ZWxRdWVyeS5zdGFydERhdGUsXHJcbiAgICAgIGNoZWNrT3V0OiBob3RlbFF1ZXJ5LmVuZERhdGVcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGludEJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UgPVxyXG4gICAgICBhd2FpdCB0aGlzLmJhc2tldFNlcnZpY2UuZ2V0RGVmYXVsdEJhc2tldCgpO1xyXG4gICAgY29uc3QgYmFza2V0ID0gaW50QmFza2V0Py5zdWJqZWN0LnZhbHVlO1xyXG4gICAgaWYgKGJhc2tldCkge1xyXG4gICAgICAvLyBFTlQtMjQ0NyBhZGQgaW4gY2h1bmtzIHdpdGggcGVvcGxlIHBlciByb29tXHJcbiAgICAgIGNvbnN0IHBheFBlclJvb206IG51bWJlciA9IHRoaXMudGVtcFBhcmFtcy5ub19vZl9vY2N1cGFudHM7XHJcblxyXG4gICAgICAvLyBFTlQtMzA0OCBUbyBiZSBjaGFuZ2VkIHdoZW4gdHJhdmxsZXJzIGZsb3cgYWRkZWRcclxuICAgICAgY29uc3Qgcm9vbUFycmF5ID0gbmV3IEFycmF5KHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcykuZmlsbChcclxuICAgICAgICAnVEVTVCdcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgbnVtYmVyVG9TcGxpdCA9IHRoaXMudGVtcFBhcmFtcy5ub19vZl9yb29tcyA9PT0gcGF4UGVyUm9vbSA/IDEgOiAyO1xyXG4gICAgICBjb25zdCBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzID0gXy5jaHVuayh0aGlzLnRyYXZlbGxlcnMsIG51bWJlclRvU3BsaXQpO1xyXG4gICAgICBjb25zdCB7IGFkZHJlc3M6IGhvdGVsQWFkZHJlc3MgfSA9IGhvdGVsO1xyXG4gICAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChob3RlbFJvb20sIGhvdGVsUXVlcnkpO1xyXG4gICAgICAvLyBib29rZWRUcmF2ZWxsZXJzQ2h1bmtzLmZvckVhY2goKGNodW5rOiBUcmF2ZWxsZXJbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICByb29tQXJyYXkuZm9yRWFjaCgoY2h1bms6IFRyYXZlbGxlcltdLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBhZHVsdHM6IG51bWJlclRvU3BsaXQsXHJcbiAgICAgICAgICAgIGJhc2tldDogYmFza2V0LmlkLFxyXG4gICAgICAgICAgICBzZXJ2aWNlOiBob3RlbC5zb3VyY2VJZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICBob3RlbEFkZHJlc3M6IHtcclxuICAgICAgICAgICAgICAgIHN0cmVldE5hbWU6IGhvdGVsQWFkZHJlc3MuYWRkcmVzc0xpbmUxLFxyXG4gICAgICAgICAgICAgICAgdG93bjogaG90ZWxBYWRkcmVzcy5hZGRyZXNzTGluZTIsXHJcbiAgICAgICAgICAgICAgICBjb3VudHk6IGhvdGVsQWFkZHJlc3MuYWRkcmVzc0xpbmUzLFxyXG4gICAgICAgICAgICAgICAgcG9zdGNvZGU6IGhvdGVsQWFkZHJlc3MucG9zdE9yWmlwQ29kZSxcclxuICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlOiBob3RlbEFhZGRyZXNzLmNvdW50cnlDb2RlXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBob3RlbERlc2NyaXB0aW9uOiBob3RlbC5ncm91cCxcclxuICAgICAgICAgICAgICBob3RlbElkOiBob3RlbC5pZCxcclxuICAgICAgICAgICAgICBob3RlbE5hbWU6IGhvdGVsLm5hbWUsXHJcbiAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgYWx3YXlzIGJlIDEgYXMgd2UgYm9vayAxIHJvb20gYXMgYSB0aW1lXHJcbiAgICAgICAgICAgICAgbnVtYmVyT2ZSb29tczogMSxcclxuICAgICAgICAgICAgICByb29tczogZGV0YWlsUm9vbXMsXHJcbiAgICAgICAgICAgICAgdGVybXNBbmRDb25kOiB0ZXJtc0FuZENvbmRpdGlvbnNcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLy8gbm8gbG9uZ2VyICogbm8gb2Ygcm9vbXMgYXMgZWFjaCByb29tIGlzIGFkZGVkIDEgYnkgMVxyXG4gICAgICAgICAgICBwcmljZTogaG90ZWxSb29tLnRvdGFsLCAvLyAqIGhvdGVsUXVlcnkucm9vbXMsXHJcbiAgICAgICAgICAgIGN1cnJlbmN5OiBob3RlbFJvb20uY3VycmVuY3lDb2RlIGFzIEN1cnJlbmN5Q29kZSxcclxuICAgICAgICAgICAgc2VhcmNoUXVlcnksXHJcbiAgICAgICAgICAgIG91dGJvdW5kRGF0ZTogaG90ZWxRdWVyeS5zdGFydERhdGVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpbnRCYXNrZXQsXHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2UsXHJcbiAgICAgICAgICAvLyB0aGlzIGlzIGFuIGFycmF5IG9mIDEgb3IgMiB0cmF2ZWxsZXJzIHdoaWNoIGdvIGluIDEgcm9vbVxyXG4gICAgICAgICAgLy8gY2h1bmtcclxuICAgICAgICAgIGJvb2tlZFRyYXZlbGxlcnNDaHVua3NbaW5kZXhdIHx8IFtdXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBpZiAoaW5kZXggPT09IGJvb2tlZFRyYXZlbGxlcnNDaHVua3MubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGlmIChpbmRleCA9PT0gcm9vbUFycmF5Lmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVybXNBbmRDb25kKFxyXG4gICAgaG90ZWxSb29tOiBIb3RlbFJvb20sXHJcbiAgICBob3RlbFF1ZXJ5OiBTZWFyY2hIb3RlbHNRdWVyeVZhcmlhYmxlc1xyXG4gICkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdSYXRlIEluZm9ybWF0aW9uJyxcclxuICAgICAgICB2YWx1ZTogaG90ZWxSb29tLnJhdGVEZXNjcmlwdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0NhbmNlbGxhdGlvbiBQb2xpY3knLFxyXG4gICAgICAgIHZhbHVlOiBob3RlbFJvb20ucG9saWNpZXMuY2FuY2VsbGF0aW9uXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnUmF0ZSBDb2RlJyxcclxuICAgICAgICB2YWx1ZTogaG90ZWxSb29tLnJhdGVDb2RlXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnUm9vbSBJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IGhvdGVsUm9vbS5yb29tRGVzY3JpcHRpb25cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdEZXBvc2l0IEFtb3VudCcsXHJcbiAgICAgICAgdmFsdWU6XHJcbiAgICAgICAgICAoaG90ZWxSb29tLnRvdGFsICogaG90ZWxRdWVyeS5yb29tcykudG9TdHJpbmcoKSArIGhvdGVsUXVlcnkuY3VycmVuY3lcclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHNhdmVTZWFyY2goKTogT2JzZXJ2YWJsZTxTYXZlRmF2b3VyaXRlU2VhcmNoUmVzdWx0PntcclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIGNvbnN0IGZhdm91cml0ZVNlYXJjaFF1ZXJ5ID0gdGhpcy51cGRhdGVTZXJjaFF1ZXJ5KHF1ZXJ5KTtcclxuICAgICAgY29uc3Qgc2VhcmNoSW5mbyA9IHtcclxuICAgICAgICBuYW1lOiBgJHttb21lbnQoKX1gLFxyXG4gICAgICAgIHNlcnZpY2VUeXBlOiBTZXJ2aWNlVHlwZS5Ib3RlbCxcclxuICAgICAgICBzZWFyY2hBcmdzOiBmYXZvdXJpdGVTZWFyY2hRdWVyeVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZUZhdm91cml0ZVNlYXJjaChzZWFyY2hJbmZvKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|