@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
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
2
|
import moment from 'moment';
|
|
3
3
|
import { BaseEnterpriseSearch } from './base-enterprise';
|
|
4
|
-
import { BehaviorSubject
|
|
5
|
-
import { FareType, FlightPassengerType, ServiceType } from '../types/graphql.types';
|
|
6
|
-
import { FlightDirectionEnum
|
|
4
|
+
import { BehaviorSubject } from 'rxjs';
|
|
5
|
+
import { FareType, FlightCabinClass, FlightPassengerType, ServiceType } from '../types/graphql.types';
|
|
6
|
+
import { FlightDirectionEnum } from '../types/types';
|
|
7
7
|
import { EurostarSearchType } from './eurostar-search-type.enum';
|
|
8
8
|
import { TimeWindow } from './flight-enterprise-search';
|
|
9
9
|
const DEFAULT_FILTERS = Object.freeze({
|
|
10
10
|
stops: {},
|
|
11
|
+
totalStops: {},
|
|
11
12
|
mustInclude: {},
|
|
12
13
|
classes: {},
|
|
13
14
|
airlines: {},
|
|
@@ -61,44 +62,8 @@ export var SortMethod;
|
|
|
61
62
|
})(SortMethod || (SortMethod = {}));
|
|
62
63
|
export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
63
64
|
constructor(eurostarFetcher, helpers, userService, basketService, storageService, searchService) {
|
|
64
|
-
super(storageService,
|
|
65
|
-
this.resultQuery = this.getSearchQuery();
|
|
66
|
-
delete this.resultQuery.withGrouped;
|
|
67
|
-
this.filters.next(this.helpers.createFlightFilters(results1.journeys, DEFAULT_FILTERS));
|
|
68
|
-
if (results1 && this.searchService.isFlightsGrouped()) {
|
|
69
|
-
const returndata = (results1.journeys || []).reduce((acc, result) => {
|
|
70
|
-
if (result.outboundFlights.length) {
|
|
71
|
-
const euroResult = this.formatEurostarResults(result.outboundFlights, result.total);
|
|
72
|
-
euroResult.co2PerPassenger = result.co2PerPassenger;
|
|
73
|
-
euroResult.co2PerItem = result.co2PerItem;
|
|
74
|
-
euroResult.sourceId = result.sourceId;
|
|
75
|
-
euroResult.total = result.total;
|
|
76
|
-
euroResult.duration = this.minToHour(result.outboundTotalDuration);
|
|
77
|
-
if (!acc.outbound.find((item) => item.dateDeparture === euroResult.dateDeparture)) {
|
|
78
|
-
acc.outbound.push(euroResult);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if (result.inboundFlights.length) {
|
|
82
|
-
const euroResult = this.formatEurostarResults(result.inboundFlights, result.total);
|
|
83
|
-
euroResult.co2PerPassenger = result.co2PerPassenger;
|
|
84
|
-
euroResult.co2PerItem = result.co2PerItem;
|
|
85
|
-
euroResult.sourceId = result.sourceId;
|
|
86
|
-
euroResult.total = result.total;
|
|
87
|
-
euroResult.duration = this.minToHour(result.inboundTotalDuration);
|
|
88
|
-
if (!acc.inbound.find((item) => item.dateDeparture === euroResult.dateDeparture)) {
|
|
89
|
-
acc.inbound.push(euroResult);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return acc;
|
|
93
|
-
}, { outbound: [], inbound: [] });
|
|
94
|
-
return [returndata];
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
return results1 ? [results1] : [];
|
|
98
|
-
}
|
|
99
|
-
});
|
|
65
|
+
super(storageService, helpers);
|
|
100
66
|
this.eurostarFetcher = eurostarFetcher;
|
|
101
|
-
this.helpers = helpers;
|
|
102
67
|
this.basketService = basketService;
|
|
103
68
|
this.searchService = searchService;
|
|
104
69
|
this.type = ServiceType.Eurostar;
|
|
@@ -130,6 +95,22 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
130
95
|
code: SortTypesEurostar.LatestFirst
|
|
131
96
|
}
|
|
132
97
|
];
|
|
98
|
+
this._sortArrayLu = [
|
|
99
|
+
{
|
|
100
|
+
title: 'Price',
|
|
101
|
+
method: SortMethod.sortByPrice,
|
|
102
|
+
icon: 'ico-dollar',
|
|
103
|
+
dir: true,
|
|
104
|
+
code: SortTypesEurostar.CheapestFirst
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
title: 'Time',
|
|
108
|
+
method: SortMethod.sortByDate,
|
|
109
|
+
icon: 'ico-calendar',
|
|
110
|
+
dir: true,
|
|
111
|
+
code: SortTypesEurostar.EarliestFirst
|
|
112
|
+
}
|
|
113
|
+
];
|
|
133
114
|
this._fareTypeArray = [
|
|
134
115
|
{ value: FareType.Flexible, display: 'Flexible' },
|
|
135
116
|
{ value: FareType.Leisure, display: 'Leisure' },
|
|
@@ -160,6 +141,14 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
160
141
|
this.multiResultsSessionName = EurostarEnterpriseSearch.STORAGE_SESSION_RESULTS;
|
|
161
142
|
this._displayAddHotel = false;
|
|
162
143
|
this.filters = new BehaviorSubject(DEFAULT_FILTERS);
|
|
144
|
+
this.selectedGroupEurostar = {
|
|
145
|
+
item: null,
|
|
146
|
+
direction: null
|
|
147
|
+
};
|
|
148
|
+
this.selectedEurostarFare = {
|
|
149
|
+
item: null,
|
|
150
|
+
direction: null
|
|
151
|
+
};
|
|
163
152
|
this._multiDestination = [];
|
|
164
153
|
this.minToHour = (dur) => `${Math.floor(dur / 60)}h ${dur % 60}m`;
|
|
165
154
|
const data = storageService.getSessionItem(EurostarEnterpriseSearch.STORAGE_SESSION_PARAMS) || {
|
|
@@ -201,10 +190,11 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
201
190
|
this.flightsToGroup = results.groupData || {};
|
|
202
191
|
this.resultQuery = results.query;
|
|
203
192
|
const isFlightsGrouped = this.searchService.isFlightsGrouped();
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
193
|
+
this.results.next((results.results || []));
|
|
194
|
+
const resultsClone = this.helpers.clone(results.results);
|
|
195
|
+
// get around the annoying type restrictions - I KNOW JOURNEYS IS THERE I CAN SEE IT STOP TELLING ME IT ISN'T TYPESCRIPT!
|
|
196
|
+
if (resultsClone.length)
|
|
197
|
+
this.filters.next(this.helpers.createFlightFilters(resultsClone[0].journeys, DEFAULT_FILTERS));
|
|
208
198
|
this._isValid();
|
|
209
199
|
this.negotiated =
|
|
210
200
|
this.tempParams.fareType === FareType.Negotiated ? true : false;
|
|
@@ -215,6 +205,10 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
215
205
|
set displayAddHotel(newVal) {
|
|
216
206
|
this._displayAddHotel = newVal;
|
|
217
207
|
}
|
|
208
|
+
get selectedFareClass() {
|
|
209
|
+
var _a, _b;
|
|
210
|
+
return (_b = (_a = this.selectedEurostarFare) === null || _a === void 0 ? void 0 : _a.item) === null || _b === void 0 ? void 0 : _b.class;
|
|
211
|
+
}
|
|
218
212
|
get timeArray() {
|
|
219
213
|
this._timeArray =
|
|
220
214
|
this._timeArray ||
|
|
@@ -451,6 +445,9 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
451
445
|
get sortDropdownValues() {
|
|
452
446
|
return this._sortArray;
|
|
453
447
|
}
|
|
448
|
+
get sortDropdownValuesLu() {
|
|
449
|
+
return this._sortArrayLu;
|
|
450
|
+
}
|
|
454
451
|
get fareTypesValues() {
|
|
455
452
|
return this._fareTypeArray;
|
|
456
453
|
}
|
|
@@ -473,7 +470,75 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
473
470
|
set includeNearbyAirports(value) {
|
|
474
471
|
this.tempParams.includeNearbyAirports = value;
|
|
475
472
|
}
|
|
476
|
-
|
|
473
|
+
processResults(results1) {
|
|
474
|
+
this.resultQuery = this.getSearchQuery();
|
|
475
|
+
delete this.resultQuery.withGrouped;
|
|
476
|
+
this.filters.next(this.helpers.createFlightFilters(results1.journeys, DEFAULT_FILTERS));
|
|
477
|
+
if (results1 && this.searchService.isFlightsGrouped()) {
|
|
478
|
+
const returndata = (results1.journeys || []).reduce((acc, result, index) => {
|
|
479
|
+
if (result.outboundFlights.length) {
|
|
480
|
+
const euroResult = this.formatEurostarResults(result.outboundFlights, result.total, index);
|
|
481
|
+
euroResult.co2PerPassenger = result.co2PerPassenger;
|
|
482
|
+
euroResult.co2PerItem = result.co2PerItem;
|
|
483
|
+
euroResult.sourceId = result.sourceId;
|
|
484
|
+
euroResult.total = result.total;
|
|
485
|
+
euroResult.duration = this.minToHour(result.outboundTotalDuration);
|
|
486
|
+
// console.log(euroResult.cabinClass);
|
|
487
|
+
if (!acc.outbound.find((item) => item.dateDeparture === euroResult.dateDeparture &&
|
|
488
|
+
item.cabinClass === euroResult.cabinClass)) {
|
|
489
|
+
acc.outbound.push(euroResult);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
if (result.inboundFlights.length) {
|
|
493
|
+
const euroResult = this.formatEurostarResults(result.inboundFlights, result.total, index);
|
|
494
|
+
euroResult.co2PerPassenger = result.co2PerPassenger;
|
|
495
|
+
euroResult.co2PerItem = result.co2PerItem;
|
|
496
|
+
euroResult.sourceId = result.sourceId;
|
|
497
|
+
euroResult.total = result.total;
|
|
498
|
+
euroResult.duration = this.minToHour(result.inboundTotalDuration);
|
|
499
|
+
// console.log(euroResult.cabinClass);
|
|
500
|
+
if (!acc.inbound.find((item) => item.dateDeparture === euroResult.dateDeparture &&
|
|
501
|
+
item.cabinClass === euroResult.cabinClass)) {
|
|
502
|
+
acc.inbound.push(euroResult);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return acc;
|
|
506
|
+
}, { outbound: [], inbound: [] });
|
|
507
|
+
returndata.outbound = returndata.outbound.reduce(this.matchFares.bind(this), []);
|
|
508
|
+
returndata.inbound = returndata.inbound.reduce(this.matchFares.bind(this), []);
|
|
509
|
+
return [returndata];
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
return results1 ? [results1] : [];
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
matchFares(acc, out) {
|
|
516
|
+
const matchingEurostar = acc.find((item) => item.dateDeparture === out.dateDeparture);
|
|
517
|
+
if (!matchingEurostar) {
|
|
518
|
+
acc.push(out);
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
// check what needs adding and add it
|
|
522
|
+
switch (out.cabinClass) {
|
|
523
|
+
case FlightCabinClass.Economy:
|
|
524
|
+
case FlightCabinClass.EconomyNoBags:
|
|
525
|
+
case FlightCabinClass.EconomyRestricted:
|
|
526
|
+
matchingEurostar.standardFare = out.standardFare;
|
|
527
|
+
break;
|
|
528
|
+
case 'Premium':
|
|
529
|
+
matchingEurostar.standardPremierFare = out.standardPremierFare;
|
|
530
|
+
break;
|
|
531
|
+
case FlightCabinClass.Business:
|
|
532
|
+
matchingEurostar.businessPremierFare = out.businessPremierFare;
|
|
533
|
+
break;
|
|
534
|
+
default:
|
|
535
|
+
console.log('how did I get here', out.cabinClass);
|
|
536
|
+
break;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
return acc;
|
|
540
|
+
}
|
|
541
|
+
formatEurostarResults(results, total, index) {
|
|
477
542
|
const returnObject = {
|
|
478
543
|
dateArrival: null,
|
|
479
544
|
dateDeparture: null,
|
|
@@ -485,60 +550,75 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
485
550
|
sourceId: null,
|
|
486
551
|
total: null,
|
|
487
552
|
uid: null,
|
|
553
|
+
cabinClass: null,
|
|
488
554
|
businessPremierFare: {
|
|
489
555
|
class: null,
|
|
490
556
|
fare: null,
|
|
491
557
|
isDisabled: true,
|
|
492
558
|
price: NaN,
|
|
493
|
-
currency: 'GBP'
|
|
559
|
+
currency: 'GBP',
|
|
560
|
+
selected: false
|
|
494
561
|
},
|
|
495
562
|
standardFare: {
|
|
496
563
|
class: null,
|
|
497
564
|
fare: null,
|
|
498
565
|
isDisabled: true,
|
|
499
566
|
price: NaN,
|
|
500
|
-
currency: 'GBP'
|
|
567
|
+
currency: 'GBP',
|
|
568
|
+
selected: false
|
|
501
569
|
},
|
|
502
570
|
standardPremierFare: {
|
|
503
571
|
class: null,
|
|
504
572
|
fare: null,
|
|
505
573
|
isDisabled: true,
|
|
506
574
|
price: NaN,
|
|
507
|
-
currency: 'GBP'
|
|
575
|
+
currency: 'GBP',
|
|
576
|
+
selected: false
|
|
508
577
|
}
|
|
509
578
|
};
|
|
510
579
|
// returnObject.duration = results.outboundTotalDuration;
|
|
511
|
-
results.forEach((flight
|
|
580
|
+
results.forEach((flight) => {
|
|
512
581
|
returnObject.dateArrival = flight.dateTimeArriving;
|
|
513
582
|
returnObject.dateDeparture = flight.dateTimeDeparting;
|
|
514
583
|
returnObject.duration = this.minToHour(flight.totalDuration);
|
|
515
584
|
returnObject.timeArrival = moment(flight.dateTimeArriving).format('HH:mm');
|
|
516
585
|
returnObject.timeDeparture = moment(flight.dateTimeDeparting).format('HH:mm');
|
|
586
|
+
returnObject.cabinClass = flight.cabinClass;
|
|
517
587
|
returnObject.uid = index;
|
|
518
|
-
|
|
519
|
-
|
|
588
|
+
// [14:41] Brendan Veninga
|
|
589
|
+
// Economy (and their variants) would be Standard
|
|
590
|
+
// Premium would be Standard Premium
|
|
591
|
+
// Business would be Business Premium
|
|
592
|
+
switch (flight.cabinClass) {
|
|
593
|
+
case FlightCabinClass.EconomyFlexi:
|
|
594
|
+
case FlightCabinClass.EconomyNoBags:
|
|
595
|
+
case FlightCabinClass.EconomyRestricted:
|
|
596
|
+
case FlightCabinClass.Economy:
|
|
520
597
|
returnObject.standardFare.isDisabled = false;
|
|
521
598
|
returnObject.standardFare.fare = flight;
|
|
522
599
|
returnObject.standardFare.price = total.price;
|
|
523
600
|
returnObject.standardFare.currency = total.currency;
|
|
524
601
|
returnObject.standardFare.class = flight.cabinClass;
|
|
602
|
+
returnObject.standardFare.selected = false;
|
|
525
603
|
break;
|
|
526
|
-
case
|
|
604
|
+
case 'Premium':
|
|
527
605
|
returnObject.standardPremierFare.isDisabled = false;
|
|
528
606
|
returnObject.standardPremierFare.fare = flight;
|
|
529
607
|
returnObject.standardPremierFare.price = total.price;
|
|
530
608
|
returnObject.standardPremierFare.currency = total.currency;
|
|
531
609
|
returnObject.standardPremierFare.class = flight.cabinClass;
|
|
610
|
+
returnObject.standardPremierFare.selected = false;
|
|
532
611
|
break;
|
|
533
|
-
case
|
|
612
|
+
case FlightCabinClass.Business:
|
|
534
613
|
returnObject.businessPremierFare.isDisabled = false;
|
|
535
614
|
returnObject.businessPremierFare.fare = flight;
|
|
536
615
|
returnObject.businessPremierFare.price = total.price;
|
|
537
616
|
returnObject.businessPremierFare.currency = total.currency;
|
|
538
617
|
returnObject.businessPremierFare.class = flight.cabinClass;
|
|
618
|
+
returnObject.businessPremierFare.selected = false;
|
|
539
619
|
break;
|
|
540
620
|
default:
|
|
541
|
-
console.
|
|
621
|
+
console.warn('new class to be implemented: ', flight.cabinClass);
|
|
542
622
|
}
|
|
543
623
|
});
|
|
544
624
|
return returnObject;
|
|
@@ -589,7 +669,7 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
589
669
|
this.results.next([]);
|
|
590
670
|
this._isValid();
|
|
591
671
|
if (this.isValid.value) {
|
|
592
|
-
this._originalUserSearch = Object.freeze(
|
|
672
|
+
this._originalUserSearch = Object.freeze(this.helpers.clone(this.tempParams));
|
|
593
673
|
this.storageService.setSessionItem(EurostarEnterpriseSearch.STORAGE_SESSION_PARAMS, {
|
|
594
674
|
tempParams: this.tempParams,
|
|
595
675
|
originalUserSearch: this.originalUserSearch
|
|
@@ -603,19 +683,37 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
603
683
|
}
|
|
604
684
|
}
|
|
605
685
|
getRecentSearchQuery(query) {
|
|
686
|
+
const recentSearchQuery = this.updateSerchQuery(query);
|
|
606
687
|
return {
|
|
607
688
|
serviceType: ServiceType.Eurostar,
|
|
608
|
-
searchArgs:
|
|
689
|
+
searchArgs: recentSearchQuery,
|
|
609
690
|
travelDate: this.outBoundDate.format(),
|
|
610
691
|
travellers: this.helpers.getTravellersId(this.travellers)
|
|
611
692
|
};
|
|
612
693
|
}
|
|
694
|
+
updateSerchQuery(query) {
|
|
695
|
+
const searchQuery = query;
|
|
696
|
+
if (this.departLocation) {
|
|
697
|
+
searchQuery.departLocation = this.departLocation;
|
|
698
|
+
}
|
|
699
|
+
if (this.arriveLocation) {
|
|
700
|
+
searchQuery.arriveLocation = this.arriveLocation;
|
|
701
|
+
}
|
|
702
|
+
return searchQuery;
|
|
703
|
+
}
|
|
613
704
|
startRecentSearch(recentSearch) {
|
|
614
705
|
if (recentSearch.searchArgs.outboundDate) {
|
|
615
|
-
|
|
706
|
+
let outboundTimeWindow = recentSearch.searchArgs
|
|
707
|
+
.outboundDepartureTimeWindow
|
|
708
|
+
? recentSearch.searchArgs.outboundDepartureTimeWindow
|
|
709
|
+
: recentSearch.searchArgs.outboundArrivalTimeWindow;
|
|
710
|
+
this.outBoundDate = this.convertRecentSearchDateTime(recentSearch.searchArgs.outboundDate, outboundTimeWindow);
|
|
616
711
|
}
|
|
617
712
|
if (recentSearch.searchArgs.returnDate) {
|
|
618
|
-
|
|
713
|
+
let returnTimeWindow = recentSearch.searchArgs.returnDepartureTimeWindow
|
|
714
|
+
? recentSearch.searchArgs.returnDepartureTimeWindow
|
|
715
|
+
: recentSearch.searchArgs.returnArrivalTimeWindow;
|
|
716
|
+
this.inboundDate = this.convertRecentSearchDateTime(recentSearch.searchArgs.returnDate, returnTimeWindow);
|
|
619
717
|
}
|
|
620
718
|
this.fareType = recentSearch.searchArgs.fareType;
|
|
621
719
|
this.maxConnections = recentSearch.searchArgs.maxConnections;
|
|
@@ -647,47 +745,10 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
647
745
|
else {
|
|
648
746
|
this.inTimeCriteria = TimeWindow.Anytime;
|
|
649
747
|
}
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
655
|
-
if (departLocation && arriveLocation) {
|
|
656
|
-
this.departLocation = {
|
|
657
|
-
destination: departLocation.iataMatch.name,
|
|
658
|
-
gateway: departLocation.iataMatch.iata,
|
|
659
|
-
terminals: this.searchService.processTerminals(departLocation.iataMatch.terminals),
|
|
660
|
-
country: (_b = (_a = departLocation.iataMatch) === null || _a === void 0 ? void 0 : _a.locationDetails) === null || _b === void 0 ? void 0 : _b.country,
|
|
661
|
-
postcode: (_d = (_c = departLocation.iataMatch) === null || _c === void 0 ? void 0 : _c.locationDetails) === null || _d === void 0 ? void 0 : _d.postcode,
|
|
662
|
-
countryCode: (_f = (_e = departLocation.iataMatch) === null || _e === void 0 ? void 0 : _e.locationDetails) === null || _f === void 0 ? void 0 : _f.countryCode
|
|
663
|
-
};
|
|
664
|
-
this.arriveLocation = {
|
|
665
|
-
destination: arriveLocation.iataMatch.name,
|
|
666
|
-
gateway: arriveLocation.iataMatch.iata,
|
|
667
|
-
terminals: this.searchService.processTerminals(arriveLocation.iataMatch.terminals),
|
|
668
|
-
country: (_h = (_g = arriveLocation.iataMatch) === null || _g === void 0 ? void 0 : _g.locationDetails) === null || _h === void 0 ? void 0 : _h.country,
|
|
669
|
-
postcode: (_k = (_j = arriveLocation.iataMatch) === null || _j === void 0 ? void 0 : _j.locationDetails) === null || _k === void 0 ? void 0 : _k.postcode,
|
|
670
|
-
countryCode: (_m = (_l = arriveLocation.iataMatch) === null || _l === void 0 ? void 0 : _l.locationDetails) === null || _m === void 0 ? void 0 : _m.countryCode
|
|
671
|
-
};
|
|
672
|
-
if (recentSearch.searchArgs.preferredCarriers) {
|
|
673
|
-
let preferredCarriers = [];
|
|
674
|
-
recentSearch.searchArgs.preferredCarriers.map((preferredCarry) => {
|
|
675
|
-
this.searchService
|
|
676
|
-
.getAirlinesList(preferredCarry)
|
|
677
|
-
.subscribe((items) => {
|
|
678
|
-
items.map((item) => {
|
|
679
|
-
if (item.code === preferredCarry) {
|
|
680
|
-
preferredCarriers.push(item);
|
|
681
|
-
}
|
|
682
|
-
});
|
|
683
|
-
this.preferredCarriers = preferredCarriers;
|
|
684
|
-
this.searchService.startSearches();
|
|
685
|
-
});
|
|
686
|
-
});
|
|
687
|
-
}
|
|
688
|
-
this.searchService.startSearches();
|
|
689
|
-
}
|
|
690
|
-
});
|
|
748
|
+
this._originAirport = recentSearch.searchArgs.originAirport;
|
|
749
|
+
this._destinationAirport = recentSearch.searchArgs.destinationAirport;
|
|
750
|
+
this.arriveLocation = recentSearch.searchArgs.arriveLocation;
|
|
751
|
+
this.departLocation = recentSearch.searchArgs.departLocation;
|
|
691
752
|
this.searchService.startSearches();
|
|
692
753
|
}
|
|
693
754
|
makeDepartureTimeWindow(dateTime, window) {
|
|
@@ -757,19 +818,19 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
757
818
|
this.avaliableClasses.next([
|
|
758
819
|
{
|
|
759
820
|
name: 'Any',
|
|
760
|
-
type:
|
|
821
|
+
type: FlightCabinClass.Any
|
|
761
822
|
},
|
|
762
823
|
{
|
|
763
824
|
name: 'Standard (semi flexible)',
|
|
764
|
-
type:
|
|
825
|
+
type: FlightCabinClass.Economy
|
|
765
826
|
},
|
|
766
827
|
{
|
|
767
828
|
name: 'Standard premier (semi flexible)',
|
|
768
|
-
type:
|
|
829
|
+
type: FlightCabinClass.PremiumEconomy
|
|
769
830
|
},
|
|
770
831
|
{
|
|
771
832
|
name: 'Business premier (fully flexible)',
|
|
772
|
-
type:
|
|
833
|
+
type: FlightCabinClass.Business
|
|
773
834
|
}
|
|
774
835
|
]);
|
|
775
836
|
}
|
|
@@ -777,16 +838,16 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
777
838
|
* @description - sort the flight results
|
|
778
839
|
* @todo - Fill out Preferred and Co2 sorting when we have that data
|
|
779
840
|
*/
|
|
780
|
-
sortResults(sortMethodValue, givenResults) {
|
|
841
|
+
sortResults(sortMethodValue, dir, givenResults) {
|
|
781
842
|
let results = this.helpers.clone(givenResults
|
|
782
843
|
? givenResults
|
|
783
844
|
: this.fullResults);
|
|
784
845
|
switch (sortMethodValue) {
|
|
785
846
|
case SortTypesEurostar.CheapestFirst:
|
|
786
|
-
results = this.sortByPrice(results);
|
|
847
|
+
results = this.sortByPrice(results, dir);
|
|
787
848
|
break;
|
|
788
849
|
case SortTypesEurostar.EarliestFirst:
|
|
789
|
-
results = this.sortByDate(results);
|
|
850
|
+
results = this.sortByDate(results, dir);
|
|
790
851
|
break;
|
|
791
852
|
default:
|
|
792
853
|
console.error(`+++ Unknown sorting method: ${sortMethodValue} +++`);
|
|
@@ -846,10 +907,14 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
846
907
|
* @returns
|
|
847
908
|
* @memberof EurostarInfo
|
|
848
909
|
*/
|
|
849
|
-
sortByDate(results) {
|
|
910
|
+
sortByDate(results, dir) {
|
|
850
911
|
const byDate = (a, b) => {
|
|
851
|
-
|
|
852
|
-
moment(b.
|
|
912
|
+
if (dir) {
|
|
913
|
+
return moment(a.dateDeparture).unix() - moment(b.dateDeparture).unix();
|
|
914
|
+
}
|
|
915
|
+
else {
|
|
916
|
+
return moment(b.dateDeparture).unix() - moment(a.dateDeparture).unix();
|
|
917
|
+
}
|
|
853
918
|
};
|
|
854
919
|
const sortedResults = {
|
|
855
920
|
outbound: results[0].outbound.sort(byDate),
|
|
@@ -873,9 +938,9 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
873
938
|
+b.standardPremierFare.price ||
|
|
874
939
|
+b.businessPremierFare.price;
|
|
875
940
|
if (dir) {
|
|
876
|
-
return
|
|
941
|
+
return aPrice - bPrice;
|
|
877
942
|
}
|
|
878
|
-
return
|
|
943
|
+
return bPrice - aPrice;
|
|
879
944
|
};
|
|
880
945
|
const sortedResults = {
|
|
881
946
|
outbound: results[0].outbound.sort(byPrice),
|
|
@@ -934,538 +999,114 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
934
999
|
* @param results
|
|
935
1000
|
* @returns
|
|
936
1001
|
*/
|
|
937
|
-
applyFilters(filters
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
// newResults = this.filterByReturnDepartureTime(
|
|
941
|
-
// filters.minReturnDepartureTime,
|
|
942
|
-
// filters.maxReturnDepartureTime,
|
|
943
|
-
// newResults
|
|
944
|
-
// );
|
|
945
|
-
// newResults = this.filterByReturnArrivalTime(
|
|
946
|
-
// filters.minReturnArrivalTime,
|
|
947
|
-
// filters.maxReturnArrivalTime,
|
|
948
|
-
// newResults
|
|
949
|
-
// );
|
|
950
|
-
// }
|
|
951
|
-
// // Global (apply to both inbound and outbound results) filters
|
|
952
|
-
// newResults = this.filterByDepartureTime(
|
|
953
|
-
// filters.minDepartureTime,
|
|
954
|
-
// filters.maxDepartureTime,
|
|
955
|
-
// newResults
|
|
956
|
-
// );
|
|
957
|
-
// newResults = this.filterByArrivalTime(
|
|
958
|
-
// filters.minArrivalTime,
|
|
959
|
-
// filters.maxArrivalTime,
|
|
960
|
-
// newResults
|
|
961
|
-
// );
|
|
962
|
-
// newResults = this.filterResultsByStops(filters.stops, newResults);
|
|
963
|
-
// newResults = this.filterByPrice(
|
|
964
|
-
// filters.minPrice,
|
|
965
|
-
// filters.maxPrice,
|
|
966
|
-
// newResults
|
|
967
|
-
// );
|
|
968
|
-
// return newResults;
|
|
969
|
-
}
|
|
970
|
-
filterByDuration(minDuration, maxDuration, results, isReturn = false) {
|
|
971
|
-
results = results.filter((result) => {
|
|
972
|
-
var _a;
|
|
973
|
-
let dur = 0;
|
|
974
|
-
if (!isReturn) {
|
|
975
|
-
result.outboundFlights.forEach((out) => {
|
|
976
|
-
dur += out.totalDuration;
|
|
977
|
-
});
|
|
978
|
-
}
|
|
979
|
-
if (((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) && isReturn) {
|
|
980
|
-
result.inboundFlights.forEach((inb) => {
|
|
981
|
-
dur += inb.totalDuration;
|
|
982
|
-
});
|
|
983
|
-
}
|
|
984
|
-
return dur >= minDuration && dur <= maxDuration;
|
|
985
|
-
});
|
|
986
|
-
return results;
|
|
987
|
-
}
|
|
988
|
-
filterByDepartureTime(minDep, maxDep, results) {
|
|
989
|
-
results = results.filter((result) => {
|
|
990
|
-
const departureTime = Number(moment(result.outboundFlights[0].dateTimeDeparting).format('HHmm'));
|
|
991
|
-
const newNumString1 = Number(Math.floor(Number(minDep / 100)).toString() +
|
|
992
|
-
this.transformMin(Math.ceil(Number(minDep % 100))));
|
|
993
|
-
const newNumString2 = Number(Math.floor(Number(maxDep / 100)).toString() +
|
|
994
|
-
this.transformMin(Math.ceil(Number(maxDep % 100))));
|
|
995
|
-
return departureTime >= newNumString1 && departureTime <= newNumString2;
|
|
996
|
-
});
|
|
997
|
-
return results;
|
|
998
|
-
}
|
|
999
|
-
filterByReturnDepartureTime(minDep, maxDep, results) {
|
|
1000
|
-
if (!minDep && !maxDep) {
|
|
1001
|
-
return results;
|
|
1002
|
+
applyFilters(filters) {
|
|
1003
|
+
if (this.fullResults.length === 0) {
|
|
1004
|
+
this.results.next([]);
|
|
1002
1005
|
}
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
const
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
const departureTime = Number(moment(result.inboundFlights[0].dateTimeDeparting).format('HHmm'));
|
|
1012
|
-
return departureTime >= newNumString1 && departureTime <= newNumString2;
|
|
1013
|
-
});
|
|
1014
|
-
return results;
|
|
1015
|
-
}
|
|
1016
|
-
filterByReturnArrivalTime(minArr, maxArr, results) {
|
|
1017
|
-
if (!minArr && !maxArr) {
|
|
1018
|
-
return results;
|
|
1019
|
-
}
|
|
1020
|
-
const newNumString1 = Number(Math.floor(Number(minArr / 100)).toString() +
|
|
1021
|
-
this.transformMin(Math.ceil(Number(minArr % 100))));
|
|
1022
|
-
const newNumString2 = Number(Math.floor(Number(maxArr / 100)).toString() +
|
|
1023
|
-
this.transformMin(Math.ceil(Number(maxArr % 100))));
|
|
1024
|
-
results = results.filter((result) => {
|
|
1025
|
-
if (!result.inboundFlights || !result.inboundFlights[0]) {
|
|
1026
|
-
return true;
|
|
1027
|
-
}
|
|
1028
|
-
const arrivalTime = Number(moment(result.inboundFlights[result.inboundFlights.length - 1]
|
|
1029
|
-
.dateTimeArriving).format('HHmm'));
|
|
1030
|
-
const retVal = arrivalTime >= newNumString1 && arrivalTime <= newNumString2;
|
|
1031
|
-
// for debugging
|
|
1032
|
-
// if (!retVal) {
|
|
1033
|
-
// console.warn(`+++ Filtering Out: ${arrivalTime} +++`);
|
|
1034
|
-
// }
|
|
1035
|
-
return retVal;
|
|
1036
|
-
});
|
|
1037
|
-
return results;
|
|
1038
|
-
}
|
|
1039
|
-
filterByArrivalTime(minArr, maxArr, results) {
|
|
1040
|
-
const newNumString1 = Number(Math.floor(Number(minArr / 100)).toString() +
|
|
1041
|
-
this.transformMin(Math.ceil(Number(minArr % 100))));
|
|
1042
|
-
const newNumString2 = Number(Math.floor(Number(maxArr / 100)).toString() +
|
|
1043
|
-
this.transformMin(Math.ceil(Number(maxArr % 100))));
|
|
1044
|
-
results = results.filter((result) => {
|
|
1045
|
-
const arrivalTime = Number(moment(result.outboundFlights[result.outboundFlights.length - 1]
|
|
1046
|
-
.dateTimeArriving).format('HHmm'));
|
|
1047
|
-
return arrivalTime >= newNumString1 && arrivalTime <= newNumString2;
|
|
1048
|
-
});
|
|
1049
|
-
return results;
|
|
1050
|
-
}
|
|
1051
|
-
filterByBaggage(baggageFilters, results) {
|
|
1052
|
-
const selected = baggageFilters.filter((x) => x.selected);
|
|
1053
|
-
if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== baggageFilters.length) {
|
|
1054
|
-
results = results.filter((result) => {
|
|
1055
|
-
try {
|
|
1056
|
-
const totalBags = this.getTotalBaggage(result);
|
|
1057
|
-
return selected.find((x) => x.value === totalBags);
|
|
1058
|
-
}
|
|
1059
|
-
catch (error) {
|
|
1060
|
-
console.error('+++ Error determening baggage: ${error} +++');
|
|
1061
|
-
return false;
|
|
1062
|
-
}
|
|
1063
|
-
});
|
|
1064
|
-
}
|
|
1065
|
-
return results;
|
|
1066
|
-
}
|
|
1067
|
-
filterByPrice(minPrice, maxPrice, results) {
|
|
1068
|
-
results = results.filter((result) => {
|
|
1069
|
-
// console.log(`+++ Price: ${result.total.price} is between: ${minPrice} and ${maxPrice}: ${result.total.price >= minPrice && result.total.price <= maxPrice} +++`)
|
|
1070
|
-
return result.total.price >= minPrice && result.total.price <= maxPrice;
|
|
1071
|
-
});
|
|
1072
|
-
return results;
|
|
1073
|
-
}
|
|
1074
|
-
/**
|
|
1075
|
-
* @description - filter the results by the number of stops
|
|
1076
|
-
* @param stopFilters - the selected stops
|
|
1077
|
-
* @param fullResults - all of our results so far
|
|
1078
|
-
*/
|
|
1079
|
-
filterResultsByStops(stopFilters, fullResults) {
|
|
1080
|
-
const selected = stopFilters.filter((x) => x.selected);
|
|
1081
|
-
if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== stopFilters.length) {
|
|
1082
|
-
fullResults = fullResults.filter((result) => {
|
|
1083
|
-
const totalStops = result.outboundFlights.length - 1;
|
|
1084
|
-
const haveStop = selected.find((selected1) => selected1.value === totalStops);
|
|
1085
|
-
return haveStop;
|
|
1086
|
-
});
|
|
1087
|
-
}
|
|
1088
|
-
return fullResults;
|
|
1089
|
-
}
|
|
1090
|
-
filterResultsByAirline(airlineFilters, results) {
|
|
1091
|
-
const selected = airlineFilters.filter((x) => x.selected);
|
|
1092
|
-
if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== airlineFilters.length) {
|
|
1093
|
-
results = results.filter((result) => {
|
|
1094
|
-
return selected.find((x) => x.value === result.outboundFlights[0].operatingCarrier);
|
|
1095
|
-
});
|
|
1096
|
-
}
|
|
1097
|
-
return results;
|
|
1098
|
-
}
|
|
1099
|
-
filterResultsByClass(classFilters, results) {
|
|
1100
|
-
const selected = classFilters.filter((x) => x.selected);
|
|
1101
|
-
if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== classFilters.length) {
|
|
1102
|
-
results = results.filter((result) => {
|
|
1103
|
-
return selected.find((x) => x.value === result.outboundFlights[0].cabinClass);
|
|
1104
|
-
});
|
|
1105
|
-
}
|
|
1106
|
-
return results;
|
|
1107
|
-
}
|
|
1108
|
-
filterByDepartureAirport(departureAirports, results) {
|
|
1109
|
-
const selected = departureAirports.filter((x) => x.selected);
|
|
1110
|
-
if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== departureAirports.length) {
|
|
1111
|
-
results = results.filter((result) => {
|
|
1112
|
-
return selected.find((x) => x.value === result.outboundFlights[0].originAirport);
|
|
1113
|
-
});
|
|
1114
|
-
}
|
|
1115
|
-
return results;
|
|
1116
|
-
}
|
|
1117
|
-
filterByArrivalAirport(arrivalAirports, results) {
|
|
1118
|
-
const selected = arrivalAirports.filter((x) => x.selected);
|
|
1119
|
-
if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== arrivalAirports.length) {
|
|
1120
|
-
results = results.filter((result) => {
|
|
1121
|
-
const destinationAirport = result.outboundFlights[result.outboundFlights.length - 1]
|
|
1122
|
-
.destinationAirport;
|
|
1123
|
-
return selected.find((x) => x.value === destinationAirport);
|
|
1124
|
-
});
|
|
1125
|
-
}
|
|
1126
|
-
return results;
|
|
1127
|
-
}
|
|
1128
|
-
filterByDepartureReturnAirport(departureAirports, results) {
|
|
1129
|
-
const selected = departureAirports.filter((x) => x.selected);
|
|
1130
|
-
if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== departureAirports.length) {
|
|
1131
|
-
results = results.filter((result) => {
|
|
1132
|
-
var _a;
|
|
1133
|
-
if (!((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
1134
|
-
return true;
|
|
1135
|
-
}
|
|
1136
|
-
return selected.find((x) => x.value === result.inboundFlights[0].originAirport);
|
|
1137
|
-
});
|
|
1138
|
-
}
|
|
1139
|
-
return results;
|
|
1140
|
-
}
|
|
1141
|
-
filterByArrivalReturnAirport(arrivalAirports, results) {
|
|
1142
|
-
const selected = arrivalAirports.filter((x) => x.selected);
|
|
1143
|
-
if ((selected === null || selected === void 0 ? void 0 : selected.length) >= 1 && selected.length !== arrivalAirports.length) {
|
|
1144
|
-
results = results.filter((result) => {
|
|
1145
|
-
var _a;
|
|
1146
|
-
if (!((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
1147
|
-
return true;
|
|
1148
|
-
}
|
|
1149
|
-
const destinationAirport = result.inboundFlights[result.inboundFlights.length - 1]
|
|
1150
|
-
.destinationAirport;
|
|
1151
|
-
return selected.find((x) => x.value === destinationAirport);
|
|
1152
|
-
});
|
|
1153
|
-
}
|
|
1154
|
-
return results;
|
|
1155
|
-
}
|
|
1156
|
-
getMinDuration(results, isReturn = false) {
|
|
1157
|
-
let min = 0;
|
|
1158
|
-
results.forEach((result) => {
|
|
1159
|
-
var _a;
|
|
1160
|
-
let dur = 0;
|
|
1161
|
-
if (!isReturn) {
|
|
1162
|
-
result.outboundFlights.forEach((out) => {
|
|
1163
|
-
dur += out.totalDuration;
|
|
1164
|
-
});
|
|
1165
|
-
}
|
|
1166
|
-
if (((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) && isReturn) {
|
|
1167
|
-
result.inboundFlights.forEach((inb) => {
|
|
1168
|
-
dur += inb.totalDuration;
|
|
1169
|
-
});
|
|
1170
|
-
}
|
|
1171
|
-
if (!min || dur < min) {
|
|
1172
|
-
min = dur;
|
|
1173
|
-
}
|
|
1174
|
-
});
|
|
1175
|
-
return min;
|
|
1176
|
-
}
|
|
1177
|
-
getMaxDuration(results, isReturn = false) {
|
|
1178
|
-
let max = 0;
|
|
1179
|
-
results.forEach((result) => {
|
|
1180
|
-
var _a;
|
|
1181
|
-
let dur = 0;
|
|
1182
|
-
if (!isReturn) {
|
|
1183
|
-
result.outboundFlights.forEach((out) => {
|
|
1184
|
-
dur += out.totalDuration;
|
|
1185
|
-
});
|
|
1186
|
-
}
|
|
1187
|
-
if (((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) && isReturn) {
|
|
1188
|
-
result.inboundFlights.forEach((inb) => {
|
|
1189
|
-
dur += inb.totalDuration;
|
|
1190
|
-
});
|
|
1191
|
-
}
|
|
1192
|
-
if (!max || dur > max) {
|
|
1193
|
-
max = dur;
|
|
1194
|
-
}
|
|
1195
|
-
});
|
|
1196
|
-
return max;
|
|
1197
|
-
}
|
|
1198
|
-
getMinArrivalTime(results) {
|
|
1199
|
-
let min;
|
|
1200
|
-
results.forEach((result) => {
|
|
1201
|
-
let minDepTime = Number(moment(result.outboundFlights[result.outboundFlights.length - 1]
|
|
1202
|
-
.dateTimeArriving).format('HHmm'));
|
|
1203
|
-
minDepTime = Math.floor(minDepTime / 100) * 100;
|
|
1204
|
-
if (!min || minDepTime < min) {
|
|
1205
|
-
min = minDepTime;
|
|
1206
|
-
}
|
|
1207
|
-
});
|
|
1208
|
-
return min;
|
|
1209
|
-
}
|
|
1210
|
-
getMinReturnArrivalTime(results) {
|
|
1211
|
-
let min;
|
|
1212
|
-
results.forEach((result) => {
|
|
1213
|
-
if (result.inboundFlights && result.inboundFlights.length) {
|
|
1214
|
-
let minDepTime = Number(moment(result.inboundFlights[result.inboundFlights.length - 1]
|
|
1215
|
-
.dateTimeArriving).format('HHmm'));
|
|
1216
|
-
minDepTime = Math.floor(minDepTime / 100) * 100;
|
|
1217
|
-
if (!min || minDepTime < min) {
|
|
1218
|
-
min = minDepTime;
|
|
1219
|
-
}
|
|
1220
|
-
}
|
|
1221
|
-
});
|
|
1222
|
-
return min;
|
|
1223
|
-
}
|
|
1224
|
-
getMaxReturnArrivalTime(results) {
|
|
1225
|
-
let max;
|
|
1226
|
-
results.forEach((result) => {
|
|
1227
|
-
if (result.inboundFlights && result.inboundFlights.length) {
|
|
1228
|
-
let maxDepTime = Number(moment(result.inboundFlights[result.inboundFlights.length - 1]
|
|
1229
|
-
.dateTimeArriving).format('HHmm'));
|
|
1230
|
-
maxDepTime = Math.ceil(maxDepTime / 100) * 100;
|
|
1231
|
-
if (!max || maxDepTime > max) {
|
|
1232
|
-
max = maxDepTime;
|
|
1233
|
-
}
|
|
1234
|
-
}
|
|
1235
|
-
});
|
|
1236
|
-
return max;
|
|
1237
|
-
}
|
|
1238
|
-
getMaxArrivalTime(results) {
|
|
1239
|
-
let max;
|
|
1240
|
-
results.forEach((result) => {
|
|
1241
|
-
let maxDepTime = Number(moment(result.outboundFlights[result.outboundFlights.length - 1]
|
|
1242
|
-
.dateTimeArriving).format('HHmm'));
|
|
1243
|
-
maxDepTime = Math.ceil(maxDepTime / 100) * 100;
|
|
1244
|
-
if (!max || maxDepTime > max) {
|
|
1245
|
-
max = maxDepTime;
|
|
1246
|
-
}
|
|
1247
|
-
});
|
|
1248
|
-
return max;
|
|
1249
|
-
}
|
|
1250
|
-
getMinDepartureTime(results) {
|
|
1251
|
-
let min;
|
|
1252
|
-
results.forEach((result) => {
|
|
1253
|
-
let minDepTime = Number(moment(result.outboundFlights[0].dateTimeDeparting).format('HHmm'));
|
|
1254
|
-
minDepTime = Math.floor(minDepTime / 100) * 100;
|
|
1255
|
-
if (!min || minDepTime < min) {
|
|
1256
|
-
min = minDepTime;
|
|
1257
|
-
}
|
|
1258
|
-
});
|
|
1259
|
-
return min;
|
|
1260
|
-
}
|
|
1261
|
-
getMinReturnDepartureTime(results) {
|
|
1262
|
-
let min;
|
|
1263
|
-
results.forEach((result) => {
|
|
1264
|
-
if (result.inboundFlights && result.inboundFlights[0]) {
|
|
1265
|
-
let minDepTime = Number(moment(result.inboundFlights[0].dateTimeDeparting).format('HHmm'));
|
|
1266
|
-
minDepTime = Math.floor(minDepTime / 100) * 100;
|
|
1267
|
-
if (!min || minDepTime < min) {
|
|
1268
|
-
min = minDepTime;
|
|
1269
|
-
}
|
|
1270
|
-
}
|
|
1271
|
-
});
|
|
1272
|
-
return min;
|
|
1273
|
-
}
|
|
1274
|
-
getMaxReturnDepartureTime(results) {
|
|
1275
|
-
let max;
|
|
1276
|
-
results.forEach((result) => {
|
|
1277
|
-
if (result.inboundFlights && result.inboundFlights[0]) {
|
|
1278
|
-
let maxDepTime = Number(moment(result.inboundFlights[0].dateTimeDeparting).format('HHmm'));
|
|
1279
|
-
maxDepTime = Math.ceil(maxDepTime / 100) * 100;
|
|
1280
|
-
if (!max || maxDepTime > max) {
|
|
1281
|
-
max = maxDepTime;
|
|
1282
|
-
}
|
|
1283
|
-
}
|
|
1284
|
-
});
|
|
1285
|
-
return max;
|
|
1286
|
-
}
|
|
1287
|
-
getMaxDepartureTime(results) {
|
|
1288
|
-
let max;
|
|
1289
|
-
results.forEach((result) => {
|
|
1290
|
-
let maxDepTime = Number(moment(result.outboundFlights[0].dateTimeDeparting).format('HHmm'));
|
|
1291
|
-
maxDepTime = Math.ceil(maxDepTime / 100) * 100;
|
|
1292
|
-
if (!max || maxDepTime > max) {
|
|
1293
|
-
max = maxDepTime;
|
|
1294
|
-
}
|
|
1295
|
-
});
|
|
1296
|
-
return max;
|
|
1297
|
-
}
|
|
1298
|
-
getBaggage(results) {
|
|
1299
|
-
const baggage = {};
|
|
1300
|
-
results.forEach((result) => {
|
|
1301
|
-
try {
|
|
1302
|
-
const parsedAdditional = JSON.parse(result.additional);
|
|
1303
|
-
let total = 0;
|
|
1304
|
-
if (parsedAdditional && parsedAdditional.outboundFlights) {
|
|
1305
|
-
parsedAdditional.outboundFlights.forEach((flight) => {
|
|
1306
|
-
flight.baggage.forEach((bag) => {
|
|
1307
|
-
if (bag.allowance && bag.allowance > total) {
|
|
1308
|
-
total = bag.allowance;
|
|
1309
|
-
}
|
|
1310
|
-
});
|
|
1006
|
+
// need to filter over the times, stops and price, though price and stops always seem to be the same
|
|
1007
|
+
// ! - VARIOUS FUNCTIONS TO PASS IN TO DO THE ACTUAL FILTERING
|
|
1008
|
+
const tester = (filtersTotest, testFunction) => {
|
|
1009
|
+
const selected = Object.values(filtersTotest).filter((filter) => filter.selected);
|
|
1010
|
+
if (selected.length) {
|
|
1011
|
+
return (flightItinerary) => {
|
|
1012
|
+
return !!selected.find((filter) => {
|
|
1013
|
+
return testFunction(flightItinerary, filter.value);
|
|
1311
1014
|
});
|
|
1312
|
-
}
|
|
1313
|
-
else if (parsedAdditional && parsedAdditional.baggageAllowance) {
|
|
1314
|
-
parsedAdditional.baggageAllowance.forEach((baggageAllow) => {
|
|
1315
|
-
if (baggageAllow.baggage.qty &&
|
|
1316
|
-
Number(baggageAllow.baggage.qty) > total) {
|
|
1317
|
-
total = Number(baggageAllow.baggage.qty);
|
|
1318
|
-
}
|
|
1319
|
-
});
|
|
1320
|
-
}
|
|
1321
|
-
baggage[total] = {
|
|
1322
|
-
selected: false,
|
|
1323
|
-
value: total,
|
|
1324
|
-
display: `${total} bag${total !== 1 ? 's' : ''}`
|
|
1325
|
-
};
|
|
1326
|
-
}
|
|
1327
|
-
catch (error) {
|
|
1328
|
-
console.error(`+++ Error parsing additional flight data: ${error} +++`);
|
|
1329
|
-
}
|
|
1330
|
-
});
|
|
1331
|
-
return Object.values(baggage);
|
|
1332
|
-
}
|
|
1333
|
-
getMinPrice(results) {
|
|
1334
|
-
let minPrice;
|
|
1335
|
-
results.forEach((result) => {
|
|
1336
|
-
if (!minPrice || result.total.price < minPrice) {
|
|
1337
|
-
minPrice = result.total.price;
|
|
1338
|
-
}
|
|
1339
|
-
});
|
|
1340
|
-
return minPrice;
|
|
1341
|
-
}
|
|
1342
|
-
getMaxPrice(results) {
|
|
1343
|
-
let maxPrice;
|
|
1344
|
-
results.forEach((result) => {
|
|
1345
|
-
if (!maxPrice || result.total.price > maxPrice) {
|
|
1346
|
-
maxPrice = result.total.price;
|
|
1347
|
-
}
|
|
1348
|
-
});
|
|
1349
|
-
return maxPrice;
|
|
1350
|
-
}
|
|
1351
|
-
getAllStops(results) {
|
|
1352
|
-
const allStops = {};
|
|
1353
|
-
results.forEach((result) => {
|
|
1354
|
-
const totalStops = result.outboundFlights.length - 1; // might have to recalculate this
|
|
1355
|
-
allStops[totalStops] = {
|
|
1356
|
-
value: totalStops,
|
|
1357
|
-
display: `${totalStops} stop` + (totalStops !== 1 ? 's' : ''),
|
|
1358
|
-
selected: false
|
|
1359
|
-
};
|
|
1360
|
-
});
|
|
1361
|
-
return Object.values(allStops);
|
|
1362
|
-
}
|
|
1363
|
-
getAllClasses(results) {
|
|
1364
|
-
const allClasses = [];
|
|
1365
|
-
results.forEach((result) => {
|
|
1366
|
-
result.outboundFlights.forEach((outFlight) => {
|
|
1367
|
-
allClasses[outFlight.cabinClass] = {
|
|
1368
|
-
value: outFlight.cabinClass,
|
|
1369
|
-
display: outFlight.cabinClass,
|
|
1370
|
-
selected: false
|
|
1371
1015
|
};
|
|
1372
|
-
});
|
|
1373
|
-
if (result.inboundFlights) {
|
|
1374
|
-
result.inboundFlights.forEach((inFlight) => {
|
|
1375
|
-
allClasses[inFlight.cabinClass] = {
|
|
1376
|
-
value: inFlight.cabinClass,
|
|
1377
|
-
display: inFlight.cabinClass,
|
|
1378
|
-
selected: false
|
|
1379
|
-
};
|
|
1380
|
-
});
|
|
1381
1016
|
}
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
/**
|
|
1386
|
-
* @description - create select filters for all unique departure airports returned in the search
|
|
1387
|
-
* @param results - the flight results
|
|
1388
|
-
*/
|
|
1389
|
-
getAllDepartureAirports(results, inbound = false) {
|
|
1390
|
-
const allAirports = {};
|
|
1391
|
-
results.forEach((result) => {
|
|
1392
|
-
var _a;
|
|
1393
|
-
if (result.outboundFlights.length && !inbound) {
|
|
1394
|
-
allAirports[result.outboundFlights[0].originAirport] = {
|
|
1395
|
-
value: result.outboundFlights[0].originAirport,
|
|
1396
|
-
display: result.outboundFlights[0].originAirportName,
|
|
1397
|
-
selected: false
|
|
1398
|
-
};
|
|
1399
|
-
}
|
|
1400
|
-
if (((_a = result.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) && inbound) {
|
|
1401
|
-
allAirports[result.inboundFlights[0].originAirport] = {
|
|
1402
|
-
value: result.inboundFlights[0].originAirport,
|
|
1403
|
-
display: result.inboundFlights[0].originAirportName,
|
|
1404
|
-
selected: false
|
|
1017
|
+
else {
|
|
1018
|
+
return (_flightItinerary) => {
|
|
1019
|
+
return true;
|
|
1405
1020
|
};
|
|
1406
1021
|
}
|
|
1407
|
-
}
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1022
|
+
};
|
|
1023
|
+
const isTimeBetween = (minmax, field) => {
|
|
1024
|
+
return (flightItinerary) => {
|
|
1025
|
+
const val = moment(this.helpers.fromObject(flightItinerary, ...replaceFields(field, flightItinerary).split('.'))).get('hour');
|
|
1026
|
+
// now attempt to get the min - may need to normalise this
|
|
1027
|
+
const val2 = moment(this.helpers.fromObject(flightItinerary, ...replaceFields(field, flightItinerary).split('.'))).get('minute');
|
|
1028
|
+
const totalTime = Number(`${val.toString().padStart(2, '0')}${val2
|
|
1029
|
+
.toString()
|
|
1030
|
+
.padStart(2, '0')}`);
|
|
1031
|
+
return totalTime >= minmax.min && totalTime <= minmax.max;
|
|
1032
|
+
};
|
|
1033
|
+
};
|
|
1034
|
+
const replaceFields = (field, flightItinerary) => {
|
|
1035
|
+
return field
|
|
1036
|
+
.replace('OUTBOUND_DEPARTURE', 'outboundFlights.0')
|
|
1037
|
+
.replace('OUTBOUND_ARRIVAL', 'outboundFlights.' + (flightItinerary.outboundFlights.length - 1))
|
|
1038
|
+
.replace('INBOUND_DEPARTURE', 'inboundFlights.0')
|
|
1039
|
+
.replace('INBOUND_ARRIVAL', 'inboundFlights.' +
|
|
1040
|
+
((flightItinerary.inboundFlights || []).length - 1));
|
|
1041
|
+
};
|
|
1042
|
+
const isBetween = (minmax, field) => {
|
|
1043
|
+
return (flightItinerary) => {
|
|
1044
|
+
const val = this.helpers.fromObject(flightItinerary, ...replaceFields(field, flightItinerary).split('.'));
|
|
1045
|
+
return val >= minmax.min && val <= minmax.max;
|
|
1046
|
+
};
|
|
1047
|
+
};
|
|
1048
|
+
const fieldHasValue = (field) => {
|
|
1049
|
+
return (flight, value) => {
|
|
1050
|
+
return flight[field] === value;
|
|
1051
|
+
};
|
|
1052
|
+
};
|
|
1053
|
+
// ! - Outbound and Inbound Filters
|
|
1054
|
+
const outItineraryTesters = [];
|
|
1055
|
+
const inItineraryTesters = [];
|
|
1056
|
+
outItineraryTesters.push(isTimeBetween(filters.arrivalTime, 'OUTBOUND_ARRIVAL.dateTimeArriving'));
|
|
1057
|
+
outItineraryTesters.push(isTimeBetween(filters.departureTime, 'OUTBOUND_DEPARTURE.dateTimeDeparting'));
|
|
1058
|
+
outItineraryTesters.push(isBetween(filters.price, 'total.price'));
|
|
1059
|
+
inItineraryTesters.push(isTimeBetween(filters.returnArrivalTime, 'INBOUND_ARRIVAL.dateTimeArriving'));
|
|
1060
|
+
inItineraryTesters.push(isTimeBetween(filters.returnDepartureTime, 'INBOUND_DEPARTURE.dateTimeDeparting'));
|
|
1061
|
+
// ! - Testers
|
|
1062
|
+
const outJourneyTesters = [];
|
|
1063
|
+
outJourneyTesters.push(tester(filters.classes, fieldHasValue('cabinClass')));
|
|
1064
|
+
const inJourneyTesters = [];
|
|
1065
|
+
inJourneyTesters.push(tester(filters.classes, fieldHasValue('cabinClass')));
|
|
1066
|
+
// !- Itineraries
|
|
1067
|
+
const outFilterItineraries = (flightItinerary, groupIndex) => {
|
|
1068
|
+
return (outItineraryTesters.reduce((acc, tester1) => {
|
|
1069
|
+
acc = acc && tester1(flightItinerary);
|
|
1070
|
+
return acc;
|
|
1071
|
+
}, true) &&
|
|
1072
|
+
(!flightItinerary.outboundFlights ||
|
|
1073
|
+
!!(flightItinerary.outboundFlights || []).find((flightJourney) => {
|
|
1074
|
+
return !!outJourneyTesters.reduce((acc, tester2) => {
|
|
1075
|
+
return acc && tester2(flightJourney);
|
|
1076
|
+
}, true);
|
|
1077
|
+
})));
|
|
1078
|
+
};
|
|
1079
|
+
const inFilterItineraries = (flightItinerary, groupIndex) => {
|
|
1417
1080
|
var _a;
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
.
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
});
|
|
1437
|
-
return Object.values(allAirports);
|
|
1438
|
-
}
|
|
1439
|
-
/**
|
|
1440
|
-
* @description - create select filters for all unique airlines returned in the search
|
|
1441
|
-
* @param results - the flight results
|
|
1442
|
-
*/
|
|
1443
|
-
getAllAirlines(results) {
|
|
1444
|
-
const allAirlines = {};
|
|
1445
|
-
results.forEach((result) => {
|
|
1446
|
-
result.outboundFlights.forEach((outFlight) => {
|
|
1447
|
-
allAirlines[outFlight.operatingCarrier] = {
|
|
1448
|
-
value: outFlight.operatingCarrier,
|
|
1449
|
-
display: outFlight.operatingCarrierName,
|
|
1450
|
-
selected: false
|
|
1451
|
-
};
|
|
1452
|
-
});
|
|
1453
|
-
if (result.inboundFlights) {
|
|
1454
|
-
result.inboundFlights.forEach((inFlight) => {
|
|
1455
|
-
allAirlines[inFlight.operatingCarrier] = {
|
|
1456
|
-
value: inFlight.operatingCarrier,
|
|
1457
|
-
display: inFlight.operatingCarrierName,
|
|
1458
|
-
selected: false
|
|
1459
|
-
};
|
|
1460
|
-
});
|
|
1081
|
+
return (inItineraryTesters.reduce((acc, tester1) => {
|
|
1082
|
+
return acc && tester1(flightItinerary);
|
|
1083
|
+
}, true) &&
|
|
1084
|
+
(!((_a = flightItinerary.inboundFlights) === null || _a === void 0 ? void 0 : _a.length) ||
|
|
1085
|
+
!!(flightItinerary.inboundFlights || []).find((flightJourney) => {
|
|
1086
|
+
return !!inJourneyTesters.reduce((acc, tester2) => {
|
|
1087
|
+
return acc && tester2(flightJourney);
|
|
1088
|
+
}, true);
|
|
1089
|
+
})));
|
|
1090
|
+
};
|
|
1091
|
+
// now finally perform the filtering and go over the results
|
|
1092
|
+
// TODO - add the additional stuff needed for GroupedFlights (Lightning)
|
|
1093
|
+
const fullResultsClone = this.helpers.clone(this.fullResults);
|
|
1094
|
+
for (let i = 0; i < fullResultsClone.length; i++) {
|
|
1095
|
+
const fullResult = fullResultsClone[i];
|
|
1096
|
+
fullResult.journeys = fullResult.journeys.filter(outFilterItineraries);
|
|
1097
|
+
if (this.isReturn) {
|
|
1098
|
+
fullResult.journeys = fullResult.journeys.filter(inFilterItineraries);
|
|
1461
1099
|
}
|
|
1462
|
-
|
|
1463
|
-
|
|
1100
|
+
fullResult.journeys = fullResult.journeys;
|
|
1101
|
+
}
|
|
1102
|
+
this.results.next(fullResultsClone);
|
|
1464
1103
|
}
|
|
1465
1104
|
selectGroupedEurostar(selectedEurostar, fare, direction) {
|
|
1105
|
+
var _a, _b, _c, _d;
|
|
1466
1106
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1467
1107
|
const intBasket = yield this.basketService.getDefaultBasket();
|
|
1468
1108
|
const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
|
|
1109
|
+
// one way easy
|
|
1469
1110
|
if (basket &&
|
|
1470
1111
|
this.originalUserSearch.chosenSearchType === EurostarSearchType.oneWay &&
|
|
1471
1112
|
direction === FlightDirectionEnum.Outbound) {
|
|
@@ -1473,40 +1114,129 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1473
1114
|
outboundFlights: [this.makeSchemaFlights(fare.fare, 'outbound', 0)],
|
|
1474
1115
|
inboundFlights: [],
|
|
1475
1116
|
journeyType: 'single'
|
|
1476
|
-
}, selectedEurostar.dateDeparture);
|
|
1117
|
+
}, selectedEurostar.dateDeparture, null, fare.price);
|
|
1477
1118
|
return;
|
|
1478
1119
|
}
|
|
1120
|
+
// return logic needs updating - either accept outbound or return and somehow distiguish them
|
|
1479
1121
|
if (basket &&
|
|
1480
|
-
this.originalUserSearch.chosenSearchType === EurostarSearchType.return
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1122
|
+
this.originalUserSearch.chosenSearchType === EurostarSearchType.return) {
|
|
1123
|
+
// clicked on an outbound eurostar
|
|
1124
|
+
if (direction === FlightDirectionEnum.Outbound) {
|
|
1125
|
+
// given the outbound but we already have inbound selected
|
|
1126
|
+
if (((_a = this.selectedGroupEurostar) === null || _a === void 0 ? void 0 : _a.direction) === FlightDirectionEnum.Inbound) {
|
|
1127
|
+
// LU logic shows the biggest price across outbound and return
|
|
1128
|
+
const price = this.selectedEurostarFare.item.price > fare.price
|
|
1129
|
+
? this.selectedEurostarFare.item.price
|
|
1130
|
+
: fare.price;
|
|
1131
|
+
this.doBooking(intBasket, selectedEurostar, {
|
|
1132
|
+
inboundFlights: [
|
|
1133
|
+
this.makeSchemaFlights(this.selectedEurostarFare.item.fare, 'inbound', 0)
|
|
1134
|
+
],
|
|
1135
|
+
outboundFlights: [
|
|
1136
|
+
this.makeSchemaFlights(fare.fare, 'outbound', 0)
|
|
1137
|
+
],
|
|
1138
|
+
journeyType: 'roundtrip'
|
|
1139
|
+
}, selectedEurostar.dateDeparture, this.selectedGroupEurostar.item.dateArrival, price);
|
|
1140
|
+
this.resetSelectedFares();
|
|
1141
|
+
this.basketService.toggleMenu();
|
|
1142
|
+
this.results.next(this.fullResults.map(this.removeSelectedFlags));
|
|
1143
|
+
}
|
|
1144
|
+
else if (((_b = this.selectedGroupEurostar) === null || _b === void 0 ? void 0 : _b.direction) === FlightDirectionEnum.Outbound) {
|
|
1145
|
+
this.resetSelectedFares();
|
|
1146
|
+
// we have an outbound already selected - deselect it
|
|
1147
|
+
this.results.next(this.fullResults);
|
|
1148
|
+
}
|
|
1149
|
+
else {
|
|
1150
|
+
// we dont have an inbound selected
|
|
1151
|
+
this.selectedGroupEurostar = {
|
|
1152
|
+
item: selectedEurostar,
|
|
1153
|
+
direction
|
|
1154
|
+
};
|
|
1155
|
+
this.selectedEurostarFare = {
|
|
1156
|
+
item: fare,
|
|
1157
|
+
direction
|
|
1158
|
+
};
|
|
1159
|
+
const index = selectedEurostar.uid;
|
|
1160
|
+
// filter on outbounds as we have selected and added an outbound
|
|
1161
|
+
this.results.next(this.fullResults.map((result) => {
|
|
1162
|
+
const outbound = result.outbound.filter((item) => index === item.uid);
|
|
1163
|
+
return { inbound: result.inbound, outbound };
|
|
1164
|
+
}));
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
else if (direction === FlightDirectionEnum.Inbound) {
|
|
1168
|
+
if (((_c = this.selectedGroupEurostar) === null || _c === void 0 ? void 0 : _c.direction) === FlightDirectionEnum.Outbound) {
|
|
1169
|
+
// essentially add as we did before
|
|
1170
|
+
const price = this.selectedEurostarFare.item.price > fare.price
|
|
1171
|
+
? this.selectedEurostarFare.item.price
|
|
1172
|
+
: fare.price;
|
|
1173
|
+
this.doBooking(intBasket, selectedEurostar, {
|
|
1174
|
+
outboundFlights: [
|
|
1175
|
+
this.makeSchemaFlights(this.selectedEurostarFare.item.fare, 'outbound', 0)
|
|
1176
|
+
],
|
|
1177
|
+
inboundFlights: [this.makeSchemaFlights(fare.fare, 'inbound', 0)],
|
|
1178
|
+
journeyType: 'roundtrip'
|
|
1179
|
+
}, selectedEurostar.dateDeparture, this.selectedGroupEurostar.item.dateArrival, price);
|
|
1180
|
+
this.resetSelectedFares();
|
|
1181
|
+
this.basketService.toggleMenu();
|
|
1182
|
+
this.results.next(this.fullResults.map(this.removeSelectedFlags));
|
|
1183
|
+
}
|
|
1184
|
+
else if (((_d = this.selectedGroupEurostar) === null || _d === void 0 ? void 0 : _d.direction) === FlightDirectionEnum.Inbound) {
|
|
1185
|
+
this.resetSelectedFares();
|
|
1186
|
+
this.results.next(this.fullResults);
|
|
1187
|
+
}
|
|
1188
|
+
else {
|
|
1189
|
+
this.selectedGroupEurostar = {
|
|
1190
|
+
item: selectedEurostar,
|
|
1191
|
+
direction
|
|
1192
|
+
};
|
|
1193
|
+
this.selectedEurostarFare = {
|
|
1194
|
+
item: fare,
|
|
1195
|
+
direction
|
|
1196
|
+
};
|
|
1197
|
+
const index = selectedEurostar.uid;
|
|
1198
|
+
// filter on outbounds as we have selected and added an outbound
|
|
1199
|
+
this.results.next(this.fullResults.map((result) => {
|
|
1200
|
+
const inbound = result.inbound.filter((item) => index === item.uid);
|
|
1201
|
+
return { inbound, outbound: result.outbound };
|
|
1202
|
+
}));
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1502
1205
|
}
|
|
1503
1206
|
});
|
|
1504
1207
|
}
|
|
1208
|
+
resetSelectedFares() {
|
|
1209
|
+
this.selectedGroupEurostar = {
|
|
1210
|
+
direction: null,
|
|
1211
|
+
item: null
|
|
1212
|
+
};
|
|
1213
|
+
this.selectedEurostarFare = {
|
|
1214
|
+
direction: null,
|
|
1215
|
+
item: null
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1218
|
+
removeSelectedFlags(result) {
|
|
1219
|
+
const inbound = result.inbound.map((item) => {
|
|
1220
|
+
item.standardPremierFare.selected = false;
|
|
1221
|
+
item.standardFare.selected = false;
|
|
1222
|
+
item.businessPremierFare.selected = false;
|
|
1223
|
+
return item;
|
|
1224
|
+
});
|
|
1225
|
+
const outbound = result.outbound.map((item) => {
|
|
1226
|
+
item.standardPremierFare.selected = false;
|
|
1227
|
+
item.standardFare.selected = false;
|
|
1228
|
+
item.businessPremierFare.selected = false;
|
|
1229
|
+
return item;
|
|
1230
|
+
});
|
|
1231
|
+
return { inbound, outbound };
|
|
1232
|
+
}
|
|
1505
1233
|
updateLowestPrice(results) {
|
|
1506
|
-
if (!results.length)
|
|
1234
|
+
if (!results.length || this.searchService.isFlightsGrouped())
|
|
1507
1235
|
return;
|
|
1508
1236
|
const result = results[0];
|
|
1509
1237
|
const journeys = result.journeys;
|
|
1238
|
+
if (!journeys.length)
|
|
1239
|
+
return;
|
|
1510
1240
|
const currency = journeys[0].total.currency;
|
|
1511
1241
|
return journeys.reduce((cheapestPrice, result) => {
|
|
1512
1242
|
const price = result.total.price;
|
|
@@ -1515,7 +1245,7 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1515
1245
|
return cheapestPrice;
|
|
1516
1246
|
}, { amount: Number.MAX_SAFE_INTEGER, currencyCode: currency });
|
|
1517
1247
|
}
|
|
1518
|
-
doBooking(intBasket, selectedFlight, schemaDetails, outboundDate, inboundDate) {
|
|
1248
|
+
doBooking(intBasket, selectedFlight, schemaDetails, outboundDate, inboundDate, price) {
|
|
1519
1249
|
const { sourceId, co2PerItem, co2PerPassenger, total } = selectedFlight;
|
|
1520
1250
|
const booking = {
|
|
1521
1251
|
adults: this.adults,
|
|
@@ -1525,7 +1255,7 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1525
1255
|
co2PerPassenger,
|
|
1526
1256
|
currency: total.currency,
|
|
1527
1257
|
detail: schemaDetails,
|
|
1528
|
-
price
|
|
1258
|
+
price,
|
|
1529
1259
|
searchQuery: this.resultQuery,
|
|
1530
1260
|
service: sourceId.toString(),
|
|
1531
1261
|
outboundDate
|
|
@@ -1536,26 +1266,11 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1536
1266
|
this.basketService.addToBasket(booking, intBasket, this.searchService, this.travellers);
|
|
1537
1267
|
}
|
|
1538
1268
|
makeSchemaFlights(selectedFlight, flightGroup, groupIndex, segmentIndex) {
|
|
1539
|
-
return {
|
|
1540
|
-
cabinClass: selectedFlight.cabinClass,
|
|
1541
|
-
dateTimeArriving: selectedFlight.dateTimeArriving,
|
|
1542
|
-
dateTimeArrivingUTC: selectedFlight.dateTimeArrivingUTC,
|
|
1543
|
-
dateTimeDeparting: selectedFlight.dateTimeDeparting,
|
|
1544
|
-
dateTimeDepartingUTC: selectedFlight.dateTimeDepartingUTC,
|
|
1545
|
-
destinationAirport: selectedFlight.destinationAirport,
|
|
1546
|
-
journeyInfo: {
|
|
1269
|
+
return Object.assign(Object.assign({}, selectedFlight), { journeyInfo: {
|
|
1547
1270
|
flightGroup,
|
|
1548
1271
|
groupIndex,
|
|
1549
1272
|
segmentIndex
|
|
1550
|
-
}
|
|
1551
|
-
marketingCarrier: selectedFlight.marketingCarrier,
|
|
1552
|
-
marketingFlightNumber: selectedFlight.marketingFlightNumber,
|
|
1553
|
-
operatingCarrier: selectedFlight.operatingCarrier,
|
|
1554
|
-
operatingFlightNumber: selectedFlight.operatingFlightNumber,
|
|
1555
|
-
originAirport: selectedFlight.originAirport,
|
|
1556
|
-
totalDuration: selectedFlight.totalDuration,
|
|
1557
|
-
fareType: selectedFlight.fareInfo.title
|
|
1558
|
-
};
|
|
1273
|
+
} });
|
|
1559
1274
|
}
|
|
1560
1275
|
createGroupedItem(returnObject, source, outboundFlights, outboundTotalDuration, inboundFlights, inboundTotalDuration) {
|
|
1561
1276
|
if ((outboundFlights === null || outboundFlights === void 0 ? void 0 : outboundFlights.length) && !returnObject.departDateTime) {
|
|
@@ -1588,9 +1303,9 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1588
1303
|
}
|
|
1589
1304
|
makeSessionResults(data) {
|
|
1590
1305
|
return {
|
|
1591
|
-
results:
|
|
1592
|
-
groupData:
|
|
1593
|
-
grouped:
|
|
1306
|
+
results: [],
|
|
1307
|
+
groupData: [],
|
|
1308
|
+
grouped: [],
|
|
1594
1309
|
query: this.resultQuery
|
|
1595
1310
|
};
|
|
1596
1311
|
}
|
|
@@ -1635,6 +1350,7 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1635
1350
|
const inboundDate = eurostarQuote.inboundFlights.length
|
|
1636
1351
|
? moment(eurostarQuote.inboundFlights[0].dateTimeDeparting)
|
|
1637
1352
|
: null;
|
|
1353
|
+
const termsAndConditions = this.getTermsAndCond(eurostarQuote);
|
|
1638
1354
|
const schemaDetails = {
|
|
1639
1355
|
outboundFlights: [
|
|
1640
1356
|
...eurostarQuote.outboundFlights.map((flight, segmentIndex) => this.makeSchemaFlights(flight, 'outbound', 0, segmentIndex))
|
|
@@ -1642,6 +1358,7 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1642
1358
|
inboundFlights: [
|
|
1643
1359
|
...eurostarQuote.inboundFlights.map((flight, segmentIndex) => this.makeSchemaFlights(flight, 'inbound', 0, segmentIndex))
|
|
1644
1360
|
],
|
|
1361
|
+
termsAndCond: termsAndConditions,
|
|
1645
1362
|
journeyType: 'single'
|
|
1646
1363
|
};
|
|
1647
1364
|
const booking = {
|
|
@@ -1666,7 +1383,153 @@ export class EurostarEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1666
1383
|
return Promise.resolve(false); // TODO should this throw an error?
|
|
1667
1384
|
});
|
|
1668
1385
|
}
|
|
1386
|
+
// TODO waiting for data
|
|
1387
|
+
getTermsAndCond(eurostarQuote) {
|
|
1388
|
+
return [
|
|
1389
|
+
{
|
|
1390
|
+
name: 'Penalties',
|
|
1391
|
+
value: ''
|
|
1392
|
+
},
|
|
1393
|
+
{
|
|
1394
|
+
name: 'Eligibility',
|
|
1395
|
+
value: ''
|
|
1396
|
+
},
|
|
1397
|
+
,
|
|
1398
|
+
{
|
|
1399
|
+
name: 'Day/time',
|
|
1400
|
+
value: ''
|
|
1401
|
+
},
|
|
1402
|
+
{
|
|
1403
|
+
name: 'Seasonality',
|
|
1404
|
+
value: ''
|
|
1405
|
+
},
|
|
1406
|
+
{
|
|
1407
|
+
name: 'Flight Application',
|
|
1408
|
+
value: ''
|
|
1409
|
+
},
|
|
1410
|
+
{
|
|
1411
|
+
name: 'Advance Reservations/ticketing',
|
|
1412
|
+
value: ''
|
|
1413
|
+
},
|
|
1414
|
+
{
|
|
1415
|
+
name: 'Maximum Stay',
|
|
1416
|
+
value: ''
|
|
1417
|
+
},
|
|
1418
|
+
{
|
|
1419
|
+
name: 'Minimum Stay',
|
|
1420
|
+
value: ''
|
|
1421
|
+
},
|
|
1422
|
+
{
|
|
1423
|
+
name: 'Stopovers',
|
|
1424
|
+
value: ''
|
|
1425
|
+
},
|
|
1426
|
+
{
|
|
1427
|
+
name: 'Transfers',
|
|
1428
|
+
value: ''
|
|
1429
|
+
},
|
|
1430
|
+
{
|
|
1431
|
+
name: 'Combinations',
|
|
1432
|
+
value: ''
|
|
1433
|
+
},
|
|
1434
|
+
{
|
|
1435
|
+
name: 'Blackout Dates',
|
|
1436
|
+
value: ''
|
|
1437
|
+
},
|
|
1438
|
+
{
|
|
1439
|
+
name: 'Surcharges',
|
|
1440
|
+
value: ''
|
|
1441
|
+
},
|
|
1442
|
+
{
|
|
1443
|
+
name: 'Accompanied Travel',
|
|
1444
|
+
value: ''
|
|
1445
|
+
},
|
|
1446
|
+
{
|
|
1447
|
+
name: 'Travel Restrictions',
|
|
1448
|
+
value: ''
|
|
1449
|
+
},
|
|
1450
|
+
{
|
|
1451
|
+
name: 'Sales Restrictions',
|
|
1452
|
+
value: ''
|
|
1453
|
+
},
|
|
1454
|
+
{
|
|
1455
|
+
name: 'Hip/mileage Exceptions',
|
|
1456
|
+
value: ''
|
|
1457
|
+
},
|
|
1458
|
+
{
|
|
1459
|
+
name: 'Ticket Endorsements',
|
|
1460
|
+
value: ''
|
|
1461
|
+
},
|
|
1462
|
+
{
|
|
1463
|
+
name: 'Children Discounts',
|
|
1464
|
+
value: ''
|
|
1465
|
+
},
|
|
1466
|
+
{
|
|
1467
|
+
name: 'Tour Conductor Discounts',
|
|
1468
|
+
value: ''
|
|
1469
|
+
},
|
|
1470
|
+
{
|
|
1471
|
+
name: 'Agent Discounts',
|
|
1472
|
+
value: ''
|
|
1473
|
+
},
|
|
1474
|
+
{
|
|
1475
|
+
name: 'All Other Discounts',
|
|
1476
|
+
value: ''
|
|
1477
|
+
},
|
|
1478
|
+
{
|
|
1479
|
+
name: 'Miscellaneous Provisions',
|
|
1480
|
+
value: ''
|
|
1481
|
+
},
|
|
1482
|
+
{
|
|
1483
|
+
name: 'Fare By Rule',
|
|
1484
|
+
value: ''
|
|
1485
|
+
},
|
|
1486
|
+
{
|
|
1487
|
+
name: 'Groups',
|
|
1488
|
+
value: ''
|
|
1489
|
+
},
|
|
1490
|
+
{
|
|
1491
|
+
name: 'Tours',
|
|
1492
|
+
value: ''
|
|
1493
|
+
},
|
|
1494
|
+
{
|
|
1495
|
+
name: 'Visit Another Country',
|
|
1496
|
+
value: ''
|
|
1497
|
+
},
|
|
1498
|
+
{
|
|
1499
|
+
name: 'Deposits',
|
|
1500
|
+
value: ''
|
|
1501
|
+
},
|
|
1502
|
+
{
|
|
1503
|
+
name: 'Voluntary Changes',
|
|
1504
|
+
value: ''
|
|
1505
|
+
},
|
|
1506
|
+
{
|
|
1507
|
+
name: 'Voluntary Refunds',
|
|
1508
|
+
value: ''
|
|
1509
|
+
},
|
|
1510
|
+
{
|
|
1511
|
+
name: 'Negotiated Fares',
|
|
1512
|
+
value: ''
|
|
1513
|
+
},
|
|
1514
|
+
{
|
|
1515
|
+
name: 'Rule Application And Other Conditions',
|
|
1516
|
+
value: ''
|
|
1517
|
+
}
|
|
1518
|
+
];
|
|
1519
|
+
}
|
|
1520
|
+
saveSearch() {
|
|
1521
|
+
if (this.isValid.value) {
|
|
1522
|
+
const query = this.getSearchQuery();
|
|
1523
|
+
const favouriteSearchQuery = this.updateSerchQuery(query);
|
|
1524
|
+
const searchInfo = {
|
|
1525
|
+
name: `${moment()}`,
|
|
1526
|
+
serviceType: ServiceType.Eurostar,
|
|
1527
|
+
searchArgs: favouriteSearchQuery
|
|
1528
|
+
};
|
|
1529
|
+
return this.searchService.saveFavouriteSearch(searchInfo);
|
|
1530
|
+
}
|
|
1531
|
+
}
|
|
1669
1532
|
}
|
|
1670
1533
|
EurostarEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_eurostar';
|
|
1671
1534
|
EurostarEnterpriseSearch.STORAGE_SESSION_RESULTS = 'results_eurostar';
|
|
1672
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUl0RCxPQUFPLEVBS0wsUUFBUSxFQU1SLG1CQUFtQixFQUVuQixXQUFXLEVBRVosTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBS0wsbUJBQW1CLEVBUW5CLGlCQUFpQixFQUVsQixNQUFNLGdCQUFnQixDQUFDO0FBT3hCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBY2pFLE9BQU8sRUFHTCxVQUFVLEVBQ1gsTUFBTSw0QkFBNEIsQ0FBQztBQU1wQyxNQUFNLGVBQWUsR0FBa0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNuRCxLQUFLLEVBQUUsRUFBRTtJQUNULFdBQVcsRUFBRSxFQUFFO0lBQ2YsT0FBTyxFQUFFLEVBQUU7SUFDWCxRQUFRLEVBQUUsRUFBRTtJQUNaLFlBQVksRUFBRSxFQUFFO0lBQ2hCLGVBQWUsRUFBRSxFQUFFO0lBQ25CLHFCQUFxQixFQUFFLEVBQUU7SUFDekIsY0FBYyxFQUFFLEVBQUU7SUFDbEIsb0JBQW9CLEVBQUUsRUFBRTtJQUN4QixPQUFPLEVBQUUsRUFBRTtJQUNYLFNBQVMsRUFBRSxFQUFFO0lBQ2IsS0FBSyxFQUFFO1FBQ0wsR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDNUIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7S0FD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V0FBVyxDQUFDO2lCQUN6QztnQkFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUNuQyxPQUFPLEVBQ1AsU0FBUyxFQUNULElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7YUFDSDtZQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztRQUNwRSxDQUFDO0tBQUE7O0FBcnNFZSwrQ0FBc0IsR0FBRyxpQkFBaUIsQ0FBQztBQUMzQyxnREFBdUIsR0FBRyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQmFzZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuL2Jhc2UtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IEJhc2VTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4vaGVscGVycyc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFZhbHVlRGlzcGxheSB9IGZyb20gJy4uL2ludGVyZmFjZXMvdmFsdWUtZGlzcGxheSc7XHJcbmltcG9ydCB7IEZsaWdodEZpbHRlcnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2ZsaWdodC1maWx0ZXJzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFNlbGVjdEZpbHRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VsZWN0LWZpbHRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIEFkZEl0ZW1Ub0Jhc2tldE11dGF0aW9uVmFyaWFibGVzLFxyXG4gIEJhc2tldEl0ZW0sXHJcbiAgQ3VycmVuY3lDb2RlLFxyXG4gIERlc3RpbmF0aW9uRW50cnksXHJcbiAgRmFyZVR5cGUsXHJcbiAgRmxpZ2h0Q2FiaW5DbGFzcyxcclxuICBGbGlnaHRGYXJlVG90YWwsXHJcbiAgRmxpZ2h0SXRpbmVyYXJ5LFxyXG4gIEZsaWdodEpvdXJuZXksXHJcbiAgRmxpZ2h0UGFzc2VuZ2VyT2JqZWN0LFxyXG4gIEZsaWdodFBhc3NlbmdlclR5cGUsXHJcbiAgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VydmljZVR5cGUsXHJcbiAgU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzXHJcbn0gZnJvbSAnLi4vdHlwZXMvZ3JhcGhxbC50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgRXVyb3N0YXJRdW90ZVJlc3VsdCxcclxuICBOZ2JEYXRlU3RydWN0LFxyXG4gIE9CVEFpcnBvcnREZXRhaWxzLFxyXG4gIE9CVEFpcmxpbmVzRGV0YWlscyxcclxuICBGbGlnaHREaXJlY3Rpb25FbnVtLFxyXG4gIEdyb3VwZWRGbGlnaHRzLFxyXG4gIEZsaWdodEl0aW5lcmFyeVdpdGhTZWxlY3RlZCxcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgRXVyb3N0YXJHcm91cGVkUXVvdGVSZXN1bHQsXHJcbiAgRXVyb3N0YXJSZXN1bHRzLFxyXG4gIEV1cm9zdGFySXRlbSxcclxuICBFdXJvc3RhckZhcmUsXHJcbiAgRXVyb3N0YXJDbGFzc0VudW0sXHJcbiAgRXVyb3N0YXJRdW90ZVJlc3VsdEFycmF5XHJcbn0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEZ1bGxVc2VyRGV0YWlscyxcclxuICBVc2VyU2VydmljZUludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSXVzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJQ2hlYXBlc3RQcmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlYXBlc3QtcHJpY2UnO1xyXG5pbXBvcnQgeyBFdXJvc3RhclNlYXJjaFR5cGUgfSBmcm9tICcuL2V1cm9zdGFyLXNlYXJjaC10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBJTXVsdGlEZXN0aW5hdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvZmxpZ2h0LW11bHRpLWRlc3RpbmF0aW9uLmludGVyZmFjZSc7XHJcbmltcG9ydCB7XHJcbiAgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0llbnRlcnByaXNlLWJhc2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBCYXNlRXVyb3N0YXJRdW90ZUZldGNoZXIsXHJcbiAgRXVyb3N0YXJRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZXVyb3N0YXItcXVvdGUuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlLFxyXG4gIEV1cm9zdGFyVGVtcFBhcmFtc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWV1cm9zdGFyLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHtcclxuICBGbGlnaHRHcm91cHMsXHJcbiAgRmxpZ2h0T3BlcmF0b3IsXHJcbiAgVGltZVdpbmRvd1xyXG59IGZyb20gJy4vZmxpZ2h0LWVudGVycHJpc2Utc2VhcmNoJztcclxuZXhwb3J0IGludGVyZmFjZSBBbGxvd2VkQ2xhc3NFdXJvc3RhciB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHR5cGU6IEV1cm9zdGFyQ2xhc3NFbnVtIHwgbnVsbDtcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9GSUxURVJTOiBGbGlnaHRGaWx0ZXJzID0gT2JqZWN0LmZyZWV6ZSh7XHJcbiAgc3RvcHM6IHt9LFxyXG4gIG11c3RJbmNsdWRlOiB7fSxcclxuICBjbGFzc2VzOiB7fSxcclxuICBhaXJsaW5lczoge30sXHJcbiAgdHJhdmVsUG9saWN5OiB7fSxcclxuICBkZXBhdHVyZUFpcnBvcnQ6IHt9LFxyXG4gIGRlcGF0dXJlUmV0dXJuQWlycG9ydDoge30sXHJcbiAgYXJyaXZhbEFpcnBvcnQ6IHt9LFxyXG4gIGFycml2YWxSZXR1cm5BaXJwb3J0OiB7fSxcclxuICBiYWdnYWdlOiB7fSxcclxuICBmYXJlVHlwZXM6IHt9LFxyXG4gIHByaWNlOiB7XHJcbiAgICBtaW46IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxyXG4gICAgbWF4OiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUlxyXG4gIH0sXHJcbiAgZHVyYXRpb246IHtcclxuICAgIG1pbjogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXHJcbiAgICBtYXg6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXHJcbiAgfSxcclxuICByZXR1cm5EdXJhdGlvbjoge1xyXG4gICAgbWluOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcclxuICAgIG1heDogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcclxuICB9LFxyXG4gIGRlcGFydHVyZVRpbWU6IHtcclxuICAgIG1pbjogMCxcclxuICAgIG1heDogMjM1OVxyXG4gIH0sXHJcbiAgYXJyaXZhbFRpbWU6IHtcclxuICAgIG1pbjogMCxcclxuICAgIG1heDogMjM1OVxyXG4gIH0sXHJcbiAgcmV0dXJuRGVwYXJ0dXJlVGltZToge1xyXG4gICAgbWluOiAwLFxyXG4gICAgbWF4OiAyMzU5XHJcbiAgfSxcclxuICByZXR1cm5BcnJpdmFsVGltZToge1xyXG4gICAgbWluOiAwLFxyXG4gICAgbWF4OiAyMzU5XHJcbiAgfSxcclxuXHJcbiAgZmxpZ2h0TnVtYmVyOiAnJ1xyXG59KSBhcyBGbGlnaHRGaWx0ZXJzO1xyXG5cclxuZXhwb3J0IHR5cGUgQWxsb3dlZENsYXNzZXNFdXJvc3RhciA9IEFsbG93ZWRDbGFzc0V1cm9zdGFyW107XHJcblxyXG5leHBvcnQgdHlwZSBFdXJvc3RhclN0YXRpb24gPSB7XHJcbiAgZ2F0ZXdheTogc3RyaW5nO1xyXG4gIGRlc3RpbmF0aW9uOiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZW51bSBTb3J0VHlwZXNFdXJvc3RhciB7XHJcbiAgQ2hlYXBlc3RGaXJzdCA9ICdDJyxcclxuICBFYXJsaWVzdEZpcnN0ID0gJ0UnLFxyXG4gIExhdGVzdEZpcnN0ID0gJ0wnXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFNvcnRNZXRob2Qge1xyXG4gIHNvcnRCeVByaWNlID0gJ3NvcnRCeVByaWNlJyxcclxuICBzb3J0QnlEYXRlID0gJ3NvcnRCeURhdGUnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU29ydFR5cGVFdXJvc3RhciB7XHJcbiAgLyoqIFRpdGxlIGRpc3BsYXllZCBvbiBkcm9wZG93biAqL1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgLyoqIE1ldGhvZCBuYW1lIHVzZWQgYnkgY29tcG9uZW50IHRvIHNvcnQgcmVzdWx0cyAqL1xyXG4gIG1ldGhvZDogU29ydE1ldGhvZDtcclxuICAvKiogSWNvbiBkaXNwbGF5ZWQgb24gZHJvcCBkb3duICovXHJcbiAgaWNvbjogc3RyaW5nO1xyXG4gIC8qKiBTb3J0aW5nIGRpcmVjdGlvbiB0cnVlIGZvciBhc2MsIGZhbHNlIGZvciBkc2MgKi9cclxuICBkaXI6IGJvb2xlYW47XHJcbiAgLy8gdGhpcyBpcyB3aGF0IHdlIHdpbGwgdXNlIHRvIHNvcnRcclxuICBjb2RlOiBTb3J0VHlwZXNFdXJvc3RhcjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRXVyb3N0YXJHcm91cHMgPSAnU3RhbmRhcmQnIHwgJ1N0YW5kYXJkUHJlbWllcicgfCAnQnVzaW5lc3NQcmVtaWVyJztcclxuXHJcbmludGVyZmFjZSBFdXJvc3RhclNlc3Npb25UeXBlIHtcclxuICByZXN1bHRzOiBFdXJvc3RhclF1b3RlUmVzdWx0QXJyYXk7XHJcbiAgZ3JvdXBEYXRhOiB7IFtrZXk6IG51bWJlcl06IG51bWJlcltdIH07XHJcbiAgZ3JvdXBlZDogR3JvdXBlZEZsaWdodHM7XHJcbiAgcXVlcnk6IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoPFNFX1EgZXh0ZW5kcyBFdXJvc3RhclF1b3RlRmV0Y2hlclR5cGU+XHJcbiAgZXh0ZW5kcyBCYXNlRW50ZXJwcmlzZVNlYXJjaDxcclxuICAgIEV1cm9zdGFyVGVtcFBhcmFtcyxcclxuICAgIEV1cm9zdGFyUXVvdGVSZXN1bHQsXHJcbiAgICBFdXJvc3RhclF1b3RlUmVzdWx0QXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBFdXJvc3RhckVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2Vcclxue1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUEFSQU1TID0gJ3NlYXJjaF9ldXJvc3Rhcic7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTID0gJ3Jlc3VsdHNfZXVyb3N0YXInO1xyXG5cclxuICBwdWJsaWMgdHlwZTogU2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5FdXJvc3RhcjtcclxuXHJcbiAgYXZhbGlhYmxlQ2xhc3NlczogQmVoYXZpb3JTdWJqZWN0PEFsbG93ZWRDbGFzc2VzRXVyb3N0YXI+ID1cclxuICAgIG5ldyBCZWhhdmlvclN1YmplY3Q8QWxsb3dlZENsYXNzZXNFdXJvc3Rhcj4oW10pO1xyXG4gIHRpbWVDcml0ZXJpYU9wdGlvbnM6IEJlaGF2aW9yU3ViamVjdDxUaW1lV2luZG93W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcclxuICAgIFRpbWVXaW5kb3dbXVxyXG4gID4oW10pO1xyXG4gIGZsaWdodE9wZXJhdG9yczogQmVoYXZpb3JTdWJqZWN0PEZsaWdodE9wZXJhdG9yW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcclxuICAgIEZsaWdodE9wZXJhdG9yW11cclxuICA+KFtdKTtcclxuXHJcbiAgcHJpdmF0ZSBfbmVnb3RpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX25lYXJieV9haXJwb3J0czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF90aW1lQXJyYXk6IFZhbHVlRGlzcGxheVtdO1xyXG4gIHByaXZhdGUgX3NvcnRBcnJheTogU29ydFR5cGVFdXJvc3RhcltdID0gW1xyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ1ByaWNlJyxcclxuICAgICAgbWV0aG9kOiBTb3J0TWV0aG9kLnNvcnRCeVByaWNlLFxyXG4gICAgICBpY29uOiAnaWNvLWRvbGxhcicsXHJcbiAgICAgIGRpcjogdHJ1ZSxcclxuICAgICAgY29kZTogU29ydFR5cGVzRXVyb3N0YXIuQ2hlYXBlc3RGaXJzdFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdUaW1lJyxcclxuICAgICAgbWV0aG9kOiBTb3J0TWV0aG9kLnNvcnRCeURhdGUsXHJcbiAgICAgIGljb246ICdpY28tY2FsZW5kYXInLFxyXG4gICAgICBkaXI6IHRydWUsXHJcbiAgICAgIGNvZGU6IFNvcnRUeXBlc0V1cm9zdGFyLkVhcmxpZXN0Rmlyc3RcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnVGltZSAoRGVzY2VuZGluZyknLFxyXG4gICAgICBtZXRob2Q6IFNvcnRNZXRob2Quc29ydEJ5RGF0ZSxcclxuICAgICAgaWNvbjogJ2ljby1jYWxlbmRhcicsXHJcbiAgICAgIGRpcjogdHJ1ZSxcclxuICAgICAgY29kZTogU29ydFR5cGVzRXVyb3N0YXIuTGF0ZXN0Rmlyc3RcclxuICAgIH1cclxuICBdO1xyXG5cclxuICBwcml2YXRlIF9mYXJlVHlwZUFycmF5OiBWYWx1ZURpc3BsYXlbXSA9IFtcclxuICAgIHsgdmFsdWU6IEZhcmVUeXBlLkZsZXhpYmxlLCBkaXNwbGF5OiAnRmxleGlibGUnIH0sXHJcbiAgICB7IHZhbHVlOiBGYXJlVHlwZS5MZWlzdXJlLCBkaXNwbGF5OiAnTGVpc3VyZScgfSxcclxuICAgIHsgdmFsdWU6IEZhcmVUeXBlLkxvd2VzdCwgZGlzcGxheTogJ0xvd2VzdCcgfSxcclxuICAgIHsgdmFsdWU6IEZhcmVUeXBlLk5lZ290aWF0ZWQsIGRpc3BsYXk6ICdOZWdvdGlhdGVkJyB9LFxyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuTm9uTmVnb3RpYXRlZCwgZGlzcGxheTogJ05vbi1OZWdvdGlhdGVkJyB9LFxyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuUmVxdWVzdEZhcmVSdWxlcywgZGlzcGxheTogJ1JlcXVlc3QgRmFyZSBSdWxlcycgfSxcclxuICAgIHsgdmFsdWU6IEZhcmVUeXBlLlNlbGVjdEFuZFBybywgZGlzcGxheTogJ1NlbGVjdCAmIFBybycgfVxyXG4gIF07XHJcblxyXG4gIHB1YmxpYyBtaW5pbXVtT3V0Qm91bmREYXRlID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKClcclxuICB9O1xyXG5cclxuICBwdWJsaWMgbWluaW11bUluQm91bmREYXRlID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKClcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc2VhcmNoVHlwZXM6IFZhbHVlRGlzcGxheVtdID0gW1xyXG4gICAgeyB2YWx1ZTogRXVyb3N0YXJTZWFyY2hUeXBlLnJldHVybiwgZGlzcGxheTogJ1JldHVybicgfSxcclxuICAgIHsgdmFsdWU6IEV1cm9zdGFyU2VhcmNoVHlwZS5vbmVXYXksIGRpc3BsYXk6ICdPbmUtd2F5JyB9XHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSBfb3V0RGF0ZTogTmdiRGF0ZVN0cnVjdDtcclxuICBwcml2YXRlIF9vdXRUaW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfaW5EYXRlOiBOZ2JEYXRlU3RydWN0O1xyXG4gIHByaXZhdGUgX2luVGltZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2Rlc3RpbmF0aW9uQWlycG9ydDogYW55O1xyXG4gIHByaXZhdGUgX29yaWdpbkFpcnBvcnQ6IGFueTtcclxuICBwcml2YXRlIF9wYXNzZW5nZXJzOiBhbnk7XHJcbiAgcHJpdmF0ZSBncm91cGVkT2JqZWN0OiBGbGlnaHRJdGluZXJhcnlXaXRoU2VsZWN0ZWRbXTtcclxuICBwcm90ZWN0ZWQgZmxpZ2h0c1RvR3JvdXA6IHsgW2tleTogbnVtYmVyXTogbnVtYmVyW10gfSA9IHt9O1xyXG4gIHByb3RlY3RlZCByZXN1bHRRdWVyeTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXM7XHJcbiAgcHJvdGVjdGVkIGdyb3VwZWQ6IEdyb3VwZWRGbGlnaHRzID0gbnVsbDtcclxuICB0cmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXSA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIHJlc3VsdHNTZXNzaW9uTmFtZSA9XHJcbiAgICBFdXJvc3RhckVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcbiAgcHJvdGVjdGVkIG11bHRpUmVzdWx0c1Nlc3Npb25OYW1lID0gRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG5cclxuICBzZWxlY3RlZEdyb3VwRmxpZ2h0OiBGbGlnaHRJdGluZXJhcnlXaXRoU2VsZWN0ZWQ7XHJcbiAgcHJpdmF0ZSBfZGlzcGxheUFkZEhvdGVsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZmlsdGVyczogQmVoYXZpb3JTdWJqZWN0PEZsaWdodEZpbHRlcnM+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChcclxuICAgIERFRkFVTFRfRklMVEVSU1xyXG4gICk7XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzcGxheUFkZEhvdGVsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlBZGRIb3RlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZGlzcGxheUFkZEhvdGVsKG5ld1ZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZGlzcGxheUFkZEhvdGVsID0gbmV3VmFsO1xyXG4gIH1cclxuICBzZWxlY3RlZEdyb3VwRXVyb3N0YXI6IEV1cm9zdGFySXRlbTtcclxuICBzZWxlY3RlZEV1cm9zdGFyRmFyZTogRXVyb3N0YXJGYXJlO1xyXG5cclxuICBwdWJsaWMgZ2V0IHRpbWVBcnJheSgpIHtcclxuICAgIHRoaXMuX3RpbWVBcnJheSA9XHJcbiAgICAgIHRoaXMuX3RpbWVBcnJheSB8fFxyXG4gICAgICBBcnJheSg5NilcclxuICAgICAgICAuZmlsbCgwKVxyXG4gICAgICAgIC5tYXAoKF8sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbHVlOlxyXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoaW5kZXggLyA0KVxyXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgIC5wYWRTdGFydCgyLCAnMCcpICtcclxuICAgICAgICAgICAgICAnOicgK1xyXG4gICAgICAgICAgICAgICgoaW5kZXggJSA0KSAqIDE1KS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksXHJcbiAgICAgICAgICAgIGRpc3BsYXk6XHJcbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihpbmRleCAvIDQpXHJcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDIsICcwJykgK1xyXG4gICAgICAgICAgICAgICc6JyArXHJcbiAgICAgICAgICAgICAgKChpbmRleCAlIDQpICogMTUpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLl90aW1lQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHByZWZlcnJlZENhcnJpZXJzKCk6IE9CVEFpcmxpbmVzRGV0YWlsc1tdIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHByZWZlcnJlZENhcnJpZXJzKHZhbHVlOiBPQlRBaXJsaW5lc0RldGFpbHNbXSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yMSgpOiBPQlRBaXJsaW5lc0RldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVyc1swXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb3BlcmF0b3IxKHZhbHVlOiBPQlRBaXJsaW5lc0RldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVyc1swXSA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yMigpOiBPQlRBaXJsaW5lc0RldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVyc1sxXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb3BlcmF0b3IyKHZhbHVlOiBPQlRBaXJsaW5lc0RldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVyc1sxXSA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yMygpOiBPQlRBaXJsaW5lc0RldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVyc1syXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb3BlcmF0b3IzKHZhbHVlOiBPQlRBaXJsaW5lc0RldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVyc1syXSA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yNCgpOiBPQlRBaXJsaW5lc0RldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVyc1szXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb3BlcmF0b3I0KHZhbHVlOiBPQlRBaXJsaW5lc0RldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVyc1szXSA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbWluRGF0ZTogTmdiRGF0ZVN0cnVjdDtcclxuICBwdWJsaWMgZ2V0IG1pbkRhdGUoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICB0aGlzLl9taW5EYXRlID0gdGhpcy5fbWluRGF0ZSB8fCB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUobW9tZW50KCkpO1xyXG4gICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFkdWx0cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5hZHVsdHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGFkdWx0cyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzID0gTnVtYmVyKHZhbHVlKTtcclxuICAgIHRoaXMudXBkYXRlVHJhdmVsbGVycygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjaGlsZHJlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY2hpbGRyZW4odmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID0gTnVtYmVyKHZhbHVlKTtcclxuICAgIHRoaXMudXBkYXRlVHJhdmVsbGVycygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkZXBhcnRMb2NhdGlvbigpOiBzdHJpbmcgfCBPQlRBaXJwb3J0RGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmRlcGFydExvY2F0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBkZXBhcnRMb2NhdGlvbih2YWx1ZTogc3RyaW5nIHwgT0JUQWlycG9ydERldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5kZXBhcnRMb2NhdGlvbiA9IHZhbHVlO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5fb3JpZ2luQWlycG9ydCA9ICcnO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS5nYXRld2F5KSB7XHJcbiAgICAgIHRoaXMuX29yaWdpbkFpcnBvcnQgPSB2YWx1ZS5nYXRld2F5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fb3JpZ2luQWlycG9ydCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHF1ZXJ5T3JpZ2luQWlwb3J0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luQWlycG9ydDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgcXVlcnlEZXN0aW5hdGlvbkFpcG9ydCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3RpbmF0aW9uQWlycG9ydDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGVwYXJ0RGF0ZSgpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9vdXREYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBkZXBhcnREYXRlKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9vdXREYXRlID0gdmFsdWU7XHJcbiAgICB0aGlzLm91dEJvdW5kRGF0ZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgdGhpcy5fb3V0RGF0ZSxcclxuICAgICAgdGhpcy5fb3V0VGltZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGVwYXJ0VGltZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX291dFRpbWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRlcGFydFRpbWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fb3V0VGltZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5vdXRCb3VuZERhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQoXHJcbiAgICAgIHRoaXMuX291dERhdGUsXHJcbiAgICAgIHRoaXMuX291dFRpbWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG91dEJvdW5kRGF0ZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBvdXRCb3VuZERhdGUodmFsdWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHZhbHVlID0gbW9tZW50KHZhbHVlKTtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vdXRCb3VuZERhdGUgPSB2YWx1ZS5pc1ZhbGlkKCkgPyB2YWx1ZSA6IG51bGw7XHJcbiAgICB0aGlzLm1pbmltdW1JbkJvdW5kRGF0ZSA9IHtcclxuICAgICAgeWVhcjogdmFsdWUueWVhcigpLFxyXG4gICAgICBtb250aDogdmFsdWUubW9udGgoKSArIDEsXHJcbiAgICAgIGRheTogdmFsdWUuZGF0ZSgpXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZSAmJlxyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuaW5ib3VuZERhdGUgJiZcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZS5pc0FmdGVyKHRoaXMudGVtcFBhcmFtcy5pbmJvdW5kRGF0ZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLmluYm91bmREYXRlID0gbW9tZW50KHRoaXMudGVtcFBhcmFtcy5vdXRCb3VuZERhdGUpLmFkZCgxLCAnZGF5Jyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vdXREYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKHZhbHVlKTtcclxuICAgIHRoaXMuX291dFRpbWUgPSB0aGlzLmhlbHBlcnMuZm9ybWF0VGltZUNvbG9uKHZhbHVlKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgcmV0dXJuRGF0ZSgpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9pbkRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHJldHVybkRhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX2luRGF0ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pbmJvdW5kRGF0ZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudCh0aGlzLl9pbkRhdGUsIHRoaXMuX2luVGltZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFycml2ZVRpbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9pblRpbWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGFycml2ZVRpbWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5faW5UaW1lID0gdmFsdWU7XHJcbiAgICB0aGlzLmluYm91bmREYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHRoaXMuX2luRGF0ZSwgdGhpcy5faW5UaW1lKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaW5ib3VuZERhdGUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBpbmJvdW5kRGF0ZSh2YWx1ZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgdmFsdWUgPSBtb21lbnQodmFsdWUpO1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlID0gdmFsdWUuaXNWYWxpZCgpID8gdmFsdWUgOiBudWxsO1xyXG4gICAgdGhpcy5faW5EYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKHZhbHVlKTtcclxuICAgIHRoaXMuX2luVGltZSA9IHRoaXMuaGVscGVycy5mb3JtYXRUaW1lQ29sb24odmFsdWUpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhcnJpdmVMb2NhdGlvbigpOiBzdHJpbmcgfCBPQlRBaXJwb3J0RGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFycml2ZUxvY2F0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBhcnJpdmVMb2NhdGlvbih2YWx1ZTogc3RyaW5nIHwgT0JUQWlycG9ydERldGFpbHMpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5hcnJpdmVMb2NhdGlvbiA9IHZhbHVlO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0ID0gJyc7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLmdhdGV3YXkpIHtcclxuICAgICAgdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0ID0gdmFsdWUuZ2F0ZXdheTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uQWlycG9ydCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FiaW5DbGFzcygpOiBGbGlnaHRDYWJpbkNsYXNzIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNhYmluQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBzZXQgY2FiaW5DbGFzcyh2YWx1ZTogRmxpZ2h0Q2FiaW5DbGFzcyB8IG51bGwpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jYWJpbkNsYXNzID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcmV0dXJuQ2FiaW5DbGFzcygpOiBGbGlnaHRDYWJpbkNsYXNzIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnJldHVybkNhYmluQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBzZXQgcmV0dXJuQ2FiaW5DbGFzcyh2YWx1ZTogRmxpZ2h0Q2FiaW5DbGFzcyB8IG51bGwpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5yZXR1cm5DYWJpbkNsYXNzID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2hvc2VuU2VhcmNoVHlwZSgpOiBFdXJvc3RhclNlYXJjaFR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hUeXBlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNob3NlblNlYXJjaFR5cGUodHlwZTogRXVyb3N0YXJTZWFyY2hUeXBlKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2hvc2VuU2VhcmNoVHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNSZXR1cm4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNob3NlblNlYXJjaFR5cGUgPT09IEV1cm9zdGFyU2VhcmNoVHlwZS5yZXR1cm47XHJcbiAgfVxyXG5cclxuICBnZXQgb3V0VGltZUNyaXRlcmlhKCk6IFRpbWVXaW5kb3cge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5vdXRUaW1lQ3JpdGVyaWE7XHJcbiAgfVxyXG5cclxuICBzZXQgb3V0VGltZUNyaXRlcmlhKHZhbHVlOiBUaW1lV2luZG93KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMub3V0VGltZUNyaXRlcmlhID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5UaW1lQ3JpdGVyaWEoKTogVGltZVdpbmRvdyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmluVGltZUNyaXRlcmlhO1xyXG4gIH1cclxuXHJcbiAgc2V0IGluVGltZUNyaXRlcmlhKHZhbHVlOiBUaW1lV2luZG93KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaW5UaW1lQ3JpdGVyaWEgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcbiAgZ2V0IG1heENvbm5lY3Rpb25zKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm1heENvbm5lY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgc2V0IG1heENvbm5lY3Rpb25zKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5tYXhDb25uZWN0aW9ucyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbXVsdGlEZXN0aW5hdGlvbjogRGVzdGluYXRpb25FbnRyeVtdID0gW107XHJcbiAgZ2V0IG11bHRpRGVzdGluYXRpb24oKTogSU11bHRpRGVzdGluYXRpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm11bHRpRGVzdGluYXRpb247XHJcbiAgfVxyXG5cclxuICBzZXQgbXVsdGlEZXN0aW5hdGlvbih2YWx1ZUFycmF5OiBJTXVsdGlEZXN0aW5hdGlvbltdKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubXVsdGlEZXN0aW5hdGlvbiA9IHZhbHVlQXJyYXk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBzZXRNdWx0aURlc3RpbmF0aW9uUXVlcnkobXVsdGlEZXN0aW5hdGlvbjogSU11bHRpRGVzdGluYXRpb25bXSkge1xyXG4gICAgY29uc3QgbmV3TXVsdGlEZXN0aW5hdGlvbiA9IHRoaXMuaGVscGVycy5jbG9uZShtdWx0aURlc3RpbmF0aW9uKTtcclxuICAgIHJldHVybiBuZXdNdWx0aURlc3RpbmF0aW9uLnJlZHVjZShcclxuICAgICAgKGRlc3RpbmF0aW9uQXJyYXk6IERlc3RpbmF0aW9uRW50cnlbXSwgaXRlbTogSU11bHRpRGVzdGluYXRpb24pID0+IHtcclxuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbk9iamVjdCA9IHt9IGFzIERlc3RpbmF0aW9uRW50cnk7XHJcbiAgICAgICAgZGVzdGluYXRpb25PYmplY3Qub3JpZyA9IGl0ZW0ub3JpZy5nYXRld2F5O1xyXG4gICAgICAgIGRlc3RpbmF0aW9uT2JqZWN0LmRlc3QgPSBpdGVtLmRlc3QuZ2F0ZXdheTtcclxuICAgICAgICBkZXN0aW5hdGlvbk9iamVjdC5kYXRlID0gdGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGUoaXRlbS5kYXRlKTtcclxuICAgICAgICBkZXN0aW5hdGlvbkFycmF5LnB1c2goZGVzdGluYXRpb25PYmplY3QpO1xyXG4gICAgICAgIHJldHVybiBkZXN0aW5hdGlvbkFycmF5O1xyXG4gICAgICB9LFxyXG4gICAgICBbXSBhcyBEZXN0aW5hdGlvbkVudHJ5W11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgb25seVxyXG4gIGdldCBzb3J0RHJvcGRvd25WYWx1ZXMoKTogU29ydFR5cGVFdXJvc3RhcltdIHtcclxuICAgIHJldHVybiB0aGlzLl9zb3J0QXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmFyZVR5cGVzVmFsdWVzKCk6IFZhbHVlRGlzcGxheVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9mYXJlVHlwZUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZhcmVUeXBlKCk6IEZhcmVUeXBlIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuZmFyZVR5cGU7XHJcbiAgfVxyXG5cclxuICBzZXQgZmFyZVR5cGUodmFsdWU6IEZhcmVUeXBlKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuZmFyZVR5cGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBuZWdvdGlhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgbmVnb3RpYXRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fbmVnb3RpYXRlZCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGluY2x1ZGVOZWFyYnlBaXJwb3J0cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuaW5jbHVkZU5lYXJieUFpcnBvcnRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGluY2x1ZGVOZWFyYnlBaXJwb3J0cyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmluY2x1ZGVOZWFyYnlBaXJwb3J0cyA9IHZhbHVlO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZXVyb3N0YXJGZXRjaGVyOiBCYXNlRXVyb3N0YXJRdW90ZUZldGNoZXI8U0VfUT4sXHJcbiAgICBwcml2YXRlIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZTogRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBzdG9yYWdlU2VydmljZTogQmFzZVN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZVxyXG4gICkge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAocmVzdWx0czE6IEV1cm9zdGFyUXVvdGVSZXN1bHQpOiBFdXJvc3RhclF1b3RlUmVzdWx0QXJyYXkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzdWx0UXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucmVzdWx0UXVlcnkud2l0aEdyb3VwZWQ7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzLm5leHQoXHJcbiAgICAgICAgICB0aGlzLmhlbHBlcnMuY3JlYXRlRmxpZ2h0RmlsdGVycyhyZXN1bHRzMS5qb3VybmV5cywgREVGQVVMVF9GSUxURVJTKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHJlc3VsdHMxICYmIHRoaXMuc2VhcmNoU2VydmljZS5pc0ZsaWdodHNHcm91cGVkKCkpIHtcclxuICAgICAgICAgIGNvbnN0IHJldHVybmRhdGEgPSAocmVzdWx0czEuam91cm5leXMgfHwgW10pLnJlZHVjZShcclxuICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgIGFjYzogRXVyb3N0YXJSZXN1bHRzLFxyXG4gICAgICAgICAgICAgIHJlc3VsdDogRmxpZ2h0SXRpbmVyYXJ5XHJcbiAgICAgICAgICAgICk6IEV1cm9zdGFyUmVzdWx0cyA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBldXJvUmVzdWx0ID0gdGhpcy5mb3JtYXRFdXJvc3RhclJlc3VsdHMoXHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5vdXRib3VuZEZsaWdodHMsXHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC50b3RhbFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGV1cm9SZXN1bHQuY28yUGVyUGFzc2VuZ2VyID0gcmVzdWx0LmNvMlBlclBhc3NlbmdlcjtcclxuICAgICAgICAgICAgICAgIGV1cm9SZXN1bHQuY28yUGVySXRlbSA9IHJlc3VsdC5jbzJQZXJJdGVtO1xyXG4gICAgICAgICAgICAgICAgZXVyb1Jlc3VsdC5zb3VyY2VJZCA9IHJlc3VsdC5zb3VyY2VJZDtcclxuICAgICAgICAgICAgICAgIGV1cm9SZXN1bHQudG90YWwgPSByZXN1bHQudG90YWw7XHJcbiAgICAgICAgICAgICAgICBldXJvUmVzdWx0LmR1cmF0aW9uID0gdGhpcy5taW5Ub0hvdXIoXHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5vdXRib3VuZFRvdGFsRHVyYXRpb25cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICFhY2Mub3V0Ym91bmQuZmluZChcclxuICAgICAgICAgICAgICAgICAgICAoaXRlbTogRXVyb3N0YXJJdGVtKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5kYXRlRGVwYXJ0dXJlID09PSBldXJvUmVzdWx0LmRhdGVEZXBhcnR1cmVcclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgIGFjYy5vdXRib3VuZC5wdXNoKGV1cm9SZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pbmJvdW5kRmxpZ2h0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV1cm9SZXN1bHQgPSB0aGlzLmZvcm1hdEV1cm9zdGFyUmVzdWx0cyhcclxuICAgICAgICAgICAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzLFxyXG4gICAgICAgICAgICAgICAgICByZXN1bHQudG90YWxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBldXJvUmVzdWx0LmNvMlBlclBhc3NlbmdlciA9IHJlc3VsdC5jbzJQZXJQYXNzZW5nZXI7XHJcbiAgICAgICAgICAgICAgICBldXJvUmVzdWx0LmNvMlBlckl0ZW0gPSByZXN1bHQuY28yUGVySXRlbTtcclxuICAgICAgICAgICAgICAgIGV1cm9SZXN1bHQuc291cmNlSWQgPSByZXN1bHQuc291cmNlSWQ7XHJcbiAgICAgICAgICAgICAgICBldXJvUmVzdWx0LnRvdGFsID0gcmVzdWx0LnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgZXVyb1Jlc3VsdC5kdXJhdGlvbiA9IHRoaXMubWluVG9Ib3VyKFxyXG4gICAgICAgICAgICAgICAgICByZXN1bHQuaW5ib3VuZFRvdGFsRHVyYXRpb25cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICFhY2MuaW5ib3VuZC5maW5kKFxyXG4gICAgICAgICAgICAgICAgICAgIChpdGVtOiBFdXJvc3Rhckl0ZW0pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRhdGVEZXBhcnR1cmUgPT09IGV1cm9SZXN1bHQuZGF0ZURlcGFydHVyZVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgYWNjLmluYm91bmQucHVzaChldXJvUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeyBvdXRib3VuZDogW10sIGluYm91bmQ6IFtdIH0gYXMgRXVyb3N0YXJSZXN1bHRzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuIFtyZXR1cm5kYXRhXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHMxID8gW3Jlc3VsdHMxXSA6IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IEV1cm9zdGFyVGVtcFBhcmFtcztcclxuICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiBFdXJvc3RhclRlbXBQYXJhbXM7XHJcbiAgICB9ID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEV1cm9zdGFyRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgdGVtcFBhcmFtczoge30gYXMgRXVyb3N0YXJUZW1wUGFyYW1zLFxyXG4gICAgICBvcmlnaW5hbFVzZXJTZWFyY2g6IHt9IGFzIEV1cm9zdGFyVGVtcFBhcmFtc1xyXG4gICAgfTtcclxuICAgIC8vIGRhdGEudGVtcFBhcmFtcy5hZHVsdHMgPSAxO1xyXG4gICAgLy8gZGF0YS50ZW1wUGFyYW1zLmNhYmluQ2xhc3MgPSBbRmxpZ2h0Q2FiaW5DbGFzcy5FY29ub215XTtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoU2VydmljZS5tYWtlRXVyb3N0YXJRdWVyeShkYXRhLnRlbXBQYXJhbXMpO1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHF1ZXJ5KTtcclxuICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IGRhdGEub3JpZ2luYWxVc2VyU2VhcmNoO1xyXG4gICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkQWRkVHJhdmVsbGVyU3Vic2NyaXB0aW9uKCkpIHtcclxuICAgICAgc2VhcmNoU2VydmljZS50cmF2ZWxsZXJJbmZvcm1hdGlvbi5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgICAgICAgY29uc3Qgc3BsaXRUcmF2ZWxsZXJzID0gdGhpcy5oZWxwZXJzLnNlbGVjdGVkVHJhdmVsbGVycyhcclxuICAgICAgICAgICAgdHJhdmVsbGVycyxcclxuICAgICAgICAgICAgU2VydmljZVR5cGUuRXVyb3N0YXJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzID0gc3BsaXRUcmF2ZWxsZXJzLmFkdWx0cy5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPSBzcGxpdFRyYXZlbGxlcnMuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgICAgICAgLy8gdGhpcy50ZW1wUGFyYW1zLmluZmFudHMgPSBzcGxpdFRyYXZlbGxlcnMuaW5mYW50cy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJzKCk7XHJcbiAgICAgICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHVzZXJTZXJ2aWNlLmNoYW5nZVVzZXIuc3Vic2NyaWJlKCh1c2VyOiBGdWxsVXNlckRldGFpbHMpID0+IHtcclxuICAgICAgdGhpcy50aW1lQ3JpdGVyaWFPcHRpb25zLm5leHQoW1xyXG4gICAgICAgIFRpbWVXaW5kb3cuQW55dGltZSxcclxuICAgICAgICBUaW1lV2luZG93LkFycml2ZSxcclxuICAgICAgICBUaW1lV2luZG93LkRlcGFydFxyXG4gICAgICBdKTsgLy8gVE9ETyB1cGRhdGUgd2l0aCBhbnkgVUZzXHJcbiAgICAgIHRoaXMudXBkYXRlQXZhbGlhYmxlQ2xhc3NlcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJzKCk7XHJcbiAgICBjb25zdCByZXN1bHRzOiBFdXJvc3RhclNlc3Npb25UeXBlID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIHRoaXMucmVzdWx0c1Nlc3Npb25OYW1lXHJcbiAgICApIHx8IHtcclxuICAgICAgcmVzdWx0czogW10sXHJcbiAgICAgIGdyb3VwRGF0YToge30sXHJcbiAgICAgIGdyb3VwZWQ6IFtdLFxyXG4gICAgICBxdWVyeToge30gYXMgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXNcclxuICAgIH07XHJcbiAgICB0aGlzLmZ1bGxSZXN1bHRzID0gdGhpcy5oZWxwZXJzLmNsb25lKHJlc3VsdHMucmVzdWx0cyk7XHJcbiAgICB0aGlzLmZsaWdodHNUb0dyb3VwID0gcmVzdWx0cy5ncm91cERhdGEgfHwge307XHJcbiAgICB0aGlzLnJlc3VsdFF1ZXJ5ID0gcmVzdWx0cy5xdWVyeTtcclxuICAgIGNvbnN0IGlzRmxpZ2h0c0dyb3VwZWQgPSB0aGlzLnNlYXJjaFNlcnZpY2UuaXNGbGlnaHRzR3JvdXBlZCgpO1xyXG4gICAgaWYgKCFpc0ZsaWdodHNHcm91cGVkKSB7XHJcbiAgICAgIHRoaXMuX2NoZWFwZXN0UmVzdWx0UHJpY2UgPSB0aGlzLnVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHMucmVzdWx0cyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChyZXN1bHRzLnJlc3VsdHMgfHwgKFtdIGFzIEV1cm9zdGFyUXVvdGVSZXN1bHRBcnJheSkpO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgdGhpcy5uZWdvdGlhdGVkID1cclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmZhcmVUeXBlID09PSBGYXJlVHlwZS5OZWdvdGlhdGVkID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuICBmb3JtYXRFdXJvc3RhclJlc3VsdHMoXHJcbiAgICByZXN1bHRzOiBGbGlnaHRKb3VybmV5W10sXHJcbiAgICB0b3RhbDogRmxpZ2h0RmFyZVRvdGFsXHJcbiAgKTogRXVyb3N0YXJJdGVtIHtcclxuICAgIGNvbnN0IHJldHVybk9iamVjdDogRXVyb3N0YXJJdGVtID0ge1xyXG4gICAgICBkYXRlQXJyaXZhbDogbnVsbCxcclxuICAgICAgZGF0ZURlcGFydHVyZTogbnVsbCxcclxuICAgICAgZHVyYXRpb246IG51bGwsXHJcbiAgICAgIHRpbWVBcnJpdmFsOiBudWxsLFxyXG4gICAgICB0aW1lRGVwYXJ0dXJlOiBudWxsLFxyXG4gICAgICBjbzJQZXJJdGVtOiAwLFxyXG4gICAgICBjbzJQZXJQYXNzZW5nZXI6IDAsXHJcbiAgICAgIHNvdXJjZUlkOiBudWxsLFxyXG4gICAgICB0b3RhbDogbnVsbCxcclxuICAgICAgdWlkOiBudWxsLFxyXG5cclxuICAgICAgYnVzaW5lc3NQcmVtaWVyRmFyZToge1xyXG4gICAgICAgIGNsYXNzOiBudWxsLFxyXG4gICAgICAgIGZhcmU6IG51bGwsXHJcbiAgICAgICAgaXNEaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgICBwcmljZTogTmFOLFxyXG4gICAgICAgIGN1cnJlbmN5OiAnR0JQJ1xyXG4gICAgICB9LFxyXG4gICAgICBzdGFuZGFyZEZhcmU6IHtcclxuICAgICAgICBjbGFzczogbnVsbCxcclxuICAgICAgICBmYXJlOiBudWxsLFxyXG4gICAgICAgIGlzRGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgcHJpY2U6IE5hTixcclxuICAgICAgICBjdXJyZW5jeTogJ0dCUCdcclxuICAgICAgfSxcclxuICAgICAgc3RhbmRhcmRQcmVtaWVyRmFyZToge1xyXG4gICAgICAgIGNsYXNzOiBudWxsLFxyXG4gICAgICAgIGZhcmU6IG51bGwsXHJcbiAgICAgICAgaXNEaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgICBwcmljZTogTmFOLFxyXG4gICAgICAgIGN1cnJlbmN5OiAnR0JQJ1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgLy8gcmV0dXJuT2JqZWN0LmR1cmF0aW9uID0gcmVzdWx0cy5vdXRib3VuZFRvdGFsRHVyYXRpb247XHJcbiAgICByZXN1bHRzLmZvckVhY2goKGZsaWdodCwgaW5kZXgpID0+IHtcclxuICAgICAgcmV0dXJuT2JqZWN0LmRhdGVBcnJpdmFsID0gZmxpZ2h0LmRhdGVUaW1lQXJyaXZpbmc7XHJcbiAgICAgIHJldHVybk9iamVjdC5kYXRlRGVwYXJ0dXJlID0gZmxpZ2h0LmRhdGVUaW1lRGVwYXJ0aW5nO1xyXG4gICAgICByZXR1cm5PYmplY3QuZHVyYXRpb24gPSB0aGlzLm1pblRvSG91cihmbGlnaHQudG90YWxEdXJhdGlvbik7XHJcbiAgICAgIHJldHVybk9iamVjdC50aW1lQXJyaXZhbCA9IG1vbWVudChmbGlnaHQuZGF0ZVRpbWVBcnJpdmluZykuZm9ybWF0KFxyXG4gICAgICAgICdISDptbSdcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuT2JqZWN0LnRpbWVEZXBhcnR1cmUgPSBtb21lbnQoZmxpZ2h0LmRhdGVUaW1lRGVwYXJ0aW5nKS5mb3JtYXQoXHJcbiAgICAgICAgJ0hIOm1tJ1xyXG4gICAgICApO1xyXG4gICAgICByZXR1cm5PYmplY3QudWlkID0gaW5kZXg7XHJcbiAgICAgIHN3aXRjaCAoZmxpZ2h0LmZhcmVJbmZvLnRpdGxlKSB7XHJcbiAgICAgICAgY2FzZSBFdXJvc3RhckNsYXNzRW51bS5TVEFOREFSRDpcclxuICAgICAgICAgIHJldHVybk9iamVjdC5zdGFuZGFyZEZhcmUuaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5mYXJlID0gZmxpZ2h0O1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5wcmljZSA9IHRvdGFsLnByaWNlO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5jdXJyZW5jeSA9IHRvdGFsLmN1cnJlbmN5O1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5jbGFzcyA9IGZsaWdodC5jYWJpbkNsYXNzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBFdXJvc3RhckNsYXNzRW51bS5TVEFOREFSRF9QUkVNSUVSOlxyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkUHJlbWllckZhcmUuaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkUHJlbWllckZhcmUuZmFyZSA9IGZsaWdodDtcclxuICAgICAgICAgIHJldHVybk9iamVjdC5zdGFuZGFyZFByZW1pZXJGYXJlLnByaWNlID0gdG90YWwucHJpY2U7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRQcmVtaWVyRmFyZS5jdXJyZW5jeSA9IHRvdGFsLmN1cnJlbmN5O1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkUHJlbWllckZhcmUuY2xhc3MgPSBmbGlnaHQuY2FiaW5DbGFzcztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRXVyb3N0YXJDbGFzc0VudW0uQlVTSU5FU1NfUFJFTUlFUjpcclxuICAgICAgICAgIHJldHVybk9iamVjdC5idXNpbmVzc1ByZW1pZXJGYXJlLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybk9iamVjdC5idXNpbmVzc1ByZW1pZXJGYXJlLmZhcmUgPSBmbGlnaHQ7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3QuYnVzaW5lc3NQcmVtaWVyRmFyZS5wcmljZSA9IHRvdGFsLnByaWNlO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LmJ1c2luZXNzUHJlbWllckZhcmUuY3VycmVuY3kgPSB0b3RhbC5jdXJyZW5jeTtcclxuICAgICAgICAgIHJldHVybk9iamVjdC5idXNpbmVzc1ByZW1pZXJGYXJlLmNsYXNzID0gZmxpZ2h0LmNhYmluQ2xhc3M7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgY29uc29sZS5sb2coJ25ldyBjbGFzcyB0byBiZSBpbXBsZW1lbnRlZDogJywgZmxpZ2h0LmZhcmVJbmZvLnRpdGxlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmV0dXJuT2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0UXVlcnkoY2hlY2tJc1ZhbGlkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlRXVyb3N0YXJRdWVyeSgpKTtcclxuICAgIGlmIChjaGVja0lzVmFsaWQpIHtcclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0UGFyYW1zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXNldCgpO1xyXG4gICAgdGhpcy5yZXNldFF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZhbGlkKCkge1xyXG4gICAgaWYgKCF0aGlzLmRvQ2hlY2tzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEV1cm9zdGFyRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TLFxyXG4gICAgICB7XHJcbiAgICAgICAgdGVtcFBhcmFtczogdGhpcy50ZW1wUGFyYW1zLFxyXG4gICAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2hcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLl9vcmlnaW5BaXJwb3J0KSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBhZGQgaW4gYSBkZXBhcnR1dHJlIGxvY2F0aW9uJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuX2Rlc3RpbmF0aW9uQWlycG9ydCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgYWRkIGluIGEgYXJyaXZhbCBkZXN0aW5hdGlvbicpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlLmlzQWZ0ZXIobW9tZW50KCkpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ0RlcGFydHVyZSBkYXRlIGNhbiBub3QgYmUgaW4gdGhlIHBhc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX29yaWdpbkFpcnBvcnQgJiZcclxuICAgICAgdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0ICYmXHJcbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uQWlycG9ydCA9PT0gdGhpcy5fb3JpZ2luQWlycG9ydFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgJ09yaWdpbiBhbmQgZGVzdGluYXRpb24gc3RhdGlvbiBjYW5ub3QgYmUgdGhlIHNhbWUnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1JldHVybikge1xyXG4gICAgICAvLyBUT0RPIGNoZWNrIHRoYXQgcmV0dXJuIGRldGFpbHMgYXJlIHNldFxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZS5pc1NhbWVPckFmdGVyKFxyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmluVGltZUNyaXRlcmlhXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICAgJ1JldHVybiBkYXRlIG11c3QgYmUgYWZ0ZXIgdGhlIGRlcGFydHVyZSBkYXRlJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuaXNWYWxpZC5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB0aGlzLm1lc3NhZ2VzLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2goKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChbXSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbFVzZXJTZWFyY2ggPSBPYmplY3QuZnJlZXplKHsgLi4udGhpcy50ZW1wUGFyYW1zIH0pO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICAgIEV1cm9zdGFyRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtcyxcclxuICAgICAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2hcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZVJlY2VudFNlYXJjaCh0aGlzLmdldFJlY2VudFNlYXJjaFF1ZXJ5KHF1ZXJ5KSk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWFyY2goXHJcbiAgICAgICAgdGhpcy5ldXJvc3RhckZldGNoZXIuZmV0Y2hMaXN0KHRoaXMuZ2V0U2VhcmNoUXVlcnkoKSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UmVjZW50U2VhcmNoUXVlcnkoXHJcbiAgICBxdWVyeTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXNcclxuICApOiBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VydmljZVR5cGU6IFNlcnZpY2VUeXBlLkV1cm9zdGFyLFxyXG4gICAgICBzZWFyY2hBcmdzOiBxdWVyeSxcclxuICAgICAgdHJhdmVsRGF0ZTogdGhpcy5vdXRCb3VuZERhdGUuZm9ybWF0KCksXHJcbiAgICAgIHRyYXZlbGxlcnM6IHRoaXMuaGVscGVycy5nZXRUcmF2ZWxsZXJzSWQodGhpcy50cmF2ZWxsZXJzKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXJ0UmVjZW50U2VhcmNoKHJlY2VudFNlYXJjaDogUmVjZW50U2VhcmNoKTogdm9pZCB7XHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub3V0Ym91bmREYXRlKSB7XHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlID0gdGhpcy5jb252ZXJ0UmVjZW50U2VhcmNoRGF0ZVRpbWUoXHJcbiAgICAgICAgcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub3V0Ym91bmREYXRlLFxyXG4gICAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm91dGJvdW5kRGVwYXJ0dXJlVGltZVdpbmRvd1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yZXR1cm5EYXRlKSB7XHJcbiAgICAgIHRoaXMuaW5ib3VuZERhdGUgPSB0aGlzLmNvbnZlcnRSZWNlbnRTZWFyY2hEYXRlVGltZShcclxuICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yZXR1cm5EYXRlLFxyXG4gICAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnJldHVybkRlcGFydHVyZVRpbWVXaW5kb3dcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZhcmVUeXBlID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZmFyZVR5cGU7XHJcbiAgICB0aGlzLm1heENvbm5lY3Rpb25zID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubWF4Q29ubmVjdGlvbnM7XHJcblxyXG4gICAgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm91dGJvdW5kQ2FiaW5DbGFzcykge1xyXG4gICAgICB0aGlzLmNhYmluQ2xhc3MgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5vdXRib3VuZENhYmluQ2xhc3NbMF07XHJcbiAgICB9XHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucmV0dXJuQ2FiaW5DbGFzcykge1xyXG4gICAgICB0aGlzLnJldHVybkNhYmluQ2xhc3MgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yZXR1cm5DYWJpbkNsYXNzWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jbHVkZU5lYXJieUFpcnBvcnRzID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuaW5jbHVkZU5lYXJieUFpcnBvcnRzO1xyXG5cclxuICAgIHRoaXMuY2hvc2VuU2VhcmNoVHlwZSA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnJldHVyblRyaXBcclxuICAgICAgPyBFdXJvc3RhclNlYXJjaFR5cGUucmV0dXJuXHJcbiAgICAgIDogRXVyb3N0YXJTZWFyY2hUeXBlLm9uZVdheTtcclxuXHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub3V0Ym91bmREZXBhcnR1cmVUaW1lV2luZG93KSB7XHJcbiAgICAgIHRoaXMub3V0VGltZUNyaXRlcmlhID0gVGltZVdpbmRvdy5EZXBhcnQ7XHJcbiAgICB9IGVsc2UgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm91dGJvdW5kQXJyaXZhbFRpbWVXaW5kb3cpIHtcclxuICAgICAgdGhpcy5vdXRUaW1lQ3JpdGVyaWEgPSBUaW1lV2luZG93LkFycml2ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3V0VGltZUNyaXRlcmlhID0gVGltZVdpbmRvdy5Bbnl0aW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yZXR1cm5EZXBhcnR1cmVUaW1lV2luZG93KSB7XHJcbiAgICAgIHRoaXMuaW5UaW1lQ3JpdGVyaWEgPSBUaW1lV2luZG93LkRlcGFydDtcclxuICAgIH0gZWxzZSBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucmV0dXJuQXJyaXZhbFRpbWVXaW5kb3cpIHtcclxuICAgICAgdGhpcy5pblRpbWVDcml0ZXJpYSA9IFRpbWVXaW5kb3cuQXJyaXZlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pblRpbWVDcml0ZXJpYSA9IFRpbWVXaW5kb3cuQW55dGltZTtcclxuICAgIH1cclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLmdldEFpcnBvcnRCeUNvZGUoXHJcbiAgICAgICAgcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub3JpZ2luQWlycG9ydFxyXG4gICAgICApLFxyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2UuZ2V0QWlycG9ydEJ5Q29kZShcclxuICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5kZXN0aW5hdGlvbkFpcnBvcnRcclxuICAgICAgKVxyXG4gICAgXSkuc3Vic2NyaWJlKChbZGVwYXJ0TG9jYXRpb24sIGFycml2ZUxvY2F0aW9uXSkgPT4ge1xyXG4gICAgICBpZiAoZGVwYXJ0TG9jYXRpb24gJiYgYXJyaXZlTG9jYXRpb24pIHtcclxuICAgICAgICB0aGlzLmRlcGFydExvY2F0aW9uID0ge1xyXG4gICAgICAgICAgZGVzdGluYXRpb246IGRlcGFydExvY2F0aW9uLmlhdGFNYXRjaC5uYW1lLFxyXG4gICAgICAgICAgZ2F0ZXdheTogZGVwYXJ0TG9jYXRpb24uaWF0YU1hdGNoLmlhdGEsXHJcbiAgICAgICAgICB0ZXJtaW5hbHM6IHRoaXMuc2VhcmNoU2VydmljZS5wcm9jZXNzVGVybWluYWxzKFxyXG4gICAgICAgICAgICBkZXBhcnRMb2NhdGlvbi5pYXRhTWF0Y2gudGVybWluYWxzXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgY291bnRyeTogZGVwYXJ0TG9jYXRpb24uaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LmNvdW50cnksXHJcbiAgICAgICAgICBwb3N0Y29kZTogZGVwYXJ0TG9jYXRpb24uaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgY291bnRyeUNvZGU6IGRlcGFydExvY2F0aW9uLmlhdGFNYXRjaD8ubG9jYXRpb25EZXRhaWxzPy5jb3VudHJ5Q29kZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5hcnJpdmVMb2NhdGlvbiA9IHtcclxuICAgICAgICAgIGRlc3RpbmF0aW9uOiBhcnJpdmVMb2NhdGlvbi5pYXRhTWF0Y2gubmFtZSxcclxuICAgICAgICAgIGdhdGV3YXk6IGFycml2ZUxvY2F0aW9uLmlhdGFNYXRjaC5pYXRhLFxyXG4gICAgICAgICAgdGVybWluYWxzOiB0aGlzLnNlYXJjaFNlcnZpY2UucHJvY2Vzc1Rlcm1pbmFscyhcclxuICAgICAgICAgICAgYXJyaXZlTG9jYXRpb24uaWF0YU1hdGNoLnRlcm1pbmFsc1xyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIGNvdW50cnk6IGFycml2ZUxvY2F0aW9uLmlhdGFNYXRjaD8ubG9jYXRpb25EZXRhaWxzPy5jb3VudHJ5LFxyXG4gICAgICAgICAgcG9zdGNvZGU6IGFycml2ZUxvY2F0aW9uLmlhdGFNYXRjaD8ubG9jYXRpb25EZXRhaWxzPy5wb3N0Y29kZSxcclxuICAgICAgICAgIGNvdW50cnlDb2RlOiBhcnJpdmVMb2NhdGlvbi5pYXRhTWF0Y2g/LmxvY2F0aW9uRGV0YWlscz8uY291bnRyeUNvZGVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucHJlZmVycmVkQ2FycmllcnMpIHtcclxuICAgICAgICAgIGxldCBwcmVmZXJyZWRDYXJyaWVyczogT0JUQWlybGluZXNEZXRhaWxzW10gPSBbXTtcclxuICAgICAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnByZWZlcnJlZENhcnJpZXJzLm1hcChcclxuICAgICAgICAgICAgKHByZWZlcnJlZENhcnJ5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5nZXRBaXJsaW5lc0xpc3QocHJlZmVycmVkQ2FycnkpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChpdGVtczogT0JUQWlybGluZXNEZXRhaWxzW10pID0+IHtcclxuICAgICAgICAgICAgICAgICAgaXRlbXMubWFwKChpdGVtOiBPQlRBaXJsaW5lc0RldGFpbHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb2RlID09PSBwcmVmZXJyZWRDYXJyeSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkQ2FycmllcnMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnByZWZlcnJlZENhcnJpZXJzID0gcHJlZmVycmVkQ2FycmllcnM7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYWtlRGVwYXJ0dXJlVGltZVdpbmRvdyhcclxuICAgIGRhdGVUaW1lOiBtb21lbnQuTW9tZW50LFxyXG4gICAgd2luZG93OiBUaW1lV2luZG93XHJcbiAgKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB3aW5kb3cgPT09IFRpbWVXaW5kb3cuRGVwYXJ0XHJcbiAgICAgID8gdGhpcy5oZWxwZXJzLm1ha2VUaW1lV2luZG93KGRhdGVUaW1lLCAtMiwgMilcclxuICAgICAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYWtlQXJyaXZhbFRpbWVXaW5kb3coXHJcbiAgICBkYXRlVGltZTogbW9tZW50Lk1vbWVudCxcclxuICAgIHdpbmRvdzogVGltZVdpbmRvd1xyXG4gICk6IHN0cmluZyB7XHJcbiAgICBpZiAod2luZG93ICE9PSBUaW1lV2luZG93LkFycml2ZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLm1ha2VUaW1lV2luZG93KGRhdGVUaW1lLCAtMiwgMik7XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0UmVjZW50U2VhcmNoRGF0ZVRpbWUoXHJcbiAgICBkYXRlOiBzdHJpbmcsXHJcbiAgICB0aW1lV2luZG93Pzogc3RyaW5nXHJcbiAgKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICBpZiAodGltZVdpbmRvdykge1xyXG4gICAgICBjb25zdCBmbGlnaHRUaW1lID0gdGltZVdpbmRvdy5zcGxpdCgnLScpO1xyXG4gICAgICBsZXQgdGltZUFuZERhdGUgPSBtb21lbnQoZGF0ZSkuYWRkKFxyXG4gICAgICAgIG1vbWVudC5kdXJhdGlvbih0aGlzLmhlbHBlcnMuaGhtbVRvVGltZShmbGlnaHRUaW1lWzBdKSlcclxuICAgICAgKTtcclxuICAgICAgLy8gYWRkIDIgaG91clxyXG4gICAgICByZXR1cm4gdGltZUFuZERhdGUuY2xvbmUoKS5hZGQoMiwgJ2hvdXInKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBtb21lbnQoZGF0ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hRdWVyeSgpOiBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnJlbW92ZU51bGxzPFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzPihcclxuICAgICAgT2JqZWN0LmFzc2lnbihcclxuICAgICAgICB7fSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBvcmlnaW5BaXJwb3J0OiB0aGlzLl9vcmlnaW5BaXJwb3J0LFxyXG4gICAgICAgICAgZGVzdGluYXRpb25BaXJwb3J0OiB0aGlzLl9kZXN0aW5hdGlvbkFpcnBvcnQsXHJcbiAgICAgICAgICBvdXRib3VuZERhdGU6IHRoaXMuaGVscGVycy5mb3JtYXRJc29EYXRlKFxyXG4gICAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgb3V0Ym91bmREZXBhcnR1cmVUaW1lV2luZG93OiB0aGlzLm1ha2VEZXBhcnR1cmVUaW1lV2luZG93KFxyXG4gICAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlLFxyXG4gICAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMub3V0VGltZUNyaXRlcmlhXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgb3V0Ym91bmRBcnJpdmFsVGltZVdpbmRvdzogdGhpcy5tYWtlQXJyaXZhbFRpbWVXaW5kb3coXHJcbiAgICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5vdXRCb3VuZERhdGUsXHJcbiAgICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5vdXRUaW1lQ3JpdGVyaWFcclxuICAgICAgICAgIClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHBhc3NlbmdlcnM6IHRoaXMuX3Bhc3NlbmdlcnMsXHJcbiAgICAgICAgICByZXR1cm5UcmlwOiB0aGlzLmlzUmV0dXJuLFxyXG4gICAgICAgICAgb3V0Ym91bmRDYWJpbkNsYXNzOiB0aGlzLnRlbXBQYXJhbXMuY2FiaW5DbGFzc1xyXG4gICAgICAgICAgICA/IFt0aGlzLnRlbXBQYXJhbXMuY2FiaW5DbGFzc11cclxuICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgcmVxdWlyZUZyZWVCYWc6IG51bGwsXHJcbiAgICAgICAgICBtYXhDb25uZWN0aW9uczogdGhpcy50ZW1wUGFyYW1zLm1heENvbm5lY3Rpb25zLFxyXG4gICAgICAgICAgaW5jbHVkZU5lYXJieUFpcnBvcnRzOiB0aGlzLnRlbXBQYXJhbXMuaW5jbHVkZU5lYXJieUFpcnBvcnRzLFxyXG4gICAgICAgICAgcHJlZmVycmVkQ2FycmllcnM6IHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVycy5tYXAoXHJcbiAgICAgICAgICAgIChjYXJyaWVyOiBPQlRBaXJsaW5lc0RldGFpbHMpID0+XHJcbiAgICAgICAgICAgICAgY2Fycmllcj8uY29kZSA/IGNhcnJpZXIuY29kZSA6IG51bGxcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBmYXJlVHlwZTogdGhpcy50ZW1wUGFyYW1zLmZhcmVUeXBlLFxyXG4gICAgICAgICAgd2l0aEdyb3VwZWQ6IG51bGxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRoaXMuaXNSZXR1cm5cclxuICAgICAgICAgID8ge1xyXG4gICAgICAgICAgICAgIHJldHVybkRhdGU6IHRoaXMuaGVscGVycy5mb3JtYXRJc29EYXRlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICByZXR1cm5EZXBhcnR1cmVUaW1lV2luZG93OiB0aGlzLm1ha2VEZXBhcnR1cmVUaW1lV2luZG93KFxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmluVGltZUNyaXRlcmlhXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICByZXR1cm5BcnJpdmFsVGltZVdpbmRvdzogdGhpcy5tYWtlQXJyaXZhbFRpbWVXaW5kb3coXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMuaW5ib3VuZERhdGUsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMuaW5UaW1lQ3JpdGVyaWFcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIHJldHVybkNhYmluQ2xhc3M6IHRoaXMudGVtcFBhcmFtcy5yZXR1cm5DYWJpbkNsYXNzXHJcbiAgICAgICAgICAgICAgICA/IFt0aGlzLnRlbXBQYXJhbXMucmV0dXJuQ2FiaW5DbGFzc11cclxuICAgICAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA6IHt9XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRyYXZlbGxlcnMoKSB7XHJcbiAgICBjb25zdCB0cmF2ZWxsZXJzOiBGbGlnaHRQYXNzZW5nZXJPYmplY3RbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgbG9vcCA9IDA7IGxvb3AgPCB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzOyBsb29wICs9IDEpIHtcclxuICAgICAgdHJhdmVsbGVycy5wdXNoKHsgdHlwZTogRmxpZ2h0UGFzc2VuZ2VyVHlwZS5BZHVsdCB9KTtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGxvb3AgPSAwOyBsb29wIDwgdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuOyBsb29wICs9IDEpIHtcclxuICAgICAgdHJhdmVsbGVycy5wdXNoKHsgdHlwZTogRmxpZ2h0UGFzc2VuZ2VyVHlwZS5DaGlsZCB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9wYXNzZW5nZXJzID0gdHJhdmVsbGVycztcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQXZhbGlhYmxlQ2xhc3NlcygpIHtcclxuICAgIHRoaXMuYXZhbGlhYmxlQ2xhc3Nlcy5uZXh0KFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdBbnknLFxyXG4gICAgICAgIHR5cGU6IEV1cm9zdGFyQ2xhc3NFbnVtLkFOWVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1N0YW5kYXJkIChzZW1pIGZsZXhpYmxlKScsXHJcbiAgICAgICAgdHlwZTogRXVyb3N0YXJDbGFzc0VudW0uU1RBTkRBUkRcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdTdGFuZGFyZCBwcmVtaWVyIChzZW1pIGZsZXhpYmxlKScsXHJcbiAgICAgICAgdHlwZTogRXVyb3N0YXJDbGFzc0VudW0uU1RBTkRBUkRfUFJFTUlFUlxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0J1c2luZXNzIHByZW1pZXIgKGZ1bGx5IGZsZXhpYmxlKScsXHJcbiAgICAgICAgdHlwZTogRXVyb3N0YXJDbGFzc0VudW0uQlVTSU5FU1NfUFJFTUlFUlxyXG4gICAgICB9XHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiAtIHNvcnQgdGhlIGZsaWdodCByZXN1bHRzXHJcbiAgICogQHRvZG8gLSBGaWxsIG91dCBQcmVmZXJyZWQgYW5kIENvMiBzb3J0aW5nIHdoZW4gd2UgaGF2ZSB0aGF0IGRhdGFcclxuICAgKi9cclxuICBwdWJsaWMgc29ydFJlc3VsdHMoXHJcbiAgICBzb3J0TWV0aG9kVmFsdWU6IFNvcnRUeXBlc0V1cm9zdGFyLFxyXG4gICAgZ2l2ZW5SZXN1bHRzPzogRXVyb3N0YXJSZXN1bHRzW11cclxuICApOiB2b2lkIHtcclxuICAgIGxldCByZXN1bHRzID0gdGhpcy5oZWxwZXJzLmNsb25lKFxyXG4gICAgICBnaXZlblJlc3VsdHNcclxuICAgICAgICA/IGdpdmVuUmVzdWx0c1xyXG4gICAgICAgIDogPEV1cm9zdGFyUmVzdWx0c1tdPig8dW5rbm93bj50aGlzLmZ1bGxSZXN1bHRzKVxyXG4gICAgKTtcclxuXHJcbiAgICBzd2l0Y2ggKHNvcnRNZXRob2RWYWx1ZSkge1xyXG4gICAgICBjYXNlIFNvcnRUeXBlc0V1cm9zdGFyLkNoZWFwZXN0Rmlyc3Q6XHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMuc29ydEJ5UHJpY2UocmVzdWx0cyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU29ydFR5cGVzRXVyb3N0YXIuRWFybGllc3RGaXJzdDpcclxuICAgICAgICByZXN1bHRzID0gdGhpcy5zb3J0QnlEYXRlKHJlc3VsdHMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCsrKyBVbmtub3duIHNvcnRpbmcgbWV0aG9kOiAke3NvcnRNZXRob2RWYWx1ZX0gKysrYCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc29ydFJlc3VsdHNGbGlnaHRKb3VybmV5cyhcclxuICAgIHNvcnRNZXRob2RWYWx1ZTogU29ydFR5cGVzRXVyb3N0YXIsXHJcbiAgICBpbmJvdW5kOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBnaXZlblJlc3VsdHM/OiBGbGlnaHRJdGluZXJhcnlbXVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIGxldCByZXN1bHRzID0gdGhpcy5oZWxwZXJzLmNsb25lKGdpdmVuUmVzdWx0cyk7XHJcblxyXG4gICAgc3dpdGNoIChzb3J0TWV0aG9kVmFsdWUpIHtcclxuICAgICAgY2FzZSBTb3J0VHlwZXNFdXJvc3Rhci5DaGVhcGVzdEZpcnN0OlxyXG4gICAgICAgIHJlc3VsdHMgPSB0aGlzLnNvcnRCeVByaWNlRmxpZ2h0KHJlc3VsdHMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNvcnRUeXBlc0V1cm9zdGFyLkVhcmxpZXN0Rmlyc3Q6XHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMuc29ydEJ5RGF0ZUZsaWdodChyZXN1bHRzLCBpbmJvdW5kKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTb3J0VHlwZXNFdXJvc3Rhci5MYXRlc3RGaXJzdDpcclxuICAgICAgICByZXN1bHRzID0gdGhpcy5zb3J0QnlEYXRlRmxpZ2h0RGVjZW5kaW5nKHJlc3VsdHMsIGluYm91bmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCsrKyBVbmtub3duIHNvcnRpbmcgbWV0aG9kOiAke3NvcnRNZXRob2RWYWx1ZX0gKysrYCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBzb3J0QnlQcmljZUZsaWdodChyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIHJldHVybiByZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgcmV0dXJuIE51bWJlcihhLnRvdGFsLnByaWNlKSAtIE51bWJlcihiLnRvdGFsLnByaWNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc29ydEJ5RGF0ZUZsaWdodChcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdLFxyXG4gICAgaW5ib3VuZDogYm9vbGVhblxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIHJldHVybiByZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgaWYgKGluYm91bmQpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgbW9tZW50KGEuaW5ib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpLnVuaXgoKSAtXHJcbiAgICAgICAgICBtb21lbnQoYi5pbmJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZykudW5peCgpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgbW9tZW50KGEub3V0Ym91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS51bml4KCkgLVxyXG4gICAgICAgICAgbW9tZW50KGIub3V0Ym91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS51bml4KClcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNvcnRCeURhdGVGbGlnaHREZWNlbmRpbmcoXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSxcclxuICAgIGluYm91bmQ6IGJvb2xlYW5cclxuICApOiBGbGlnaHRJdGluZXJhcnlbXSB7XHJcbiAgICByZXR1cm4gcmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGlmIChpbmJvdW5kKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIG1vbWVudChiLmluYm91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS51bml4KCkgLVxyXG4gICAgICAgICAgbW9tZW50KGEuaW5ib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpLnVuaXgoKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIG1vbWVudChiLm91dGJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZykudW5peCgpIC1cclxuICAgICAgICAgIG1vbWVudChhLm91dGJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZykudW5peCgpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTb3J0IHJlc3VsdHMgYnkgZGVwYXJ0dXJlIHRpbWVcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RXVyb3N0YXJSZXN1bHRzW119IHJlc3VsdHNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqIEBtZW1iZXJvZiBFdXJvc3RhckluZm9cclxuICAgKi9cclxuICBzb3J0QnlEYXRlKHJlc3VsdHM6IEV1cm9zdGFyUmVzdWx0c1tdKTogRXVyb3N0YXJSZXN1bHRzW10ge1xyXG4gICAgY29uc3QgYnlEYXRlID0gKGE6IEV1cm9zdGFySXRlbSwgYjogRXVyb3N0YXJJdGVtKSA9PiB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgbW9tZW50KGEudGltZURlcGFydHVyZSwgJ0hIOm1tJykudW5peCgpIC1cclxuICAgICAgICBtb21lbnQoYi50aW1lRGVwYXJ0dXJlLCAnSEg6bW0nKS51bml4KClcclxuICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc29ydGVkUmVzdWx0cyA9IHtcclxuICAgICAgb3V0Ym91bmQ6IHJlc3VsdHNbMF0ub3V0Ym91bmQuc29ydChieURhdGUpLFxyXG4gICAgICBpbmJvdW5kOiByZXN1bHRzWzBdLmluYm91bmQuc29ydChieURhdGUpXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFtzb3J0ZWRSZXN1bHRzXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvcnQgcmVzdWx0cyBieSBwcmljZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtFdXJvc3RhclJlc3VsdHNbXX0gcmVzdWx0c1xyXG4gICAqIEByZXR1cm5zXHJcbiAgICogQG1lbWJlcm9mIEV1cm9zdGFySW5mb1xyXG4gICAqL1xyXG4gIHNvcnRCeVByaWNlKHJlc3VsdHM6IEV1cm9zdGFyUmVzdWx0c1tdLCBkaXI/OiBib29sZWFuKTogRXVyb3N0YXJSZXN1bHRzW10ge1xyXG4gICAgY29uc3QgYnlQcmljZSA9IChhOiBFdXJvc3Rhckl0ZW0sIGI6IEV1cm9zdGFySXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBhUHJpY2UgPVxyXG4gICAgICAgICthLnN0YW5kYXJkRmFyZS5wcmljZSB8fFxyXG4gICAgICAgICthLnN0YW5kYXJkUHJlbWllckZhcmUucHJpY2UgfHxcclxuICAgICAgICArYS5idXNpbmVzc1ByZW1pZXJGYXJlLnByaWNlO1xyXG4gICAgICBjb25zdCBiUHJpY2UgPVxyXG4gICAgICAgICtiLnN0YW5kYXJkRmFyZS5wcmljZSB8fFxyXG4gICAgICAgICtiLnN0YW5kYXJkUHJlbWllckZhcmUucHJpY2UgfHxcclxuICAgICAgICArYi5idXNpbmVzc1ByZW1pZXJGYXJlLnByaWNlO1xyXG4gICAgICBpZiAoZGlyKSB7XHJcbiAgICAgICAgcmV0dXJuIGJQcmljZSAtIGFQcmljZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYVByaWNlIC0gYlByaWNlO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzb3J0ZWRSZXN1bHRzID0ge1xyXG4gICAgICBvdXRib3VuZDogcmVzdWx0c1swXS5vdXRib3VuZC5zb3J0KGJ5UHJpY2UpLFxyXG4gICAgICBpbmJvdW5kOiByZXN1bHRzWzBdLmluYm91bmQuc29ydChieVByaWNlKVxyXG4gICAgfTtcclxuICAgIHJldHVybiBbc29ydGVkUmVzdWx0c107XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IGZsaWdodEl0ZW06IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzID1cclxuICAgICAgcHJldmlvdXNJdGVtc1tTZXJ2aWNlVHlwZS5GbGlnaHRdPy5zZWFyY2hRdWVyeTtcclxuICAgIGlmIChmbGlnaHRJdGVtKSB7XHJcbiAgICAgIC8vIFRPRE8gZmxpZ2h0cyBoYXZlbid0IGJlZW4gZG9uZSB5ZXQuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUb3RhbEJhZ2dhZ2UocmVzdWx0OiBGbGlnaHRJdGluZXJhcnkpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvdGFsID0gMDtcclxuXHJcbiAgICBjb25zdCBwYXJzZWRBZGRpdGlvbmFsID0gSlNPTi5wYXJzZShyZXN1bHQuYWRkaXRpb25hbCk7XHJcbiAgICBpZiAocGFyc2VkQWRkaXRpb25hbCAmJiBwYXJzZWRBZGRpdGlvbmFsLm91dGJvdW5kRmxpZ2h0cykge1xyXG4gICAgICBwYXJzZWRBZGRpdGlvbmFsLm91dGJvdW5kRmxpZ2h0cy5mb3JFYWNoKChmbGlnaHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGZsaWdodC5iYWdnYWdlLmZvckVhY2goKGJhZzogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoYmFnLmFsbG93YW5jZSAmJiBiYWcuYWxsb3dhbmNlID4gdG90YWwpIHtcclxuICAgICAgICAgICAgdG90YWwgPSBiYWcuYWxsb3dhbmNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAocGFyc2VkQWRkaXRpb25hbCAmJiBwYXJzZWRBZGRpdGlvbmFsLmJhZ2dhZ2VBbGxvd2FuY2UpIHtcclxuICAgICAgcGFyc2VkQWRkaXRpb25hbC5iYWdnYWdlQWxsb3dhbmNlLmZvckVhY2goKGJhZ2dhZ2VBbGxvdzogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgYmFnZ2FnZUFsbG93LmJhZ2dhZ2UucXR5ICYmXHJcbiAgICAgICAgICBOdW1iZXIoYmFnZ2FnZUFsbG93LmJhZ2dhZ2UucXR5KSA+IHRvdGFsXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0b3RhbCA9IE51bWJlcihiYWdnYWdlQWxsb3cuYmFnZ2FnZS5xdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRvdGFsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gZ2l2ZSB0aGUgY29ycmVjdCBmb3JtYXQgZm9yIHRyYW5zZmVyaW5nIG1pbnVldGVzIG9uIHRoZSBzbGlkZXJzXHJcbiAgICogQHBhcmFtIG1pbiAtIHRoZSBtaW4gaW4gMTAwdGgncyB0byB0cmFuc2Zvcm0gb250byA2MHRoJ3NcclxuICAgKi9cclxuICB0cmFuc2Zvcm1NaW4obWluOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IG51bSA9IChOdW1iZXIobWluKSAqIDYwKSAvIDEwMDtcclxuICAgIC8vIGNvbnNvbGUubG9nKCcrKysgTnVtIENvcHk6ICcsIF8uY2xvbmUobnVtKSwgJyArKysnKTtcclxuICAgIGlmIChudW0gJSAxIDwgMC41KSB7XHJcbiAgICAgIG51bSA9IE1hdGguZmxvb3IobnVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG51bSA9IE1hdGguY2VpbChudW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudW0udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gYXBwbHkgYWxsIGZpbHRlcnMgdG8gcmVzdWx0c1xyXG4gICAqIEBwYXJhbSBmaWx0ZXJzXHJcbiAgICogQHBhcmFtIGluYm91bmRcclxuICAgKiBAcGFyYW0gcmVzdWx0c1xyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgYXBwbHlGaWx0ZXJzKGZpbHRlcnM6IEZsaWdodEZpbHRlcnMsIGluYm91bmQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgLy8gbGV0IG5ld1Jlc3VsdHMgPSB0aGlzLmhlbHBlcnMuY2xvbmUocmVzdWx0cyk7XHJcbiAgICAvLyBpZiAoaW5ib3VuZCkge1xyXG4gICAgLy8gICBuZXdSZXN1bHRzID0gdGhpcy5maWx0ZXJCeVJldHVybkRlcGFydHVyZVRpbWUoXHJcbiAgICAvLyAgICAgZmlsdGVycy5taW5SZXR1cm5EZXBhcnR1cmVUaW1lLFxyXG4gICAgLy8gICAgIGZpbHRlcnMubWF4UmV0dXJuRGVwYXJ0dXJlVGltZSxcclxuICAgIC8vICAgICBuZXdSZXN1bHRzXHJcbiAgICAvLyAgICk7XHJcbiAgICAvLyAgIG5ld1Jlc3VsdHMgPSB0aGlzLmZpbHRlckJ5UmV0dXJuQXJyaXZhbFRpbWUoXHJcbiAgICAvLyAgICAgZmlsdGVycy5taW5SZXR1cm5BcnJpdmFsVGltZSxcclxuICAgIC8vICAgICBmaWx0ZXJzLm1heFJldHVybkFycml2YWxUaW1lLFxyXG4gICAgLy8gICAgIG5ld1Jlc3VsdHNcclxuICAgIC8vICAgKTtcclxuICAgIC8vIH1cclxuICAgIC8vIC8vIEdsb2JhbCAoYXBwbHkgdG8gYm90aCBpbmJvdW5kIGFuZCBvdXRib3VuZCByZXN1bHRzKSBmaWx0ZXJzXHJcbiAgICAvLyBuZXdSZXN1bHRzID0gdGhpcy5maWx0ZXJCeURlcGFydHVyZVRpbWUoXHJcbiAgICAvLyAgIGZpbHRlcnMubWluRGVwYXJ0dXJlVGltZSxcclxuICAgIC8vICAgZmlsdGVycy5tYXhEZXBhcnR1cmVUaW1lLFxyXG4gICAgLy8gICBuZXdSZXN1bHRzXHJcbiAgICAvLyApO1xyXG4gICAgLy8gbmV3UmVzdWx0cyA9IHRoaXMuZmlsdGVyQnlBcnJpdmFsVGltZShcclxuICAgIC8vICAgZmlsdGVycy5taW5BcnJpdmFsVGltZSxcclxuICAgIC8vICAgZmlsdGVycy5tYXhBcnJpdmFsVGltZSxcclxuICAgIC8vICAgbmV3UmVzdWx0c1xyXG4gICAgLy8gKTtcclxuICAgIC8vIG5ld1Jlc3VsdHMgPSB0aGlzLmZpbHRlclJlc3VsdHNCeVN0b3BzKGZpbHRlcnMuc3RvcHMsIG5ld1Jlc3VsdHMpO1xyXG4gICAgLy8gbmV3UmVzdWx0cyA9IHRoaXMuZmlsdGVyQnlQcmljZShcclxuICAgIC8vICAgZmlsdGVycy5taW5QcmljZSxcclxuICAgIC8vICAgZmlsdGVycy5tYXhQcmljZSxcclxuICAgIC8vICAgbmV3UmVzdWx0c1xyXG4gICAgLy8gKTtcclxuICAgIC8vIHJldHVybiBuZXdSZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnlEdXJhdGlvbihcclxuICAgIG1pbkR1cmF0aW9uOiBudW1iZXIsXHJcbiAgICBtYXhEdXJhdGlvbjogbnVtYmVyLFxyXG4gICAgcmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10sXHJcbiAgICBpc1JldHVybiA9IGZhbHNlXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgbGV0IGR1ciA9IDA7XHJcbiAgICAgIGlmICghaXNSZXR1cm4pIHtcclxuICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzLmZvckVhY2goKG91dDogRmxpZ2h0Sm91cm5leSkgPT4ge1xyXG4gICAgICAgICAgZHVyICs9IG91dC50b3RhbER1cmF0aW9uO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzPy5sZW5ndGggJiYgaXNSZXR1cm4pIHtcclxuICAgICAgICByZXN1bHQuaW5ib3VuZEZsaWdodHMuZm9yRWFjaCgoaW5iOiBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgICBkdXIgKz0gaW5iLnRvdGFsRHVyYXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBkdXIgPj0gbWluRHVyYXRpb24gJiYgZHVyIDw9IG1heER1cmF0aW9uO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeURlcGFydHVyZVRpbWUoXHJcbiAgICBtaW5EZXA6IG51bWJlcixcclxuICAgIG1heERlcDogbnVtYmVyLFxyXG4gICAgcmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W11cclxuICApOiBGbGlnaHRJdGluZXJhcnlbXSB7XHJcbiAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBjb25zdCBkZXBhcnR1cmVUaW1lID0gTnVtYmVyKFxyXG4gICAgICAgIG1vbWVudChyZXN1bHQub3V0Ym91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBuZXdOdW1TdHJpbmcxID0gTnVtYmVyKFxyXG4gICAgICAgIE1hdGguZmxvb3IoTnVtYmVyKG1pbkRlcCAvIDEwMCkpLnRvU3RyaW5nKCkgK1xyXG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1NaW4oTWF0aC5jZWlsKE51bWJlcihtaW5EZXAgJSAxMDApKSlcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgbmV3TnVtU3RyaW5nMiA9IE51bWJlcihcclxuICAgICAgICBNYXRoLmZsb29yKE51bWJlcihtYXhEZXAgLyAxMDApKS50b1N0cmluZygpICtcclxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWluKE1hdGguY2VpbChOdW1iZXIobWF4RGVwICUgMTAwKSkpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm4gZGVwYXJ0dXJlVGltZSA+PSBuZXdOdW1TdHJpbmcxICYmIGRlcGFydHVyZVRpbWUgPD0gbmV3TnVtU3RyaW5nMjtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnlSZXR1cm5EZXBhcnR1cmVUaW1lKFxyXG4gICAgbWluRGVwOiBudW1iZXIsXHJcbiAgICBtYXhEZXA6IG51bWJlcixcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgaWYgKCFtaW5EZXAgJiYgIW1heERlcCkge1xyXG4gICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdOdW1TdHJpbmcxID0gTnVtYmVyKFxyXG4gICAgICBNYXRoLmZsb29yKE51bWJlcihtaW5EZXAgLyAxMDApKS50b1N0cmluZygpICtcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybU1pbihNYXRoLmNlaWwoTnVtYmVyKG1pbkRlcCAlIDEwMCkpKVxyXG4gICAgKTtcclxuICAgIGNvbnN0IG5ld051bVN0cmluZzIgPSBOdW1iZXIoXHJcbiAgICAgIE1hdGguZmxvb3IoTnVtYmVyKG1heERlcCAvIDEwMCkpLnRvU3RyaW5nKCkgK1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtTWluKE1hdGguY2VpbChOdW1iZXIobWF4RGVwICUgMTAwKSkpXHJcbiAgICApO1xyXG5cclxuICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmICghcmVzdWx0LmluYm91bmRGbGlnaHRzIHx8ICFyZXN1bHQuaW5ib3VuZEZsaWdodHNbMF0pIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZGVwYXJ0dXJlVGltZSA9IE51bWJlcihcclxuICAgICAgICBtb21lbnQocmVzdWx0LmluYm91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gZGVwYXJ0dXJlVGltZSA+PSBuZXdOdW1TdHJpbmcxICYmIGRlcGFydHVyZVRpbWUgPD0gbmV3TnVtU3RyaW5nMjtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnlSZXR1cm5BcnJpdmFsVGltZShcclxuICAgIG1pbkFycjogbnVtYmVyLFxyXG4gICAgbWF4QXJyOiBudW1iZXIsXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIGlmICghbWluQXJyICYmICFtYXhBcnIpIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3TnVtU3RyaW5nMSA9IE51bWJlcihcclxuICAgICAgTWF0aC5mbG9vcihOdW1iZXIobWluQXJyIC8gMTAwKSkudG9TdHJpbmcoKSArXHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1NaW4oTWF0aC5jZWlsKE51bWJlcihtaW5BcnIgJSAxMDApKSlcclxuICAgICk7XHJcbiAgICBjb25zdCBuZXdOdW1TdHJpbmcyID0gTnVtYmVyKFxyXG4gICAgICBNYXRoLmZsb29yKE51bWJlcihtYXhBcnIgLyAxMDApKS50b1N0cmluZygpICtcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybU1pbihNYXRoLmNlaWwoTnVtYmVyKG1heEFyciAlIDEwMCkpKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAoIXJlc3VsdC5pbmJvdW5kRmxpZ2h0cyB8fCAhcmVzdWx0LmluYm91bmRGbGlnaHRzWzBdKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGFycml2YWxUaW1lID0gTnVtYmVyKFxyXG4gICAgICAgIG1vbWVudChcclxuICAgICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1tyZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgLmRhdGVUaW1lQXJyaXZpbmdcclxuICAgICAgICApLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHJldFZhbCA9XHJcbiAgICAgICAgYXJyaXZhbFRpbWUgPj0gbmV3TnVtU3RyaW5nMSAmJiBhcnJpdmFsVGltZSA8PSBuZXdOdW1TdHJpbmcyO1xyXG5cclxuICAgICAgLy8gZm9yIGRlYnVnZ2luZ1xyXG4gICAgICAvLyBpZiAoIXJldFZhbCkge1xyXG4gICAgICAvLyAgIGNvbnNvbGUud2FybihgKysrIEZpbHRlcmluZyBPdXQ6ICR7YXJyaXZhbFRpbWV9ICsrK2ApO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICByZXR1cm4gcmV0VmFsO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeUFycml2YWxUaW1lKFxyXG4gICAgbWluQXJyOiBudW1iZXIsXHJcbiAgICBtYXhBcnI6IG51bWJlcixcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgY29uc3QgbmV3TnVtU3RyaW5nMSA9IE51bWJlcihcclxuICAgICAgTWF0aC5mbG9vcihOdW1iZXIobWluQXJyIC8gMTAwKSkudG9TdHJpbmcoKSArXHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1NaW4oTWF0aC5jZWlsKE51bWJlcihtaW5BcnIgJSAxMDApKSlcclxuICAgICk7XHJcbiAgICBjb25zdCBuZXdOdW1TdHJpbmcyID0gTnVtYmVyKFxyXG4gICAgICBNYXRoLmZsb29yKE51bWJlcihtYXhBcnIgLyAxMDApKS50b1N0cmluZygpICtcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybU1pbihNYXRoLmNlaWwoTnVtYmVyKG1heEFyciAlIDEwMCkpKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBjb25zdCBhcnJpdmFsVGltZSA9IE51bWJlcihcclxuICAgICAgICBtb21lbnQoXHJcbiAgICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzW3Jlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgLmRhdGVUaW1lQXJyaXZpbmdcclxuICAgICAgICApLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm4gYXJyaXZhbFRpbWUgPj0gbmV3TnVtU3RyaW5nMSAmJiBhcnJpdmFsVGltZSA8PSBuZXdOdW1TdHJpbmcyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeUJhZ2dhZ2UoXHJcbiAgICBiYWdnYWdlRmlsdGVyczogU2VsZWN0RmlsdGVyW10sXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gYmFnZ2FnZUZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LnNlbGVjdGVkKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWQ/Lmxlbmd0aCA+PSAxICYmIHNlbGVjdGVkLmxlbmd0aCAhPT0gYmFnZ2FnZUZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHRvdGFsQmFncyA9IHRoaXMuZ2V0VG90YWxCYWdnYWdlKHJlc3VsdCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmZpbmQoKHgpID0+IHgudmFsdWUgPT09IHRvdGFsQmFncyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJysrKyBFcnJvciBkZXRlcm1lbmluZyBiYWdnYWdlOiAke2Vycm9yfSArKysnKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnlQcmljZShcclxuICAgIG1pblByaWNlOiBudW1iZXIsXHJcbiAgICBtYXhQcmljZTogbnVtYmVyLFxyXG4gICAgcmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W11cclxuICApOiBGbGlnaHRJdGluZXJhcnlbXSB7XHJcbiAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhgKysrIFByaWNlOiAke3Jlc3VsdC50b3RhbC5wcmljZX0gaXMgYmV0d2VlbjogJHttaW5QcmljZX0gYW5kICR7bWF4UHJpY2V9OiAke3Jlc3VsdC50b3RhbC5wcmljZSA+PSBtaW5QcmljZSAmJiByZXN1bHQudG90YWwucHJpY2UgPD0gbWF4UHJpY2V9ICsrK2ApXHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0LnRvdGFsLnByaWNlID49IG1pblByaWNlICYmIHJlc3VsdC50b3RhbC5wcmljZSA8PSBtYXhQcmljZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gZmlsdGVyIHRoZSByZXN1bHRzIGJ5IHRoZSBudW1iZXIgb2Ygc3RvcHNcclxuICAgKiBAcGFyYW0gc3RvcEZpbHRlcnMgLSB0aGUgc2VsZWN0ZWQgc3RvcHNcclxuICAgKiBAcGFyYW0gZnVsbFJlc3VsdHMgLSBhbGwgb2Ygb3VyIHJlc3VsdHMgc28gZmFyXHJcbiAgICovXHJcbiAgZmlsdGVyUmVzdWx0c0J5U3RvcHMoXHJcbiAgICBzdG9wRmlsdGVyczogU2VsZWN0RmlsdGVyW10sXHJcbiAgICBmdWxsUmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W11cclxuICApOiBGbGlnaHRJdGluZXJhcnlbXSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IHN0b3BGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5zZWxlY3RlZCk7XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkPy5sZW5ndGggPj0gMSAmJiBzZWxlY3RlZC5sZW5ndGggIT09IHN0b3BGaWx0ZXJzLmxlbmd0aCkge1xyXG4gICAgICBmdWxsUmVzdWx0cyA9IGZ1bGxSZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG90YWxTdG9wcyA9IHJlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgICAgY29uc3QgaGF2ZVN0b3AgPSBzZWxlY3RlZC5maW5kKFxyXG4gICAgICAgICAgKHNlbGVjdGVkMTogU2VsZWN0RmlsdGVyKSA9PiBzZWxlY3RlZDEudmFsdWUgPT09IHRvdGFsU3RvcHNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gaGF2ZVN0b3A7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmdWxsUmVzdWx0cztcclxuICB9XHJcblxyXG4gIGZpbHRlclJlc3VsdHNCeUFpcmxpbmUoXHJcbiAgICBhaXJsaW5lRmlsdGVyczogU2VsZWN0RmlsdGVyW10sXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gYWlybGluZUZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LnNlbGVjdGVkKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWQ/Lmxlbmd0aCA+PSAxICYmIHNlbGVjdGVkLmxlbmd0aCAhPT0gYWlybGluZUZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmZpbmQoXHJcbiAgICAgICAgICAoeCkgPT4geC52YWx1ZSA9PT0gcmVzdWx0Lm91dGJvdW5kRmxpZ2h0c1swXS5vcGVyYXRpbmdDYXJyaWVyXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJSZXN1bHRzQnlDbGFzcyhcclxuICAgIGNsYXNzRmlsdGVyczogU2VsZWN0RmlsdGVyW10sXHJcbiAgICByZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXVxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gY2xhc3NGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5zZWxlY3RlZCk7XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkPy5sZW5ndGggPj0gMSAmJiBzZWxlY3RlZC5sZW5ndGggIT09IGNsYXNzRmlsdGVycy5sZW5ndGgpIHtcclxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQuZmluZChcclxuICAgICAgICAgICh4KSA9PiB4LnZhbHVlID09PSByZXN1bHQub3V0Ym91bmRGbGlnaHRzWzBdLmNhYmluQ2xhc3NcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIGZpbHRlckJ5RGVwYXJ0dXJlQWlycG9ydChcclxuICAgIGRlcGFydHVyZUFpcnBvcnRzOiBTZWxlY3RGaWx0ZXJbXSxcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBkZXBhcnR1cmVBaXJwb3J0cy5maWx0ZXIoKHgpID0+IHguc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZD8ubGVuZ3RoID49IDEgJiYgc2VsZWN0ZWQubGVuZ3RoICE9PSBkZXBhcnR1cmVBaXJwb3J0cy5sZW5ndGgpIHtcclxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQuZmluZChcclxuICAgICAgICAgICh4KSA9PiB4LnZhbHVlID09PSByZXN1bHQub3V0Ym91bmRGbGlnaHRzWzBdLm9yaWdpbkFpcnBvcnRcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIGZpbHRlckJ5QXJyaXZhbEFpcnBvcnQoXHJcbiAgICBhcnJpdmFsQWlycG9ydHM6IFNlbGVjdEZpbHRlcltdLFxyXG4gICAgcmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W11cclxuICApOiBGbGlnaHRJdGluZXJhcnlbXSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IGFycml2YWxBaXJwb3J0cy5maWx0ZXIoKHgpID0+IHguc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZD8ubGVuZ3RoID49IDEgJiYgc2VsZWN0ZWQubGVuZ3RoICE9PSBhcnJpdmFsQWlycG9ydHMubGVuZ3RoKSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25BaXJwb3J0ID1cclxuICAgICAgICAgIHJlc3VsdC5vdXRib3VuZEZsaWdodHNbcmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAuZGVzdGluYXRpb25BaXJwb3J0O1xyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZC5maW5kKCh4KSA9PiB4LnZhbHVlID09PSBkZXN0aW5hdGlvbkFpcnBvcnQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIGZpbHRlckJ5RGVwYXJ0dXJlUmV0dXJuQWlycG9ydChcclxuICAgIGRlcGFydHVyZUFpcnBvcnRzOiBTZWxlY3RGaWx0ZXJbXSxcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBkZXBhcnR1cmVBaXJwb3J0cy5maWx0ZXIoKHgpID0+IHguc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZD8ubGVuZ3RoID49IDEgJiYgc2VsZWN0ZWQubGVuZ3RoICE9PSBkZXBhcnR1cmVBaXJwb3J0cy5sZW5ndGgpIHtcclxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAoIXJlc3VsdC5pbmJvdW5kRmxpZ2h0cz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZC5maW5kKFxyXG4gICAgICAgICAgKHgpID0+IHgudmFsdWUgPT09IHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1swXS5vcmlnaW5BaXJwb3J0XHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeUFycml2YWxSZXR1cm5BaXJwb3J0KFxyXG4gICAgYXJyaXZhbEFpcnBvcnRzOiBTZWxlY3RGaWx0ZXJbXSxcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBhcnJpdmFsQWlycG9ydHMuZmlsdGVyKCh4KSA9PiB4LnNlbGVjdGVkKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWQ/Lmxlbmd0aCA+PSAxICYmIHNlbGVjdGVkLmxlbmd0aCAhPT0gYXJyaXZhbEFpcnBvcnRzLmxlbmd0aCkge1xyXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzdWx0LmluYm91bmRGbGlnaHRzPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25BaXJwb3J0ID1cclxuICAgICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1tyZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgLmRlc3RpbmF0aW9uQWlycG9ydDtcclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQuZmluZCgoeCkgPT4geC52YWx1ZSA9PT0gZGVzdGluYXRpb25BaXJwb3J0KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBnZXRNaW5EdXJhdGlvbihyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSwgaXNSZXR1cm4gPSBmYWxzZSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWluID0gMDtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgZHVyID0gMDtcclxuXHJcbiAgICAgIGlmICghaXNSZXR1cm4pIHtcclxuICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzLmZvckVhY2goKG91dDogRmxpZ2h0Sm91cm5leSkgPT4ge1xyXG4gICAgICAgICAgZHVyICs9IG91dC50b3RhbER1cmF0aW9uO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzPy5sZW5ndGggJiYgaXNSZXR1cm4pIHtcclxuICAgICAgICByZXN1bHQuaW5ib3VuZEZsaWdodHMuZm9yRWFjaCgoaW5iOiBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgICBkdXIgKz0gaW5iLnRvdGFsRHVyYXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghbWluIHx8IGR1ciA8IG1pbikge1xyXG4gICAgICAgIG1pbiA9IGR1cjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1pbjtcclxuICB9XHJcblxyXG4gIGdldE1heER1cmF0aW9uKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdLCBpc1JldHVybiA9IGZhbHNlKTogbnVtYmVyIHtcclxuICAgIGxldCBtYXggPSAwO1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGxldCBkdXIgPSAwO1xyXG4gICAgICBpZiAoIWlzUmV0dXJuKSB7XHJcbiAgICAgICAgcmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5mb3JFYWNoKChvdXQ6IEZsaWdodEpvdXJuZXkpID0+IHtcclxuICAgICAgICAgIGR1ciArPSBvdXQudG90YWxEdXJhdGlvbjtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlc3VsdC5pbmJvdW5kRmxpZ2h0cz8ubGVuZ3RoICYmIGlzUmV0dXJuKSB7XHJcbiAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzLmZvckVhY2goKGluYjogRmxpZ2h0Sm91cm5leSkgPT4ge1xyXG4gICAgICAgICAgZHVyICs9IGluYi50b3RhbER1cmF0aW9uO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIW1heCB8fCBkdXIgPiBtYXgpIHtcclxuICAgICAgICBtYXggPSBkdXI7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBtYXg7XHJcbiAgfVxyXG5cclxuICBnZXRNaW5BcnJpdmFsVGltZShyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWluOiBudW1iZXI7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgbGV0IG1pbkRlcFRpbWUgPSBOdW1iZXIoXHJcbiAgICAgICAgbW9tZW50KFxyXG4gICAgICAgICAgcmVzdWx0Lm91dGJvdW5kRmxpZ2h0c1tyZXN1bHQub3V0Ym91bmRGbGlnaHRzLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgIC5kYXRlVGltZUFycml2aW5nXHJcbiAgICAgICAgKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICApO1xyXG4gICAgICBtaW5EZXBUaW1lID0gTWF0aC5mbG9vcihtaW5EZXBUaW1lIC8gMTAwKSAqIDEwMDtcclxuICAgICAgaWYgKCFtaW4gfHwgbWluRGVwVGltZSA8IG1pbikge1xyXG4gICAgICAgIG1pbiA9IG1pbkRlcFRpbWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBtaW47XHJcbiAgfVxyXG5cclxuICBnZXRNaW5SZXR1cm5BcnJpdmFsVGltZShyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWluOiBudW1iZXI7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5pbmJvdW5kRmxpZ2h0cyAmJiByZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IG1pbkRlcFRpbWUgPSBOdW1iZXIoXHJcbiAgICAgICAgICBtb21lbnQoXHJcbiAgICAgICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1tyZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgICAuZGF0ZVRpbWVBcnJpdmluZ1xyXG4gICAgICAgICAgKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbWluRGVwVGltZSA9IE1hdGguZmxvb3IobWluRGVwVGltZSAvIDEwMCkgKiAxMDA7XHJcbiAgICAgICAgaWYgKCFtaW4gfHwgbWluRGVwVGltZSA8IG1pbikge1xyXG4gICAgICAgICAgbWluID0gbWluRGVwVGltZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBtaW47XHJcbiAgfVxyXG5cclxuICBnZXRNYXhSZXR1cm5BcnJpdmFsVGltZShyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWF4OiBudW1iZXI7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5pbmJvdW5kRmxpZ2h0cyAmJiByZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IG1heERlcFRpbWUgPSBOdW1iZXIoXHJcbiAgICAgICAgICBtb21lbnQoXHJcbiAgICAgICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1tyZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgICAuZGF0ZVRpbWVBcnJpdmluZ1xyXG4gICAgICAgICAgKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbWF4RGVwVGltZSA9IE1hdGguY2VpbChtYXhEZXBUaW1lIC8gMTAwKSAqIDEwMDtcclxuICAgICAgICBpZiAoIW1heCB8fCBtYXhEZXBUaW1lID4gbWF4KSB7XHJcbiAgICAgICAgICBtYXggPSBtYXhEZXBUaW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1heDtcclxuICB9XHJcblxyXG4gIGdldE1heEFycml2YWxUaW1lKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBtYXg6IG51bWJlcjtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgbWF4RGVwVGltZSA9IE51bWJlcihcclxuICAgICAgICBtb21lbnQoXHJcbiAgICAgICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzW3Jlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgLmRhdGVUaW1lQXJyaXZpbmdcclxuICAgICAgICApLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBtYXhEZXBUaW1lID0gTWF0aC5jZWlsKG1heERlcFRpbWUgLyAxMDApICogMTAwO1xyXG4gICAgICBpZiAoIW1heCB8fCBtYXhEZXBUaW1lID4gbWF4KSB7XHJcbiAgICAgICAgbWF4ID0gbWF4RGVwVGltZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxuXHJcbiAgZ2V0TWluRGVwYXJ0dXJlVGltZShyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWluOiBudW1iZXI7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgbGV0IG1pbkRlcFRpbWUgPSBOdW1iZXIoXHJcbiAgICAgICAgbW9tZW50KHJlc3VsdC5vdXRib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICk7XHJcbiAgICAgIG1pbkRlcFRpbWUgPSBNYXRoLmZsb29yKG1pbkRlcFRpbWUgLyAxMDApICogMTAwO1xyXG4gICAgICBpZiAoIW1pbiB8fCBtaW5EZXBUaW1lIDwgbWluKSB7XHJcbiAgICAgICAgbWluID0gbWluRGVwVGltZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1pbjtcclxuICB9XHJcblxyXG4gIGdldE1pblJldHVybkRlcGFydHVyZVRpbWUocmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10pOiBudW1iZXIge1xyXG4gICAgbGV0IG1pbjogbnVtYmVyO1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQuaW5ib3VuZEZsaWdodHMgJiYgcmVzdWx0LmluYm91bmRGbGlnaHRzWzBdKSB7XHJcbiAgICAgICAgbGV0IG1pbkRlcFRpbWUgPSBOdW1iZXIoXHJcbiAgICAgICAgICBtb21lbnQocmVzdWx0LmluYm91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbWluRGVwVGltZSA9IE1hdGguZmxvb3IobWluRGVwVGltZSAvIDEwMCkgKiAxMDA7XHJcbiAgICAgICAgaWYgKCFtaW4gfHwgbWluRGVwVGltZSA8IG1pbikge1xyXG4gICAgICAgICAgbWluID0gbWluRGVwVGltZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBtaW47XHJcbiAgfVxyXG5cclxuICBnZXRNYXhSZXR1cm5EZXBhcnR1cmVUaW1lKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBtYXg6IG51bWJlcjtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzICYmIHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1swXSkge1xyXG4gICAgICAgIGxldCBtYXhEZXBUaW1lID0gTnVtYmVyKFxyXG4gICAgICAgICAgbW9tZW50KHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZykuZm9ybWF0KCdISG1tJylcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBtYXhEZXBUaW1lID0gTWF0aC5jZWlsKG1heERlcFRpbWUgLyAxMDApICogMTAwO1xyXG5cclxuICAgICAgICBpZiAoIW1heCB8fCBtYXhEZXBUaW1lID4gbWF4KSB7XHJcbiAgICAgICAgICBtYXggPSBtYXhEZXBUaW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1heDtcclxuICB9XHJcblxyXG4gIGdldE1heERlcGFydHVyZVRpbWUocmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10pOiBudW1iZXIge1xyXG4gICAgbGV0IG1heDogbnVtYmVyO1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGxldCBtYXhEZXBUaW1lID0gTnVtYmVyKFxyXG4gICAgICAgIG1vbWVudChyZXN1bHQub3V0Ym91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgbWF4RGVwVGltZSA9IE1hdGguY2VpbChtYXhEZXBUaW1lIC8gMTAwKSAqIDEwMDtcclxuXHJcbiAgICAgIGlmICghbWF4IHx8IG1heERlcFRpbWUgPiBtYXgpIHtcclxuICAgICAgICBtYXggPSBtYXhEZXBUaW1lO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxuXHJcbiAgZ2V0QmFnZ2FnZShyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IFNlbGVjdEZpbHRlcltdIHtcclxuICAgIGNvbnN0IGJhZ2dhZ2U6IGFueSA9IHt9O1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkQWRkaXRpb25hbCA9IEpTT04ucGFyc2UocmVzdWx0LmFkZGl0aW9uYWwpO1xyXG5cclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG5cclxuICAgICAgICBpZiAocGFyc2VkQWRkaXRpb25hbCAmJiBwYXJzZWRBZGRpdGlvbmFsLm91dGJvdW5kRmxpZ2h0cykge1xyXG4gICAgICAgICAgcGFyc2VkQWRkaXRpb25hbC5vdXRib3VuZEZsaWdodHMuZm9yRWFjaCgoZmxpZ2h0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgZmxpZ2h0LmJhZ2dhZ2UuZm9yRWFjaCgoYmFnOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYmFnLmFsbG93YW5jZSAmJiBiYWcuYWxsb3dhbmNlID4gdG90YWwpIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsID0gYmFnLmFsbG93YW5jZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZWRBZGRpdGlvbmFsICYmIHBhcnNlZEFkZGl0aW9uYWwuYmFnZ2FnZUFsbG93YW5jZSkge1xyXG4gICAgICAgICAgcGFyc2VkQWRkaXRpb25hbC5iYWdnYWdlQWxsb3dhbmNlLmZvckVhY2goKGJhZ2dhZ2VBbGxvdzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBiYWdnYWdlQWxsb3cuYmFnZ2FnZS5xdHkgJiZcclxuICAgICAgICAgICAgICBOdW1iZXIoYmFnZ2FnZUFsbG93LmJhZ2dhZ2UucXR5KSA+IHRvdGFsXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHRvdGFsID0gTnVtYmVyKGJhZ2dhZ2VBbGxvdy5iYWdnYWdlLnF0eSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYmFnZ2FnZVt0b3RhbF0gPSB7XHJcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgICB2YWx1ZTogdG90YWwsXHJcbiAgICAgICAgICBkaXNwbGF5OiBgJHt0b3RhbH0gYmFnJHt0b3RhbCAhPT0gMSA/ICdzJyA6ICcnfWBcclxuICAgICAgICB9O1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCsrKyBFcnJvciBwYXJzaW5nIGFkZGl0aW9uYWwgZmxpZ2h0IGRhdGE6ICR7ZXJyb3J9ICsrK2ApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhiYWdnYWdlKTtcclxuICB9XHJcblxyXG4gIGdldE1pblByaWNlKHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW5QcmljZTogbnVtYmVyO1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmICghbWluUHJpY2UgfHwgcmVzdWx0LnRvdGFsLnByaWNlIDwgbWluUHJpY2UpIHtcclxuICAgICAgICBtaW5QcmljZSA9IHJlc3VsdC50b3RhbC5wcmljZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1pblByaWNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4UHJpY2UocmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10pOiBudW1iZXIge1xyXG4gICAgbGV0IG1heFByaWNlOiBhbnk7XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKCFtYXhQcmljZSB8fCByZXN1bHQudG90YWwucHJpY2UgPiBtYXhQcmljZSkge1xyXG4gICAgICAgIG1heFByaWNlID0gcmVzdWx0LnRvdGFsLnByaWNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWF4UHJpY2U7XHJcbiAgfVxyXG5cclxuICBnZXRBbGxTdG9wcyhyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IFNlbGVjdEZpbHRlcltdIHtcclxuICAgIGNvbnN0IGFsbFN0b3BzOiBhbnkgPSB7fTtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICBjb25zdCB0b3RhbFN0b3BzID0gcmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxOyAvLyBtaWdodCBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoaXNcclxuICAgICAgYWxsU3RvcHNbdG90YWxTdG9wc10gPSB7XHJcbiAgICAgICAgdmFsdWU6IHRvdGFsU3RvcHMsXHJcbiAgICAgICAgZGlzcGxheTogYCR7dG90YWxTdG9wc30gc3RvcGAgKyAodG90YWxTdG9wcyAhPT0gMSA/ICdzJyA6ICcnKSxcclxuICAgICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGFsbFN0b3BzKTtcclxuICB9XHJcblxyXG4gIGdldEFsbENsYXNzZXMocmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10pOiBTZWxlY3RGaWx0ZXJbXSB7XHJcbiAgICBjb25zdCBhbGxDbGFzc2VzOiBhbnkgPSBbXTtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICByZXN1bHQub3V0Ym91bmRGbGlnaHRzLmZvckVhY2goKG91dEZsaWdodDogRmxpZ2h0Sm91cm5leSkgPT4ge1xyXG4gICAgICAgIGFsbENsYXNzZXNbb3V0RmxpZ2h0LmNhYmluQ2xhc3NdID0ge1xyXG4gICAgICAgICAgdmFsdWU6IG91dEZsaWdodC5jYWJpbkNsYXNzLFxyXG4gICAgICAgICAgZGlzcGxheTogb3V0RmxpZ2h0LmNhYmluQ2xhc3MsXHJcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgICAgICB9IGFzIFNlbGVjdEZpbHRlcjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAocmVzdWx0LmluYm91bmRGbGlnaHRzKSB7XHJcbiAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzLmZvckVhY2goKGluRmxpZ2h0OiBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgICBhbGxDbGFzc2VzW2luRmxpZ2h0LmNhYmluQ2xhc3NdID0ge1xyXG4gICAgICAgICAgICB2YWx1ZTogaW5GbGlnaHQuY2FiaW5DbGFzcyxcclxuICAgICAgICAgICAgZGlzcGxheTogaW5GbGlnaHQuY2FiaW5DbGFzcyxcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgICB9IGFzIFNlbGVjdEZpbHRlcjtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoYWxsQ2xhc3Nlcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBjcmVhdGUgc2VsZWN0IGZpbHRlcnMgZm9yIGFsbCB1bmlxdWUgZGVwYXJ0dXJlIGFpcnBvcnRzIHJldHVybmVkIGluIHRoZSBzZWFyY2hcclxuICAgKiBAcGFyYW0gcmVzdWx0cyAtIHRoZSBmbGlnaHQgcmVzdWx0c1xyXG4gICAqL1xyXG4gIGdldEFsbERlcGFydHVyZUFpcnBvcnRzKFxyXG4gICAgcmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10sXHJcbiAgICBpbmJvdW5kID0gZmFsc2VcclxuICApOiBTZWxlY3RGaWx0ZXJbXSB7XHJcbiAgICBjb25zdCBhbGxBaXJwb3J0czogYW55ID0ge307XHJcblxyXG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5vdXRib3VuZEZsaWdodHMubGVuZ3RoICYmICFpbmJvdW5kKSB7XHJcbiAgICAgICAgYWxsQWlycG9ydHNbcmVzdWx0Lm91dGJvdW5kRmxpZ2h0c1swXS5vcmlnaW5BaXJwb3J0XSA9IHtcclxuICAgICAgICAgIHZhbHVlOiByZXN1bHQub3V0Ym91bmRGbGlnaHRzWzBdLm9yaWdpbkFpcnBvcnQsXHJcbiAgICAgICAgICBkaXNwbGF5OiByZXN1bHQub3V0Ym91bmRGbGlnaHRzWzBdLm9yaWdpbkFpcnBvcnROYW1lLFxyXG4gICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlc3VsdC5pbmJvdW5kRmxpZ2h0cz8ubGVuZ3RoICYmIGluYm91bmQpIHtcclxuICAgICAgICBhbGxBaXJwb3J0c1tyZXN1bHQuaW5ib3VuZEZsaWdodHNbMF0ub3JpZ2luQWlycG9ydF0gPSB7XHJcbiAgICAgICAgICB2YWx1ZTogcmVzdWx0LmluYm91bmRGbGlnaHRzWzBdLm9yaWdpbkFpcnBvcnQsXHJcbiAgICAgICAgICBkaXNwbGF5OiByZXN1bHQuaW5ib3VuZEZsaWdodHNbMF0ub3JpZ2luQWlycG9ydE5hbWUsXHJcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhhbGxBaXJwb3J0cyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBjcmVhdGUgc2VsZWN0IGZpbHRlcnMgZm9yIGFsbCB1bmlxdWUgZGVwYXJ0dXJlIGFpcnBvcnRzIHJldHVybmVkIGluIHRoZSBzZWFyY2hcclxuICAgKiBAcGFyYW0gcmVzdWx0cyAtIHRoZSBmbGlnaHQgcmVzdWx0c1xyXG4gICAqL1xyXG4gIGdldEFsbEFycml2YWxBaXJwb3J0cyhcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdLFxyXG4gICAgaW5ib3VuZCA9IGZhbHNlXHJcbiAgKTogU2VsZWN0RmlsdGVyW10ge1xyXG4gICAgY29uc3QgYWxsQWlycG9ydHM6IGFueSA9IHt9O1xyXG5cclxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQub3V0Ym91bmRGbGlnaHRzLmxlbmd0aCAmJiAhaW5ib3VuZCkge1xyXG4gICAgICAgIGFsbEFpcnBvcnRzW1xyXG4gICAgICAgICAgcmVzdWx0Lm91dGJvdW5kRmxpZ2h0c1tcclxuICAgICAgICAgICAgcmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxXHJcbiAgICAgICAgICBdLmRlc3RpbmF0aW9uQWlycG9ydFxyXG4gICAgICAgIF0gPSB7XHJcbiAgICAgICAgICB2YWx1ZTpcclxuICAgICAgICAgICAgcmVzdWx0Lm91dGJvdW5kRmxpZ2h0c1tyZXN1bHQub3V0Ym91bmRGbGlnaHRzLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgICAgLmRlc3RpbmF0aW9uQWlycG9ydCxcclxuICAgICAgICAgIGRpc3BsYXk6XHJcbiAgICAgICAgICAgIHJlc3VsdC5vdXRib3VuZEZsaWdodHNbcmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAgIC5kZXN0aW5hdGlvbkFpcnBvcnROYW1lLFxyXG4gICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlc3VsdC5pbmJvdW5kRmxpZ2h0cz8ubGVuZ3RoICYmIGluYm91bmQpIHtcclxuICAgICAgICBhbGxBaXJwb3J0c1tcclxuICAgICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1tcclxuICAgICAgICAgICAgcmVzdWx0LmluYm91bmRGbGlnaHRzLmxlbmd0aCAtIDFcclxuICAgICAgICAgIF0uZGVzdGluYXRpb25BaXJwb3J0XHJcbiAgICAgICAgXSA9IHtcclxuICAgICAgICAgIHZhbHVlOlxyXG4gICAgICAgICAgICByZXN1bHQuaW5ib3VuZEZsaWdodHNbcmVzdWx0LmluYm91bmRGbGlnaHRzLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgICAgLmRlc3RpbmF0aW9uQWlycG9ydCxcclxuICAgICAgICAgIGRpc3BsYXk6XHJcbiAgICAgICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0c1tyZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoIC0gMV1cclxuICAgICAgICAgICAgICAuZGVzdGluYXRpb25BaXJwb3J0TmFtZSxcclxuICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGFsbEFpcnBvcnRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiAtIGNyZWF0ZSBzZWxlY3QgZmlsdGVycyBmb3IgYWxsIHVuaXF1ZSBhaXJsaW5lcyByZXR1cm5lZCBpbiB0aGUgc2VhcmNoXHJcbiAgICogQHBhcmFtIHJlc3VsdHMgLSB0aGUgZmxpZ2h0IHJlc3VsdHNcclxuICAgKi9cclxuICBnZXRBbGxBaXJsaW5lcyhyZXN1bHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IFNlbGVjdEZpbHRlcltdIHtcclxuICAgIGNvbnN0IGFsbEFpcmxpbmVzOiBhbnkgPSB7fTtcclxuXHJcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdDogRmxpZ2h0SXRpbmVyYXJ5KSA9PiB7XHJcbiAgICAgIHJlc3VsdC5vdXRib3VuZEZsaWdodHMuZm9yRWFjaCgob3V0RmxpZ2h0OiBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgYWxsQWlybGluZXNbb3V0RmxpZ2h0Lm9wZXJhdGluZ0NhcnJpZXJdID0ge1xyXG4gICAgICAgICAgdmFsdWU6IG91dEZsaWdodC5vcGVyYXRpbmdDYXJyaWVyLFxyXG4gICAgICAgICAgZGlzcGxheTogb3V0RmxpZ2h0Lm9wZXJhdGluZ0NhcnJpZXJOYW1lLFxyXG4gICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgfSBhcyBTZWxlY3RGaWx0ZXI7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdC5pbmJvdW5kRmxpZ2h0cykge1xyXG4gICAgICAgIHJlc3VsdC5pbmJvdW5kRmxpZ2h0cy5mb3JFYWNoKChpbkZsaWdodDogRmxpZ2h0Sm91cm5leSkgPT4ge1xyXG4gICAgICAgICAgYWxsQWlybGluZXNbaW5GbGlnaHQub3BlcmF0aW5nQ2Fycmllcl0gPSB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBpbkZsaWdodC5vcGVyYXRpbmdDYXJyaWVyLFxyXG4gICAgICAgICAgICBkaXNwbGF5OiBpbkZsaWdodC5vcGVyYXRpbmdDYXJyaWVyTmFtZSxcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgICB9IGFzIFNlbGVjdEZpbHRlcjtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoYWxsQWlybGluZXMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2VsZWN0R3JvdXBlZEV1cm9zdGFyKFxyXG4gICAgc2VsZWN0ZWRFdXJvc3RhcjogRXVyb3N0YXJJdGVtLFxyXG4gICAgZmFyZTogRXVyb3N0YXJGYXJlLFxyXG4gICAgZGlyZWN0aW9uOiBGbGlnaHREaXJlY3Rpb25FbnVtXHJcbiAgKSB7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldCAmJlxyXG4gICAgICB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaC5jaG9zZW5TZWFyY2hUeXBlID09PSBFdXJvc3RhclNlYXJjaFR5cGUub25lV2F5ICYmXHJcbiAgICAgIGRpcmVjdGlvbiA9PT0gRmxpZ2h0RGlyZWN0aW9uRW51bS5PdXRib3VuZFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuZG9Cb29raW5nKFxyXG4gICAgICAgIGludEJhc2tldCxcclxuICAgICAgICBzZWxlY3RlZEV1cm9zdGFyLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG91dGJvdW5kRmxpZ2h0czogW3RoaXMubWFrZVNjaGVtYUZsaWdodHMoZmFyZS5mYXJlLCAnb3V0Ym91bmQnLCAwKV0sXHJcbiAgICAgICAgICBpbmJvdW5kRmxpZ2h0czogW10sXHJcbiAgICAgICAgICBqb3VybmV5VHlwZTogJ3NpbmdsZSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlbGVjdGVkRXVyb3N0YXIuZGF0ZURlcGFydHVyZVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldCAmJlxyXG4gICAgICB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaC5jaG9zZW5TZWFyY2hUeXBlID09PSBFdXJvc3RhclNlYXJjaFR5cGUucmV0dXJuICYmXHJcbiAgICAgIGRpcmVjdGlvbiA9PT0gRmxpZ2h0RGlyZWN0aW9uRW51bS5PdXRib3VuZFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cEV1cm9zdGFyID0gc2VsZWN0ZWRFdXJvc3RhcjtcclxuICAgICAgdGhpcy5zZWxlY3RlZEV1cm9zdGFyRmFyZSA9IGZhcmU7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0ZWRFdXJvc3Rhci51aWQ7XHJcblxyXG4gICAgICB0aGlzLnJlc3VsdHMubmV4dChcclxuICAgICAgICAodGhpcy5mdWxsUmVzdWx0cyBhcyBFdXJvc3RhclJlc3VsdHNbXSkubWFwKFxyXG4gICAgICAgICAgKHJlc3VsdDogRXVyb3N0YXJSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dGJvdW5kID0gcmVzdWx0Lm91dGJvdW5kLmZpbHRlcihcclxuICAgICAgICAgICAgICAoaXRlbTogRXVyb3N0YXJJdGVtLCBncm91cEluZGV4KSA9PiBpbmRleCA9PT0gZ3JvdXBJbmRleFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICByZXR1cm4geyBpbmJvdW5kOiByZXN1bHQuaW5ib3VuZCwgb3V0Ym91bmQgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldCAmJlxyXG4gICAgICB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaC5jaG9zZW5TZWFyY2hUeXBlID09PSBFdXJvc3RhclNlYXJjaFR5cGUucmV0dXJuICYmXHJcbiAgICAgIGRpcmVjdGlvbiA9PT0gRmxpZ2h0RGlyZWN0aW9uRW51bS5JbmJvdW5kICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cEV1cm9zdGFyXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5kb0Jvb2tpbmcoXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHNlbGVjdGVkRXVyb3N0YXIsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3V0Ym91bmRGbGlnaHRzOiBbXHJcbiAgICAgICAgICAgIHRoaXMubWFrZVNjaGVtYUZsaWdodHMoXHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV1cm9zdGFyRmFyZS5mYXJlLFxyXG4gICAgICAgICAgICAgICdvdXRib3VuZCcsXHJcbiAgICAgICAgICAgICAgMFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgaW5ib3VuZEZsaWdodHM6IFt0aGlzLm1ha2VTY2hlbWFGbGlnaHRzKGZhcmUuZmFyZSwgJ2luYm91bmQnLCAwKV0sXHJcbiAgICAgICAgICBqb3VybmV5VHlwZTogJ3JvdW5kdHJpcCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlbGVjdGVkRXVyb3N0YXIuZGF0ZURlcGFydHVyZSxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkR3JvdXBFdXJvc3Rhci5kYXRlQXJyaXZhbFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnJlc3VsdHMubmV4dCh0aGlzLmZ1bGxSZXN1bHRzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHM6IEV1cm9zdGFyUXVvdGVSZXN1bHRBcnJheSk6IElDaGVhcGVzdFByaWNlIHtcclxuICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHJldHVybjtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbMF0gYXMgRXVyb3N0YXJRdW90ZVJlc3VsdDtcclxuICAgIGNvbnN0IGpvdXJuZXlzID0gcmVzdWx0LmpvdXJuZXlzO1xyXG4gICAgY29uc3QgY3VycmVuY3kgPSBqb3VybmV5c1swXS50b3RhbC5jdXJyZW5jeTtcclxuICAgIHJldHVybiBqb3VybmV5cy5yZWR1Y2UoXHJcbiAgICAgIChjaGVhcGVzdFByaWNlOiBJQ2hlYXBlc3RQcmljZSwgcmVzdWx0OiBGbGlnaHRJdGluZXJhcnkpID0+IHtcclxuICAgICAgICBjb25zdCBwcmljZSA9IHJlc3VsdC50b3RhbC5wcmljZTtcclxuICAgICAgICBpZiAoY2hlYXBlc3RQcmljZS5hbW91bnQgPiBwcmljZSkgY2hlYXBlc3RQcmljZS5hbW91bnQgPSBwcmljZTtcclxuICAgICAgICByZXR1cm4gY2hlYXBlc3RQcmljZTtcclxuICAgICAgfSxcclxuICAgICAgeyBhbW91bnQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBjdXJyZW5jeUNvZGU6IGN1cnJlbmN5IH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGRvQm9va2luZyhcclxuICAgIGludEJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UsXHJcbiAgICBzZWxlY3RlZEZsaWdodDogRXVyb3N0YXJJdGVtLFxyXG4gICAgc2NoZW1hRGV0YWlsczogYW55LFxyXG4gICAgb3V0Ym91bmREYXRlOiBzdHJpbmcsXHJcbiAgICBpbmJvdW5kRGF0ZT86IHN0cmluZ1xyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBzb3VyY2VJZCwgY28yUGVySXRlbSwgY28yUGVyUGFzc2VuZ2VyLCB0b3RhbCB9ID0gc2VsZWN0ZWRGbGlnaHQ7XHJcbiAgICBjb25zdCBib29raW5nOiBBZGRJdGVtVG9CYXNrZXRNdXRhdGlvblZhcmlhYmxlcyA9IHtcclxuICAgICAgYWR1bHRzOiB0aGlzLmFkdWx0cyxcclxuICAgICAgYmFza2V0OiBpbnRCYXNrZXQuaWQsXHJcbiAgICAgIGNoaWxkcmVuOiB0aGlzLmNoaWxkcmVuLFxyXG4gICAgICBjbzJQZXJJdGVtLFxyXG4gICAgICBjbzJQZXJQYXNzZW5nZXIsXHJcbiAgICAgIGN1cnJlbmN5OiB0b3RhbC5jdXJyZW5jeSBhcyBDdXJyZW5jeUNvZGUsXHJcbiAgICAgIGRldGFpbDogc2NoZW1hRGV0YWlscyxcclxuICAgICAgcHJpY2U6IHRvdGFsLnByaWNlLFxyXG4gICAgICBzZWFyY2hRdWVyeTogdGhpcy5yZXN1bHRRdWVyeSxcclxuICAgICAgc2VydmljZTogc291cmNlSWQudG9TdHJpbmcoKSxcclxuICAgICAgb3V0Ym91bmREYXRlXHJcbiAgICB9O1xyXG4gICAgaWYgKGluYm91bmREYXRlKSB7XHJcbiAgICAgIGJvb2tpbmcuaW5ib3VuZERhdGUgPSBpbmJvdW5kRGF0ZTtcclxuICAgIH1cclxuICAgIHRoaXMuYmFza2V0U2VydmljZS5hZGRUb0Jhc2tldChcclxuICAgICAgYm9va2luZyxcclxuICAgICAgaW50QmFza2V0LFxyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2UsXHJcbiAgICAgIHRoaXMudHJhdmVsbGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG1ha2VTY2hlbWFGbGlnaHRzKFxyXG4gICAgc2VsZWN0ZWRGbGlnaHQ6IEZsaWdodEpvdXJuZXksXHJcbiAgICBmbGlnaHRHcm91cDogJ291dGJvdW5kJyB8ICdpbmJvdW5kJyxcclxuICAgIGdyb3VwSW5kZXg6IG51bWJlcixcclxuICAgIHNlZ21lbnRJbmRleD86IG51bWJlclxyXG4gICk6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjYWJpbkNsYXNzOiBzZWxlY3RlZEZsaWdodC5jYWJpbkNsYXNzLFxyXG4gICAgICBkYXRlVGltZUFycml2aW5nOiBzZWxlY3RlZEZsaWdodC5kYXRlVGltZUFycml2aW5nLFxyXG4gICAgICBkYXRlVGltZUFycml2aW5nVVRDOiBzZWxlY3RlZEZsaWdodC5kYXRlVGltZUFycml2aW5nVVRDLFxyXG4gICAgICBkYXRlVGltZURlcGFydGluZzogc2VsZWN0ZWRGbGlnaHQuZGF0ZVRpbWVEZXBhcnRpbmcsXHJcbiAgICAgIGRhdGVUaW1lRGVwYXJ0aW5nVVRDOiBzZWxlY3RlZEZsaWdodC5kYXRlVGltZURlcGFydGluZ1VUQyxcclxuICAgICAgZGVzdGluYXRpb25BaXJwb3J0OiBzZWxlY3RlZEZsaWdodC5kZXN0aW5hdGlvbkFpcnBvcnQsXHJcbiAgICAgIGpvdXJuZXlJbmZvOiB7XHJcbiAgICAgICAgZmxpZ2h0R3JvdXAsXHJcbiAgICAgICAgZ3JvdXBJbmRleCxcclxuICAgICAgICBzZWdtZW50SW5kZXhcclxuICAgICAgfSxcclxuICAgICAgbWFya2V0aW5nQ2Fycmllcjogc2VsZWN0ZWRGbGlnaHQubWFya2V0aW5nQ2FycmllcixcclxuICAgICAgbWFya2V0aW5nRmxpZ2h0TnVtYmVyOiBzZWxlY3RlZEZsaWdodC5tYXJrZXRpbmdGbGlnaHROdW1iZXIsXHJcbiAgICAgIG9wZXJhdGluZ0NhcnJpZXI6IHNlbGVjdGVkRmxpZ2h0Lm9wZXJhdGluZ0NhcnJpZXIsXHJcbiAgICAgIG9wZXJhdGluZ0ZsaWdodE51bWJlcjogc2VsZWN0ZWRGbGlnaHQub3BlcmF0aW5nRmxpZ2h0TnVtYmVyLFxyXG4gICAgICBvcmlnaW5BaXJwb3J0OiBzZWxlY3RlZEZsaWdodC5vcmlnaW5BaXJwb3J0LFxyXG4gICAgICB0b3RhbER1cmF0aW9uOiBzZWxlY3RlZEZsaWdodC50b3RhbER1cmF0aW9uLFxyXG4gICAgICBmYXJlVHlwZTogc2VsZWN0ZWRGbGlnaHQuZmFyZUluZm8udGl0bGVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUdyb3VwZWRJdGVtKFxyXG4gICAgcmV0dXJuT2JqZWN0OiBFdXJvc3Rhckdyb3VwZWRRdW90ZVJlc3VsdCxcclxuICAgIHNvdXJjZTogc3RyaW5nLFxyXG4gICAgb3V0Ym91bmRGbGlnaHRzOiBGbGlnaHRKb3VybmV5W10sXHJcbiAgICBvdXRib3VuZFRvdGFsRHVyYXRpb246IG51bWJlcixcclxuICAgIGluYm91bmRGbGlnaHRzOiBGbGlnaHRKb3VybmV5W10sXHJcbiAgICBpbmJvdW5kVG90YWxEdXJhdGlvbjogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAob3V0Ym91bmRGbGlnaHRzPy5sZW5ndGggJiYgIXJldHVybk9iamVjdC5kZXBhcnREYXRlVGltZSkge1xyXG4gICAgICBjb25zdCBmaXJzdCA9IG91dGJvdW5kRmxpZ2h0c1swXTtcclxuICAgICAgY29uc3QgbGFzdCA9IG91dGJvdW5kRmxpZ2h0c1tvdXRib3VuZEZsaWdodHMubGVuZ3RoIC0gMV07XHJcbiAgICAgIHJldHVybk9iamVjdC5vcmlnaW5BaXJwb3J0ID0gZmlyc3Qub3JpZ2luQWlycG9ydDtcclxuICAgICAgcmV0dXJuT2JqZWN0Lm9yaWdpbkFpcnBvcnROYW1lID0gZmlyc3Qub3JpZ2luQWlycG9ydE5hbWU7XHJcbiAgICAgIHJldHVybk9iamVjdC5kZXN0aW5hdGlvbkFpcnBvcnQgPSBsYXN0LmRlc3RpbmF0aW9uQWlycG9ydDtcclxuICAgICAgcmV0dXJuT2JqZWN0LmRlc3RpbmF0aW9uQWlycG9ydE5hbWUgPSBsYXN0LmRlc3RpbmF0aW9uQWlycG9ydE5hbWU7XHJcbiAgICAgIHJldHVybk9iamVjdC5kZXBhcnREYXRlVGltZSA9IGZpcnN0LmRhdGVUaW1lRGVwYXJ0aW5nO1xyXG4gICAgICByZXR1cm5PYmplY3QuYXJyaXZhbERhdGVUaW1lID0gbGFzdC5kYXRlVGltZUFycml2aW5nO1xyXG4gICAgICByZXR1cm5PYmplY3Qub3V0Ym91bmRUb3RhbER1cmF0aW9uID0gb3V0Ym91bmRUb3RhbER1cmF0aW9uO1xyXG4gICAgICByZXR1cm5PYmplY3QuZGF0YVNvdXJjZSA9IHNvdXJjZTtcclxuICAgICAgcmV0dXJuT2JqZWN0Lm9wZXJhdG9yID0gZmlyc3Qub3BlcmF0aW5nQ2FycmllcjtcclxuICAgICAgcmV0dXJuT2JqZWN0Lm9wZXJhdG9yRnVsbCA9IGZpcnN0Lm9wZXJhdGluZ0NhcnJpZXJOYW1lO1xyXG4gICAgICByZXR1cm5PYmplY3Qub3V0bGVnc0NvdW50ID0gb3V0Ym91bmRGbGlnaHRzLmxlbmd0aDtcclxuICAgICAgcmV0dXJuT2JqZWN0Lm91dGxlZ3MgPSBvdXRib3VuZEZsaWdodHM7XHJcbiAgICAgIHJldHVybk9iamVjdC5vdXRib3VuZEZsaWdodE51bWJlciA9XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmpvaW5Gcm9tQXR0cmlidXRlPEZsaWdodEpvdXJuZXk+KFxyXG4gICAgICAgICAgJy0nLFxyXG4gICAgICAgICAgJ29wZXJhdGluZ0ZsaWdodE51bWJlcicsXHJcbiAgICAgICAgICBvdXRib3VuZEZsaWdodHNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuT2JqZWN0LmlzUmV0dXJuID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGluYm91bmRGbGlnaHRzPy5sZW5ndGggJiYgIXJldHVybk9iamVjdC5pbmJvdW5kVG90YWxEdXJhdGlvbikge1xyXG4gICAgICByZXR1cm5PYmplY3QuaW5ib3VuZFRvdGFsRHVyYXRpb24gPSBpbmJvdW5kVG90YWxEdXJhdGlvbjtcclxuICAgICAgcmV0dXJuT2JqZWN0LmlubGVnc0NvdW50ID0gaW5ib3VuZEZsaWdodHMubGVuZ3RoO1xyXG4gICAgICByZXR1cm5PYmplY3QuaW5sZWdzID0gaW5ib3VuZEZsaWdodHM7XHJcbiAgICAgIHJldHVybk9iamVjdC5pbmJvdW5kRmxpZ2h0TnVtYmVyID1cclxuICAgICAgICB0aGlzLmhlbHBlcnMuam9pbkZyb21BdHRyaWJ1dGU8RmxpZ2h0Sm91cm5leT4oXHJcbiAgICAgICAgICAnLScsXHJcbiAgICAgICAgICAnb3BlcmF0aW5nRmxpZ2h0TnVtYmVyJyxcclxuICAgICAgICAgIGluYm91bmRGbGlnaHRzXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybk9iamVjdC5pc1JldHVybiA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbWFrZVNlc3Npb25SZXN1bHRzKFxyXG4gICAgZGF0YTogRXVyb3N0YXJRdW90ZVJlc3VsdEFycmF5XHJcbiAgKTogRXVyb3N0YXJTZXNzaW9uVHlwZSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXN1bHRzOiBkYXRhLFxyXG4gICAgICBncm91cERhdGE6IHRoaXMuZmxpZ2h0c1RvR3JvdXAsXHJcbiAgICAgIGdyb3VwZWQ6IHRoaXMuZ3JvdXBlZCxcclxuICAgICAgcXVlcnk6IHRoaXMucmVzdWx0UXVlcnlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRNaW5GbGlnaHRQcmljZUZvckJyYW5kKG1hdGNoaW5nQnJhbmRGbGlnaHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWluID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XHJcbiAgICBtYXRjaGluZ0JyYW5kRmxpZ2h0cy5mb3JFYWNoKChmbGlnaHQpID0+IHtcclxuICAgICAgaWYgKG1pbiA+IGZsaWdodD8udG90YWw/LnByaWNlKSB7XHJcbiAgICAgICAgbWluID0gZmxpZ2h0LnRvdGFsLnByaWNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBtaW47XHJcbiAgfVxyXG5cclxuICBnZXRNYXhGbGlnaHRQcmljZUZvckJyYW5kKG1hdGNoaW5nQnJhbmRGbGlnaHRzOiBGbGlnaHRJdGluZXJhcnlbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgbWF4ID0gMDtcclxuICAgIG1hdGNoaW5nQnJhbmRGbGlnaHRzLmZvckVhY2goKGZsaWdodCkgPT4ge1xyXG4gICAgICBpZiAobWF4IDwgZmxpZ2h0Py50b3RhbD8ucHJpY2UpIHtcclxuICAgICAgICBtYXggPSBmbGlnaHQudG90YWwucHJpY2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1heDtcclxuICB9XHJcblxyXG4gIGlzT3Zlck5pZ2h0KCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgb3V0d2FyZERheSA9IHRoaXMub3V0Qm91bmREYXRlLmRhdGUoKTtcclxuICAgIGNvbnN0IHJldHVybkRheSA9IHRoaXMuaW5ib3VuZERhdGUuZGF0ZSgpO1xyXG4gICAgaWYgKHJldHVybkRheSAtIG91dHdhcmREYXkgPj0gMSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG1pblRvSG91ciA9IChkdXI6IG51bWJlcik6IHN0cmluZyA9PiBgJHtNYXRoLmZsb29yKGR1ciAvIDYwKX1oICR7ZHVyICUgNjB9bWA7XHJcblxyXG4gIGFzeW5jIGFkZEV1cm9zdGFySm91cm5leXNUb0Jhc2tldChcclxuICAgIGV1cm9zdGFyUXVvdGU6IEZsaWdodEl0aW5lcmFyeVxyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGV1cm9zdGFyUXVvdGUudW5hdmFpbGFibGUpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgY29uc3QgeyBzb3VyY2VJZCwgY28yUGVySXRlbSwgY28yUGVyUGFzc2VuZ2VyLCB0b3RhbCB9ID0gZXVyb3N0YXJRdW90ZTtcclxuICAgICAgY29uc3Qgb3V0Ym91bmREYXRlOiBhbnkgPSBtb21lbnQoXHJcbiAgICAgICAgZXVyb3N0YXJRdW90ZS5vdXRib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmdcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgaW5ib3VuZERhdGU6IGFueSA9IGV1cm9zdGFyUXVvdGUuaW5ib3VuZEZsaWdodHMubGVuZ3RoXHJcbiAgICAgICAgPyBtb21lbnQoZXVyb3N0YXJRdW90ZS5pbmJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZylcclxuICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgICBjb25zdCBzY2hlbWFEZXRhaWxzID0ge1xyXG4gICAgICAgIG91dGJvdW5kRmxpZ2h0czogW1xyXG4gICAgICAgICAgLi4uZXVyb3N0YXJRdW90ZS5vdXRib3VuZEZsaWdodHMubWFwKFxyXG4gICAgICAgICAgICAoZmxpZ2h0OiBGbGlnaHRKb3VybmV5LCBzZWdtZW50SW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgICAgICAgICB0aGlzLm1ha2VTY2hlbWFGbGlnaHRzKGZsaWdodCwgJ291dGJvdW5kJywgMCwgc2VnbWVudEluZGV4KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgaW5ib3VuZEZsaWdodHM6IFtcclxuICAgICAgICAgIC4uLmV1cm9zdGFyUXVvdGUuaW5ib3VuZEZsaWdodHMubWFwKFxyXG4gICAgICAgICAgICAoZmxpZ2h0OiBGbGlnaHRKb3VybmV5LCBzZWdtZW50SW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgICAgICAgICB0aGlzLm1ha2VTY2hlbWFGbGlnaHRzKGZsaWdodCwgJ2luYm91bmQnLCAwLCBzZWdtZW50SW5kZXgpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgXSxcclxuICAgICAgICBqb3VybmV5VHlwZTogJ3NpbmdsZSdcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgYm9va2luZzogQWRkSXRlbVRvQmFza2V0TXV0YXRpb25WYXJpYWJsZXMgPSB7XHJcbiAgICAgICAgYWR1bHRzOiB0aGlzLmFkdWx0cyxcclxuICAgICAgICBiYXNrZXQ6IGludEJhc2tldC5pZCxcclxuICAgICAgICBjaGlsZHJlbjogdGhpcy5jaGlsZHJlbixcclxuICAgICAgICBjbzJQZXJJdGVtLFxyXG4gICAgICAgIGNvMlBlclBhc3NlbmdlcixcclxuICAgICAgICBjdXJyZW5jeTogdG90YWwuY3VycmVuY3kgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgICAgIGRldGFpbDogc2NoZW1hRGV0YWlscyxcclxuICAgICAgICBwcmljZTogdG90YWwucHJpY2UsXHJcbiAgICAgICAgc2VhcmNoUXVlcnk6IHRoaXMucmVzdWx0UXVlcnksXHJcbiAgICAgICAgc2VydmljZTogc291cmNlSWQudG9TdHJpbmcoKSxcclxuICAgICAgICBvdXRib3VuZERhdGU6IG91dGJvdW5kRGF0ZS5mb3JtYXQoKVxyXG4gICAgICB9O1xyXG4gICAgICBpZiAoaW5ib3VuZERhdGUpIHtcclxuICAgICAgICBib29raW5nLmluYm91bmREYXRlID0gaW5ib3VuZERhdGUuZm9ybWF0KCk7XHJcbiAgICAgICAgc2NoZW1hRGV0YWlscy5qb3VybmV5VHlwZSA9ICdyb3VuZHRyaXAnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICAgIGJvb2tpbmcsXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgICB0aGlzLnRyYXZlbGxlcnNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOyAvLyBUT0RPIHNob3VsZCB0aGlzIHRocm93IGFuIGVycm9yP1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1535
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL2NsYXNzZXMvZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsZUFBZSxFQUE2QixNQUFNLE1BQU0sQ0FBQztBQUlsRSxPQUFPLEVBS0wsUUFBUSxFQUNSLGdCQUFnQixFQUtoQixtQkFBbUIsRUFFbkIsV0FBVyxFQUdaLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUtMLG1CQUFtQixFQWNwQixNQUFNLGdCQUFnQixDQUFDO0FBT3hCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBY2pFLE9BQU8sRUFJTCxVQUFVLEVBQ1gsTUFBTSw0QkFBNEIsQ0FBQztBQUdwQyxNQUFNLGVBQWUsR0FBa0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNuRCxLQUFLLEVBQUUsRUFBRTtJQUNULFVBQVUsRUFBRSxFQUFFO0lBQ2QsV0FBVyxFQUFFLEVBQUU7SUFDZixPQUFPLEVBQUUsRUFBRTtJQUNYLFFBQVEsRUFBRSxFQUFFO0lBQ1osWUFBWSxFQUFFLEVBQUU7SUFDaEIsZUFBZSxFQUFFLEVBQUU7SUFDbkIscUJBQXFCLEVBQUUsRUFBRTtJQUN6QixjQUFjLEVBQUUsRUFBRTtJQUNsQixvQkFBb0IsRUFBRSxFQUFFO0lBQ3hCLE9BQU8sRUFBRSxFQUFFO0lBQ1gsU0FBUyxFQUFFLEVBQUU7SUFDYixLQUFLLEVBQUU7UUFDTCxHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtRQUM1QixHQUFHLEVBQUUsTUFBTSxDQUFD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QUNuRSxNQUFNLG9CQUFvQixHQUF3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0UsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFO2dCQUNuQixXQUFXLEVBQUUsV0FBVyxDQUFDLFFBQVE7Z0JBQ2pDLFVBQVUsRUFBRSxvQkFBb0I7YUFDakMsQ0FBQTtZQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMzRDtJQUNILENBQUM7O0FBdi9EZSwrQ0FBc0IsR0FBRyxpQkFBaUIsQ0FBQztBQUMzQyxnREFBdUIsR0FBRyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQmFzZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuL2Jhc2UtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IEJhc2VTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4vaGVscGVycyc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFZhbHVlRGlzcGxheSB9IGZyb20gJy4uL2ludGVyZmFjZXMvdmFsdWUtZGlzcGxheSc7XHJcbmltcG9ydCB7IEZsaWdodEZpbHRlcnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2ZsaWdodC1maWx0ZXJzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFNlbGVjdEZpbHRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VsZWN0LWZpbHRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIEFkZEl0ZW1Ub0Jhc2tldE11dGF0aW9uVmFyaWFibGVzLFxyXG4gIEJhc2tldEl0ZW0sXHJcbiAgQ3VycmVuY3lDb2RlLFxyXG4gIERlc3RpbmF0aW9uRW50cnksXHJcbiAgRmFyZVR5cGUsXHJcbiAgRmxpZ2h0Q2FiaW5DbGFzcyxcclxuICBGbGlnaHRGYXJlVG90YWwsXHJcbiAgRmxpZ2h0SXRpbmVyYXJ5LFxyXG4gIEZsaWdodEpvdXJuZXksXHJcbiAgRmxpZ2h0UGFzc2VuZ2VyT2JqZWN0LFxyXG4gIEZsaWdodFBhc3NlbmdlclR5cGUsXHJcbiAgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VydmljZVR5cGUsXHJcbiAgU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzLFxyXG4gIEZlRmxpZ2h0U2VhcmNoUmVzdWx0c1xyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEV1cm9zdGFyUXVvdGVSZXN1bHQsXHJcbiAgTmdiRGF0ZVN0cnVjdCxcclxuICBPQlRBaXJwb3J0RGV0YWlscyxcclxuICBPQlRBaXJsaW5lc0RldGFpbHMsXHJcbiAgRmxpZ2h0RGlyZWN0aW9uRW51bSxcclxuICBHcm91cGVkRmxpZ2h0cyxcclxuICBGbGlnaHRJdGluZXJhcnlXaXRoRXh0ZW5zaW9ucyxcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgRXVyb3N0YXJHcm91cGVkUXVvdGVSZXN1bHQsXHJcbiAgRXVyb3N0YXJSZXN1bHRzLFxyXG4gIEV1cm9zdGFySXRlbSxcclxuICBFdXJvc3RhckZhcmUsXHJcbiAgRXVyb3N0YXJDbGFzc0VudW0sXHJcbiAgRXVyb3N0YXJRdW90ZVJlc3VsdEFycmF5LFxyXG4gIE1pbk1heCxcclxuICBGbGlnaHRBbGxRdW90ZVJlc3VsdCxcclxuICBGbGlnaHRRdW90ZVJlc3VsdEFycmF5LFxyXG4gIFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgRnVsbFVzZXJEZXRhaWxzLFxyXG4gIFVzZXJTZXJ2aWNlSW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lzZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7IElDaGVhcGVzdFByaWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVhcGVzdC1wcmljZSc7XHJcbmltcG9ydCB7IEV1cm9zdGFyU2VhcmNoVHlwZSB9IGZyb20gJy4vZXVyb3N0YXItc2VhcmNoLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IElNdWx0aURlc3RpbmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9mbGlnaHQtbXVsdGktZGVzdGluYXRpb24uaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICBJbnRlcm5hbEJhc2tldEludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWVudGVycHJpc2UtYmFza2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VFdXJvc3RhclF1b3RlRmV0Y2hlcixcclxuICBFdXJvc3RhclF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9ldXJvc3Rhci1xdW90ZS5mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBFdXJvc3RhckVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgRXVyb3N0YXJUZW1wUGFyYW1zXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQge1xyXG4gIEFsbG93ZWRDbGFzc2VzLFxyXG4gIEZsaWdodE9wZXJhdG9yLFxyXG4gIEZsaWdodFNvcnRUeXBlcyxcclxuICBUaW1lV2luZG93XHJcbn0gZnJvbSAnLi9mbGlnaHQtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBJRXVyb3N0YXJTZWFyY2hBcmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ldXJvc3Rhci1zZWFyY2gtYXJnLmludGVyZmFjZSc7XHJcblxyXG5jb25zdCBERUZBVUxUX0ZJTFRFUlM6IEZsaWdodEZpbHRlcnMgPSBPYmplY3QuZnJlZXplKHtcclxuICBzdG9wczoge30sXHJcbiAgdG90YWxTdG9wczoge30sXHJcbiAgbXVzdEluY2x1ZGU6IHt9LFxyXG4gIGNsYXNzZXM6IHt9LFxyXG4gIGFpcmxpbmVzOiB7fSxcclxuICB0cmF2ZWxQb2xpY3k6IHt9LFxyXG4gIGRlcGF0dXJlQWlycG9ydDoge30sXHJcbiAgZGVwYXR1cmVSZXR1cm5BaXJwb3J0OiB7fSxcclxuICBhcnJpdmFsQWlycG9ydDoge30sXHJcbiAgYXJyaXZhbFJldHVybkFpcnBvcnQ6IHt9LFxyXG4gIGJhZ2dhZ2U6IHt9LFxyXG4gIGZhcmVUeXBlczoge30sXHJcbiAgcHJpY2U6IHtcclxuICAgIG1pbjogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXHJcbiAgICBtYXg6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXHJcbiAgfSxcclxuICBkdXJhdGlvbjoge1xyXG4gICAgbWluOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcclxuICAgIG1heDogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcclxuICB9LFxyXG4gIHJldHVybkR1cmF0aW9uOiB7XHJcbiAgICBtaW46IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxyXG4gICAgbWF4OiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUlxyXG4gIH0sXHJcbiAgZGVwYXJ0dXJlVGltZToge1xyXG4gICAgbWluOiAwLFxyXG4gICAgbWF4OiAyMzU5XHJcbiAgfSxcclxuICBhcnJpdmFsVGltZToge1xyXG4gICAgbWluOiAwLFxyXG4gICAgbWF4OiAyMzU5XHJcbiAgfSxcclxuICByZXR1cm5EZXBhcnR1cmVUaW1lOiB7XHJcbiAgICBtaW46IDAsXHJcbiAgICBtYXg6IDIzNTlcclxuICB9LFxyXG4gIHJldHVybkFycml2YWxUaW1lOiB7XHJcbiAgICBtaW46IDAsXHJcbiAgICBtYXg6IDIzNTlcclxuICB9LFxyXG5cclxuICBmbGlnaHROdW1iZXI6ICcnXHJcbn0pIGFzIEZsaWdodEZpbHRlcnM7XHJcblxyXG5leHBvcnQgdHlwZSBFdXJvc3RhclN0YXRpb24gPSB7XHJcbiAgZ2F0ZXdheTogc3RyaW5nO1xyXG4gIGRlc3RpbmF0aW9uOiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZW51bSBTb3J0VHlwZXNFdXJvc3RhciB7XHJcbiAgQ2hlYXBlc3RGaXJzdCA9ICdDJyxcclxuICBFYXJsaWVzdEZpcnN0ID0gJ0UnLFxyXG4gIExhdGVzdEZpcnN0ID0gJ0wnXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFNvcnRNZXRob2Qge1xyXG4gIHNvcnRCeVByaWNlID0gJ3NvcnRCeVByaWNlJyxcclxuICBzb3J0QnlEYXRlID0gJ3NvcnRCeURhdGUnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU29ydFR5cGVFdXJvc3RhciB7XHJcbiAgLyoqIFRpdGxlIGRpc3BsYXllZCBvbiBkcm9wZG93biAqL1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgLyoqIE1ldGhvZCBuYW1lIHVzZWQgYnkgY29tcG9uZW50IHRvIHNvcnQgcmVzdWx0cyAqL1xyXG4gIG1ldGhvZDogU29ydE1ldGhvZDtcclxuICAvKiogSWNvbiBkaXNwbGF5ZWQgb24gZHJvcCBkb3duICovXHJcbiAgaWNvbjogc3RyaW5nO1xyXG4gIC8qKiBTb3J0aW5nIGRpcmVjdGlvbiB0cnVlIGZvciBhc2MsIGZhbHNlIGZvciBkc2MgKi9cclxuICBkaXI6IGJvb2xlYW47XHJcbiAgLy8gdGhpcyBpcyB3aGF0IHdlIHdpbGwgdXNlIHRvIHNvcnRcclxuICBjb2RlOiBTb3J0VHlwZXNFdXJvc3RhcjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRXVyb3N0YXJHcm91cHMgPSAnU3RhbmRhcmQnIHwgJ1N0YW5kYXJkUHJlbWllcicgfCAnQnVzaW5lc3NQcmVtaWVyJztcclxuXHJcbmludGVyZmFjZSBFdXJvc3RhclNlc3Npb25UeXBlIHtcclxuICByZXN1bHRzOiBFdXJvc3RhclF1b3RlUmVzdWx0QXJyYXk7XHJcbiAgZ3JvdXBEYXRhOiB7IFtrZXk6IG51bWJlcl06IG51bWJlcltdIH07XHJcbiAgZ3JvdXBlZDogR3JvdXBlZEZsaWdodHM7XHJcbiAgcXVlcnk6IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoPFNFX1EgZXh0ZW5kcyBFdXJvc3RhclF1b3RlRmV0Y2hlclR5cGU+XHJcbiAgZXh0ZW5kcyBCYXNlRW50ZXJwcmlzZVNlYXJjaDxcclxuICAgIEV1cm9zdGFyVGVtcFBhcmFtcyxcclxuICAgIEV1cm9zdGFyUXVvdGVSZXN1bHQsXHJcbiAgICBFdXJvc3RhclF1b3RlUmVzdWx0QXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBFdXJvc3RhckVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2Vcclxue1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUEFSQU1TID0gJ3NlYXJjaF9ldXJvc3Rhcic7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTID0gJ3Jlc3VsdHNfZXVyb3N0YXInO1xyXG5cclxuICBwdWJsaWMgdHlwZTogU2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5FdXJvc3RhcjtcclxuXHJcbiAgYXZhbGlhYmxlQ2xhc3NlczogQmVoYXZpb3JTdWJqZWN0PEFsbG93ZWRDbGFzc2VzPiA9XHJcbiAgICBuZXcgQmVoYXZpb3JTdWJqZWN0PEFsbG93ZWRDbGFzc2VzPihbXSk7XHJcbiAgdGltZUNyaXRlcmlhT3B0aW9uczogQmVoYXZpb3JTdWJqZWN0PFRpbWVXaW5kb3dbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgVGltZVdpbmRvd1tdXHJcbiAgPihbXSk7XHJcbiAgZmxpZ2h0T3BlcmF0b3JzOiBCZWhhdmlvclN1YmplY3Q8RmxpZ2h0T3BlcmF0b3JbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgRmxpZ2h0T3BlcmF0b3JbXVxyXG4gID4oW10pO1xyXG5cclxuICBwcml2YXRlIF9uZWdvdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfbmVhcmJ5X2FpcnBvcnRzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3RpbWVBcnJheTogVmFsdWVEaXNwbGF5W107XHJcbiAgcHJpdmF0ZSBfc29ydEFycmF5OiBTb3J0VHlwZUV1cm9zdGFyW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnUHJpY2UnLFxyXG4gICAgICBtZXRob2Q6IFNvcnRNZXRob2Quc29ydEJ5UHJpY2UsXHJcbiAgICAgIGljb246ICdpY28tZG9sbGFyJyxcclxuICAgICAgZGlyOiB0cnVlLFxyXG4gICAgICBjb2RlOiBTb3J0VHlwZXNFdXJvc3Rhci5DaGVhcGVzdEZpcnN0XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ1RpbWUnLFxyXG4gICAgICBtZXRob2Q6IFNvcnRNZXRob2Quc29ydEJ5RGF0ZSxcclxuICAgICAgaWNvbjogJ2ljby1jYWxlbmRhcicsXHJcbiAgICAgIGRpcjogdHJ1ZSxcclxuICAgICAgY29kZTogU29ydFR5cGVzRXVyb3N0YXIuRWFybGllc3RGaXJzdFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdUaW1lIChEZXNjZW5kaW5nKScsXHJcbiAgICAgIG1ldGhvZDogU29ydE1ldGhvZC5zb3J0QnlEYXRlLFxyXG4gICAgICBpY29uOiAnaWNvLWNhbGVuZGFyJyxcclxuICAgICAgZGlyOiB0cnVlLFxyXG4gICAgICBjb2RlOiBTb3J0VHlwZXNFdXJvc3Rhci5MYXRlc3RGaXJzdFxyXG4gICAgfVxyXG4gIF07XHJcblxyXG4gIHByaXZhdGUgX3NvcnRBcnJheUx1OiBTb3J0VHlwZUV1cm9zdGFyW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnUHJpY2UnLFxyXG4gICAgICBtZXRob2Q6IFNvcnRNZXRob2Quc29ydEJ5UHJpY2UsXHJcbiAgICAgIGljb246ICdpY28tZG9sbGFyJyxcclxuICAgICAgZGlyOiB0cnVlLFxyXG4gICAgICBjb2RlOiBTb3J0VHlwZXNFdXJvc3Rhci5DaGVhcGVzdEZpcnN0XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ1RpbWUnLFxyXG4gICAgICBtZXRob2Q6IFNvcnRNZXRob2Quc29ydEJ5RGF0ZSxcclxuICAgICAgaWNvbjogJ2ljby1jYWxlbmRhcicsXHJcbiAgICAgIGRpcjogdHJ1ZSxcclxuICAgICAgY29kZTogU29ydFR5cGVzRXVyb3N0YXIuRWFybGllc3RGaXJzdFxyXG4gICAgfVxyXG4gIF07XHJcblxyXG4gIHByaXZhdGUgX2ZhcmVUeXBlQXJyYXk6IFZhbHVlRGlzcGxheVtdID0gW1xyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuRmxleGlibGUsIGRpc3BsYXk6ICdGbGV4aWJsZScgfSxcclxuICAgIHsgdmFsdWU6IEZhcmVUeXBlLkxlaXN1cmUsIGRpc3BsYXk6ICdMZWlzdXJlJyB9LFxyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuTG93ZXN0LCBkaXNwbGF5OiAnTG93ZXN0JyB9LFxyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuTmVnb3RpYXRlZCwgZGlzcGxheTogJ05lZ290aWF0ZWQnIH0sXHJcbiAgICB7IHZhbHVlOiBGYXJlVHlwZS5Ob25OZWdvdGlhdGVkLCBkaXNwbGF5OiAnTm9uLU5lZ290aWF0ZWQnIH0sXHJcbiAgICB7IHZhbHVlOiBGYXJlVHlwZS5SZXF1ZXN0RmFyZVJ1bGVzLCBkaXNwbGF5OiAnUmVxdWVzdCBGYXJlIFJ1bGVzJyB9LFxyXG4gICAgeyB2YWx1ZTogRmFyZVR5cGUuU2VsZWN0QW5kUHJvLCBkaXNwbGF5OiAnU2VsZWN0ICYgUHJvJyB9XHJcbiAgXTtcclxuXHJcbiAgcHVibGljIG1pbmltdW1PdXRCb3VuZERhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtaW5pbXVtSW5Cb3VuZERhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBzZWFyY2hUeXBlczogVmFsdWVEaXNwbGF5W10gPSBbXHJcbiAgICB7IHZhbHVlOiBFdXJvc3RhclNlYXJjaFR5cGUucmV0dXJuLCBkaXNwbGF5OiAnUmV0dXJuJyB9LFxyXG4gICAgeyB2YWx1ZTogRXVyb3N0YXJTZWFyY2hUeXBlLm9uZVdheSwgZGlzcGxheTogJ09uZS13YXknIH1cclxuICBdO1xyXG5cclxuICBwcml2YXRlIF9vdXREYXRlOiBOZ2JEYXRlU3RydWN0O1xyXG4gIHByaXZhdGUgX291dFRpbWU6IHN0cmluZztcclxuICBwcml2YXRlIF9pbkRhdGU6IE5nYkRhdGVTdHJ1Y3Q7XHJcbiAgcHJpdmF0ZSBfaW5UaW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfZGVzdGluYXRpb25BaXJwb3J0OiBhbnk7XHJcbiAgcHJpdmF0ZSBfb3JpZ2luQWlycG9ydDogYW55O1xyXG4gIHByaXZhdGUgX3Bhc3NlbmdlcnM6IGFueTtcclxuICBwcml2YXRlIGdyb3VwZWRPYmplY3Q6IEZsaWdodEl0aW5lcmFyeVdpdGhFeHRlbnNpb25zW107XHJcbiAgcHJvdGVjdGVkIGZsaWdodHNUb0dyb3VwOiB7IFtrZXk6IG51bWJlcl06IG51bWJlcltdIH0gPSB7fTtcclxuICBwcm90ZWN0ZWQgcmVzdWx0UXVlcnk6IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzO1xyXG4gIHByb3RlY3RlZCBncm91cGVkOiBHcm91cGVkRmxpZ2h0cyA9IG51bGw7XHJcbiAgdHJhdmVsbGVyczogVHJhdmVsbGVyW10gPSBudWxsO1xyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG4gIHByb3RlY3RlZCBtdWx0aVJlc3VsdHNTZXNzaW9uTmFtZSA9XHJcbiAgICBFdXJvc3RhckVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcblxyXG4gIHNlbGVjdGVkR3JvdXBGbGlnaHQ6IEZsaWdodEl0aW5lcmFyeVdpdGhFeHRlbnNpb25zO1xyXG4gIHByaXZhdGUgX2Rpc3BsYXlBZGRIb3RlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZpbHRlcnM6IEJlaGF2aW9yU3ViamVjdDxGbGlnaHRGaWx0ZXJzPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoXHJcbiAgICBERUZBVUxUX0ZJTFRFUlNcclxuICApO1xyXG5cclxuICBwdWJsaWMgZ2V0IGRpc3BsYXlBZGRIb3RlbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5QWRkSG90ZWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRpc3BsYXlBZGRIb3RlbChuZXdWYWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Rpc3BsYXlBZGRIb3RlbCA9IG5ld1ZhbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VsZWN0ZWRHcm91cEV1cm9zdGFyOiB7XHJcbiAgICBpdGVtOiBFdXJvc3Rhckl0ZW07XHJcbiAgICBkaXJlY3Rpb246IEZsaWdodERpcmVjdGlvbkVudW07XHJcbiAgfSA9IHtcclxuICAgIGl0ZW06IG51bGwsXHJcbiAgICBkaXJlY3Rpb246IG51bGxcclxuICB9O1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRFdXJvc3RhckZhcmU6IHtcclxuICAgIGl0ZW06IEV1cm9zdGFyRmFyZTtcclxuICAgIGRpcmVjdGlvbjogRmxpZ2h0RGlyZWN0aW9uRW51bTtcclxuICB9ID0ge1xyXG4gICAgaXRlbTogbnVsbCxcclxuICAgIGRpcmVjdGlvbjogbnVsbFxyXG4gIH07XHJcblxyXG4gIGdldCBzZWxlY3RlZEZhcmVDbGFzcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFdXJvc3RhckZhcmU/Lml0ZW0/LmNsYXNzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0aW1lQXJyYXkoKSB7XHJcbiAgICB0aGlzLl90aW1lQXJyYXkgPVxyXG4gICAgICB0aGlzLl90aW1lQXJyYXkgfHxcclxuICAgICAgQXJyYXkoOTYpXHJcbiAgICAgICAgLmZpbGwoMClcclxuICAgICAgICAubWFwKChfLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2YWx1ZTpcclxuICAgICAgICAgICAgICBNYXRoLmZsb29yKGluZGV4IC8gNClcclxuICAgICAgICAgICAgICAgIC50b1N0cmluZygpXHJcbiAgICAgICAgICAgICAgICAucGFkU3RhcnQoMiwgJzAnKSArXHJcbiAgICAgICAgICAgICAgJzonICtcclxuICAgICAgICAgICAgICAoKGluZGV4ICUgNCkgKiAxNSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxyXG4gICAgICAgICAgICBkaXNwbGF5OlxyXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoaW5kZXggLyA0KVxyXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgIC5wYWRTdGFydCgyLCAnMCcpICtcclxuICAgICAgICAgICAgICAnOicgK1xyXG4gICAgICAgICAgICAgICgoaW5kZXggJSA0KSAqIDE1KS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5fdGltZUFycmF5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBwcmVmZXJyZWRDYXJyaWVycygpOiBPQlRBaXJsaW5lc0RldGFpbHNbXSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnByZWZlcnJlZENhcnJpZXJzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBwcmVmZXJyZWRDYXJyaWVycyh2YWx1ZTogT0JUQWlybGluZXNEZXRhaWxzW10pIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5wcmVmZXJyZWRDYXJyaWVycyA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBvcGVyYXRvcjEoKTogT0JUQWlybGluZXNEZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnNbMF07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9wZXJhdG9yMSh2YWx1ZTogT0JUQWlybGluZXNEZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnNbMF0gPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBvcGVyYXRvcjIoKTogT0JUQWlybGluZXNEZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnNbMV07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9wZXJhdG9yMih2YWx1ZTogT0JUQWlybGluZXNEZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnNbMV0gPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBvcGVyYXRvcjMoKTogT0JUQWlybGluZXNEZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnNbMl07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9wZXJhdG9yMyh2YWx1ZTogT0JUQWlybGluZXNEZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnNbMl0gPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBvcGVyYXRvcjQoKTogT0JUQWlybGluZXNEZXRhaWxzIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnNbM107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9wZXJhdG9yNCh2YWx1ZTogT0JUQWlybGluZXNEZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnNbM10gPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21pbkRhdGU6IE5nYkRhdGVTdHJ1Y3Q7XHJcbiAgcHVibGljIGdldCBtaW5EYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgdGhpcy5fbWluRGF0ZSA9IHRoaXMuX21pbkRhdGUgfHwgdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG1vbWVudCgpKTtcclxuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhZHVsdHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBhZHVsdHModmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmFkdWx0cyA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZVRyYXZlbGxlcnMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2hpbGRyZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGNoaWxkcmVuKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbiA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZVRyYXZlbGxlcnMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGVwYXJ0TG9jYXRpb24oKTogc3RyaW5nIHwgT0JUQWlycG9ydERldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5kZXBhcnRMb2NhdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZGVwYXJ0TG9jYXRpb24odmFsdWU6IHN0cmluZyB8IE9CVEFpcnBvcnREZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuZGVwYXJ0TG9jYXRpb24gPSB2YWx1ZTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuX29yaWdpbkFpcnBvcnQgPSAnJztcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUuZ2F0ZXdheSkge1xyXG4gICAgICB0aGlzLl9vcmlnaW5BaXJwb3J0ID0gdmFsdWUuZ2F0ZXdheTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX29yaWdpbkFpcnBvcnQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBxdWVyeU9yaWdpbkFpcG9ydCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbkFpcnBvcnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHF1ZXJ5RGVzdGluYXRpb25BaXBvcnQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXN0aW5hdGlvbkFpcnBvcnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRlcGFydERhdGUoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0RGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZGVwYXJ0RGF0ZSh2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5fb3V0RGF0ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5vdXRCb3VuZERhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQoXHJcbiAgICAgIHRoaXMuX291dERhdGUsXHJcbiAgICAgIHRoaXMuX291dFRpbWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRlcGFydFRpbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vdXRUaW1lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBkZXBhcnRUaW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX291dFRpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMub3V0Qm91bmREYXRlID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KFxyXG4gICAgICB0aGlzLl9vdXREYXRlLFxyXG4gICAgICB0aGlzLl9vdXRUaW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBvdXRCb3VuZERhdGUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb3V0Qm91bmREYXRlKHZhbHVlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICB2YWx1ZSA9IG1vbWVudCh2YWx1ZSk7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlID0gdmFsdWUuaXNWYWxpZCgpID8gdmFsdWUgOiBudWxsO1xyXG4gICAgdGhpcy5taW5pbXVtSW5Cb3VuZERhdGUgPSB7XHJcbiAgICAgIHllYXI6IHZhbHVlLnllYXIoKSxcclxuICAgICAgbW9udGg6IHZhbHVlLm1vbnRoKCkgKyAxLFxyXG4gICAgICBkYXk6IHZhbHVlLmRhdGUoKVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5vdXRCb3VuZERhdGUgJiZcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlICYmXHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5vdXRCb3VuZERhdGUuaXNBZnRlcih0aGlzLnRlbXBQYXJhbXMuaW5ib3VuZERhdGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5pbmJvdW5kRGF0ZSA9IG1vbWVudCh0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlKS5hZGQoMSwgJ2RheScpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fb3V0RGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZSh2YWx1ZSk7XHJcbiAgICB0aGlzLl9vdXRUaW1lID0gdGhpcy5oZWxwZXJzLmZvcm1hdFRpbWVDb2xvbih2YWx1ZSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHJldHVybkRhdGUoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5EYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCByZXR1cm5EYXRlKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9pbkRhdGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuaW5ib3VuZERhdGUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQodGhpcy5faW5EYXRlLCB0aGlzLl9pblRpbWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhcnJpdmVUaW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5UaW1lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBhcnJpdmVUaW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2luVGltZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pbmJvdW5kRGF0ZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudCh0aGlzLl9pbkRhdGUsIHRoaXMuX2luVGltZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGluYm91bmREYXRlKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5pbmJvdW5kRGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaW5ib3VuZERhdGUodmFsdWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHZhbHVlID0gbW9tZW50KHZhbHVlKTtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5pbmJvdW5kRGF0ZSA9IHZhbHVlLmlzVmFsaWQoKSA/IHZhbHVlIDogbnVsbDtcclxuICAgIHRoaXMuX2luRGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZSh2YWx1ZSk7XHJcbiAgICB0aGlzLl9pblRpbWUgPSB0aGlzLmhlbHBlcnMuZm9ybWF0VGltZUNvbG9uKHZhbHVlKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYXJyaXZlTG9jYXRpb24oKTogc3RyaW5nIHwgT0JUQWlycG9ydERldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5hcnJpdmVMb2NhdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgYXJyaXZlTG9jYXRpb24odmFsdWU6IHN0cmluZyB8IE9CVEFpcnBvcnREZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZlTG9jYXRpb24gPSB2YWx1ZTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uQWlycG9ydCA9ICcnO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS5nYXRld2F5KSB7XHJcbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uQWlycG9ydCA9IHZhbHVlLmdhdGV3YXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbkFpcnBvcnQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhYmluQ2xhc3MoKTogRmxpZ2h0Q2FiaW5DbGFzcyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jYWJpbkNsYXNzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNhYmluQ2xhc3ModmFsdWU6IEZsaWdodENhYmluQ2xhc3MgfCBudWxsKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2FiaW5DbGFzcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJldHVybkNhYmluQ2xhc3MoKTogRmxpZ2h0Q2FiaW5DbGFzcyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5yZXR1cm5DYWJpbkNsYXNzO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJldHVybkNhYmluQ2xhc3ModmFsdWU6IEZsaWdodENhYmluQ2xhc3MgfCBudWxsKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucmV0dXJuQ2FiaW5DbGFzcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNob3NlblNlYXJjaFR5cGUoKTogRXVyb3N0YXJTZWFyY2hUeXBlIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuY2hvc2VuU2VhcmNoVHlwZTtcclxuICB9XHJcblxyXG4gIHNldCBjaG9zZW5TZWFyY2hUeXBlKHR5cGU6IEV1cm9zdGFyU2VhcmNoVHlwZSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNob3NlblNlYXJjaFR5cGUgPSB0eXBlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzUmV0dXJuKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hUeXBlID09PSBFdXJvc3RhclNlYXJjaFR5cGUucmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG91dFRpbWVDcml0ZXJpYSgpOiBUaW1lV2luZG93IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMub3V0VGltZUNyaXRlcmlhO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dFRpbWVDcml0ZXJpYSh2YWx1ZTogVGltZVdpbmRvdykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm91dFRpbWVDcml0ZXJpYSA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGluVGltZUNyaXRlcmlhKCk6IFRpbWVXaW5kb3cge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5pblRpbWVDcml0ZXJpYTtcclxuICB9XHJcblxyXG4gIHNldCBpblRpbWVDcml0ZXJpYSh2YWx1ZTogVGltZVdpbmRvdykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmluVGltZUNyaXRlcmlhID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG4gIGdldCBtYXhDb25uZWN0aW9ucygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5tYXhDb25uZWN0aW9ucztcclxuICB9XHJcblxyXG4gIHNldCBtYXhDb25uZWN0aW9ucyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubWF4Q29ubmVjdGlvbnMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX211bHRpRGVzdGluYXRpb246IERlc3RpbmF0aW9uRW50cnlbXSA9IFtdO1xyXG4gIGdldCBtdWx0aURlc3RpbmF0aW9uKCk6IElNdWx0aURlc3RpbmF0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5tdWx0aURlc3RpbmF0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IG11bHRpRGVzdGluYXRpb24odmFsdWVBcnJheTogSU11bHRpRGVzdGluYXRpb25bXSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm11bHRpRGVzdGluYXRpb24gPSB2YWx1ZUFycmF5O1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgc2V0TXVsdGlEZXN0aW5hdGlvblF1ZXJ5KG11bHRpRGVzdGluYXRpb246IElNdWx0aURlc3RpbmF0aW9uW10pIHtcclxuICAgIGNvbnN0IG5ld011bHRpRGVzdGluYXRpb24gPSB0aGlzLmhlbHBlcnMuY2xvbmUobXVsdGlEZXN0aW5hdGlvbik7XHJcbiAgICByZXR1cm4gbmV3TXVsdGlEZXN0aW5hdGlvbi5yZWR1Y2UoXHJcbiAgICAgIChkZXN0aW5hdGlvbkFycmF5OiBEZXN0aW5hdGlvbkVudHJ5W10sIGl0ZW06IElNdWx0aURlc3RpbmF0aW9uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25PYmplY3QgPSB7fSBhcyBEZXN0aW5hdGlvbkVudHJ5O1xyXG4gICAgICAgIGRlc3RpbmF0aW9uT2JqZWN0Lm9yaWcgPSBpdGVtLm9yaWcuZ2F0ZXdheTtcclxuICAgICAgICBkZXN0aW5hdGlvbk9iamVjdC5kZXN0ID0gaXRlbS5kZXN0LmdhdGV3YXk7XHJcbiAgICAgICAgZGVzdGluYXRpb25PYmplY3QuZGF0ZSA9IHRoaXMuaGVscGVycy5mb3JtYXRJc29EYXRlKGl0ZW0uZGF0ZSk7XHJcbiAgICAgICAgZGVzdGluYXRpb25BcnJheS5wdXNoKGRlc3RpbmF0aW9uT2JqZWN0KTtcclxuICAgICAgICByZXR1cm4gZGVzdGluYXRpb25BcnJheTtcclxuICAgICAgfSxcclxuICAgICAgW10gYXMgRGVzdGluYXRpb25FbnRyeVtdXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IG9ubHlcclxuICBnZXQgc29ydERyb3Bkb3duVmFsdWVzKCk6IFNvcnRUeXBlRXVyb3N0YXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc29ydEFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNvcnREcm9wZG93blZhbHVlc0x1KCk6IFNvcnRUeXBlRXVyb3N0YXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc29ydEFycmF5THU7XHJcbiAgfVxyXG5cclxuICBnZXQgZmFyZVR5cGVzVmFsdWVzKCk6IFZhbHVlRGlzcGxheVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9mYXJlVHlwZUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZhcmVUeXBlKCk6IEZhcmVUeXBlIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuZmFyZVR5cGU7XHJcbiAgfVxyXG5cclxuICBzZXQgZmFyZVR5cGUodmFsdWU6IEZhcmVUeXBlKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuZmFyZVR5cGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBuZWdvdGlhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgbmVnb3RpYXRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fbmVnb3RpYXRlZCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGluY2x1ZGVOZWFyYnlBaXJwb3J0cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuaW5jbHVkZU5lYXJieUFpcnBvcnRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGluY2x1ZGVOZWFyYnlBaXJwb3J0cyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmluY2x1ZGVOZWFyYnlBaXJwb3J0cyA9IHZhbHVlO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZXVyb3N0YXJGZXRjaGVyOiBCYXNlRXVyb3N0YXJRdW90ZUZldGNoZXI8U0VfUT4sXHJcbiAgICBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICB1c2VyU2VydmljZTogVXNlclNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcml2YXRlIGJhc2tldFNlcnZpY2U6IEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgc3RvcmFnZVNlcnZpY2U6IEJhc2VTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2VcclxuICApIHtcclxuICAgIHN1cGVyKHN0b3JhZ2VTZXJ2aWNlLCBoZWxwZXJzKTtcclxuXHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IEV1cm9zdGFyVGVtcFBhcmFtcztcclxuICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiBFdXJvc3RhclRlbXBQYXJhbXM7XHJcbiAgICB9ID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEV1cm9zdGFyRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgdGVtcFBhcmFtczoge30gYXMgRXVyb3N0YXJUZW1wUGFyYW1zLFxyXG4gICAgICBvcmlnaW5hbFVzZXJTZWFyY2g6IHt9IGFzIEV1cm9zdGFyVGVtcFBhcmFtc1xyXG4gICAgfTtcclxuICAgIC8vIGRhdGEudGVtcFBhcmFtcy5hZHVsdHMgPSAxO1xyXG4gICAgLy8gZGF0YS50ZW1wUGFyYW1zLmNhYmluQ2xhc3MgPSBbRmxpZ2h0Q2FiaW5DbGFzcy5FY29ub215XTtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoU2VydmljZS5tYWtlRXVyb3N0YXJRdWVyeShkYXRhLnRlbXBQYXJhbXMpO1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHF1ZXJ5KTtcclxuICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IGRhdGEub3JpZ2luYWxVc2VyU2VhcmNoO1xyXG4gICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkQWRkVHJhdmVsbGVyU3Vic2NyaXB0aW9uKCkpIHtcclxuICAgICAgc2VhcmNoU2VydmljZS50cmF2ZWxsZXJJbmZvcm1hdGlvbi5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgICAgICAgY29uc3Qgc3BsaXRUcmF2ZWxsZXJzID0gdGhpcy5oZWxwZXJzLnNlbGVjdGVkVHJhdmVsbGVycyhcclxuICAgICAgICAgICAgdHJhdmVsbGVycyxcclxuICAgICAgICAgICAgU2VydmljZVR5cGUuRXVyb3N0YXJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzID0gc3BsaXRUcmF2ZWxsZXJzLmFkdWx0cy5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPSBzcGxpdFRyYXZlbGxlcnMuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgICAgICAgLy8gdGhpcy50ZW1wUGFyYW1zLmluZmFudHMgPSBzcGxpdFRyYXZlbGxlcnMuaW5mYW50cy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJzKCk7XHJcbiAgICAgICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHVzZXJTZXJ2aWNlLmNoYW5nZVVzZXIuc3Vic2NyaWJlKCh1c2VyOiBGdWxsVXNlckRldGFpbHMpID0+IHtcclxuICAgICAgdGhpcy50aW1lQ3JpdGVyaWFPcHRpb25zLm5leHQoW1xyXG4gICAgICAgIFRpbWVXaW5kb3cuQW55dGltZSxcclxuICAgICAgICBUaW1lV2luZG93LkFycml2ZSxcclxuICAgICAgICBUaW1lV2luZG93LkRlcGFydFxyXG4gICAgICBdKTsgLy8gVE9ETyB1cGRhdGUgd2l0aCBhbnkgVUZzXHJcbiAgICAgIHRoaXMudXBkYXRlQXZhbGlhYmxlQ2xhc3NlcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJzKCk7XHJcbiAgICBjb25zdCByZXN1bHRzOiBFdXJvc3RhclNlc3Npb25UeXBlID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIHRoaXMucmVzdWx0c1Nlc3Npb25OYW1lXHJcbiAgICApIHx8IHtcclxuICAgICAgcmVzdWx0czogW10sXHJcbiAgICAgIGdyb3VwRGF0YToge30sXHJcbiAgICAgIGdyb3VwZWQ6IFtdLFxyXG4gICAgICBxdWVyeToge30gYXMgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXNcclxuICAgIH07XHJcbiAgICB0aGlzLmZ1bGxSZXN1bHRzID0gdGhpcy5oZWxwZXJzLmNsb25lKHJlc3VsdHMucmVzdWx0cyk7XHJcbiAgICB0aGlzLmZsaWdodHNUb0dyb3VwID0gcmVzdWx0cy5ncm91cERhdGEgfHwge307XHJcbiAgICB0aGlzLnJlc3VsdFF1ZXJ5ID0gcmVzdWx0cy5xdWVyeTtcclxuICAgIGNvbnN0IGlzRmxpZ2h0c0dyb3VwZWQgPSB0aGlzLnNlYXJjaFNlcnZpY2UuaXNGbGlnaHRzR3JvdXBlZCgpO1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoKHJlc3VsdHMucmVzdWx0cyB8fCBbXSkgYXMgRXVyb3N0YXJRdW90ZVJlc3VsdEFycmF5KTtcclxuXHJcbiAgICBjb25zdCByZXN1bHRzQ2xvbmU6IGFueSA9IHRoaXMuaGVscGVycy5jbG9uZShyZXN1bHRzLnJlc3VsdHMpO1xyXG4gICAgLy8gZ2V0IGFyb3VuZCB0aGUgYW5ub3lpbmcgdHlwZSByZXN0cmljdGlvbnMgLSBJIEtOT1cgSk9VUk5FWVMgSVMgVEhFUkUgSSBDQU4gU0VFIElUIFNUT1AgVEVMTElORyBNRSBJVCBJU04nVCBUWVBFU0NSSVBUIVxyXG4gICAgaWYgKHJlc3VsdHNDbG9uZS5sZW5ndGgpXHJcbiAgICAgIHRoaXMuZmlsdGVycy5uZXh0KFxyXG4gICAgICAgIHRoaXMuaGVscGVycy5jcmVhdGVGbGlnaHRGaWx0ZXJzKFxyXG4gICAgICAgICAgcmVzdWx0c0Nsb25lWzBdLmpvdXJuZXlzLFxyXG4gICAgICAgICAgREVGQVVMVF9GSUxURVJTXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG5cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIHRoaXMubmVnb3RpYXRlZCA9XHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5mYXJlVHlwZSA9PT0gRmFyZVR5cGUuTmVnb3RpYXRlZCA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0cyhcclxuICAgIHJlc3VsdHMxOiBFdXJvc3RhclF1b3RlUmVzdWx0XHJcbiAgKTogRXVyb3N0YXJRdW90ZVJlc3VsdEFycmF5IHtcclxuICAgIHRoaXMucmVzdWx0UXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICBkZWxldGUgdGhpcy5yZXN1bHRRdWVyeS53aXRoR3JvdXBlZDtcclxuICAgIHRoaXMuZmlsdGVycy5uZXh0KFxyXG4gICAgICB0aGlzLmhlbHBlcnMuY3JlYXRlRmxpZ2h0RmlsdGVycyhyZXN1bHRzMS5qb3VybmV5cywgREVGQVVMVF9GSUxURVJTKVxyXG4gICAgKTtcclxuICAgIGlmIChyZXN1bHRzMSAmJiB0aGlzLnNlYXJjaFNlcnZpY2UuaXNGbGlnaHRzR3JvdXBlZCgpKSB7XHJcbiAgICAgIGNvbnN0IHJldHVybmRhdGEgPSAocmVzdWx0czEuam91cm5leXMgfHwgW10pLnJlZHVjZShcclxuICAgICAgICAoXHJcbiAgICAgICAgICBhY2M6IEV1cm9zdGFyUmVzdWx0cyxcclxuICAgICAgICAgIHJlc3VsdDogRmxpZ2h0SXRpbmVyYXJ5LFxyXG4gICAgICAgICAgaW5kZXg6IG51bWJlclxyXG4gICAgICAgICk6IEV1cm9zdGFyUmVzdWx0cyA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0Lm91dGJvdW5kRmxpZ2h0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgZXVyb1Jlc3VsdCA9IHRoaXMuZm9ybWF0RXVyb3N0YXJSZXN1bHRzKFxyXG4gICAgICAgICAgICAgIHJlc3VsdC5vdXRib3VuZEZsaWdodHMsXHJcbiAgICAgICAgICAgICAgcmVzdWx0LnRvdGFsLFxyXG4gICAgICAgICAgICAgIGluZGV4XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGV1cm9SZXN1bHQuY28yUGVyUGFzc2VuZ2VyID0gcmVzdWx0LmNvMlBlclBhc3NlbmdlcjtcclxuICAgICAgICAgICAgZXVyb1Jlc3VsdC5jbzJQZXJJdGVtID0gcmVzdWx0LmNvMlBlckl0ZW07XHJcbiAgICAgICAgICAgIGV1cm9SZXN1bHQuc291cmNlSWQgPSByZXN1bHQuc291cmNlSWQ7XHJcbiAgICAgICAgICAgIGV1cm9SZXN1bHQudG90YWwgPSByZXN1bHQudG90YWw7XHJcbiAgICAgICAgICAgIGV1cm9SZXN1bHQuZHVyYXRpb24gPSB0aGlzLm1pblRvSG91cihyZXN1bHQub3V0Ym91bmRUb3RhbER1cmF0aW9uKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZXVyb1Jlc3VsdC5jYWJpbkNsYXNzKTtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICFhY2Mub3V0Ym91bmQuZmluZChcclxuICAgICAgICAgICAgICAgIChpdGVtOiBFdXJvc3Rhckl0ZW0pID0+XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW0uZGF0ZURlcGFydHVyZSA9PT0gZXVyb1Jlc3VsdC5kYXRlRGVwYXJ0dXJlICYmXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW0uY2FiaW5DbGFzcyA9PT0gZXVyb1Jlc3VsdC5jYWJpbkNsYXNzXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBhY2Mub3V0Ym91bmQucHVzaChldXJvUmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChyZXN1bHQuaW5ib3VuZEZsaWdodHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV1cm9SZXN1bHQgPSB0aGlzLmZvcm1hdEV1cm9zdGFyUmVzdWx0cyhcclxuICAgICAgICAgICAgICByZXN1bHQuaW5ib3VuZEZsaWdodHMsXHJcbiAgICAgICAgICAgICAgcmVzdWx0LnRvdGFsLFxyXG4gICAgICAgICAgICAgIGluZGV4XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGV1cm9SZXN1bHQuY28yUGVyUGFzc2VuZ2VyID0gcmVzdWx0LmNvMlBlclBhc3NlbmdlcjtcclxuICAgICAgICAgICAgZXVyb1Jlc3VsdC5jbzJQZXJJdGVtID0gcmVzdWx0LmNvMlBlckl0ZW07XHJcbiAgICAgICAgICAgIGV1cm9SZXN1bHQuc291cmNlSWQgPSByZXN1bHQuc291cmNlSWQ7XHJcbiAgICAgICAgICAgIGV1cm9SZXN1bHQudG90YWwgPSByZXN1bHQudG90YWw7XHJcbiAgICAgICAgICAgIGV1cm9SZXN1bHQuZHVyYXRpb24gPSB0aGlzLm1pblRvSG91cihyZXN1bHQuaW5ib3VuZFRvdGFsRHVyYXRpb24pO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhldXJvUmVzdWx0LmNhYmluQ2xhc3MpO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgIWFjYy5pbmJvdW5kLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAoaXRlbTogRXVyb3N0YXJJdGVtKSA9PlxyXG4gICAgICAgICAgICAgICAgICBpdGVtLmRhdGVEZXBhcnR1cmUgPT09IGV1cm9SZXN1bHQuZGF0ZURlcGFydHVyZSAmJlxyXG4gICAgICAgICAgICAgICAgICBpdGVtLmNhYmluQ2xhc3MgPT09IGV1cm9SZXN1bHQuY2FiaW5DbGFzc1xyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgYWNjLmluYm91bmQucHVzaChldXJvUmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgb3V0Ym91bmQ6IFtdLCBpbmJvdW5kOiBbXSB9IGFzIEV1cm9zdGFyUmVzdWx0c1xyXG4gICAgICApO1xyXG4gICAgICByZXR1cm5kYXRhLm91dGJvdW5kID0gcmV0dXJuZGF0YS5vdXRib3VuZC5yZWR1Y2UoXHJcbiAgICAgICAgdGhpcy5tYXRjaEZhcmVzLmJpbmQodGhpcyksXHJcbiAgICAgICAgW11cclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuZGF0YS5pbmJvdW5kID0gcmV0dXJuZGF0YS5pbmJvdW5kLnJlZHVjZShcclxuICAgICAgICB0aGlzLm1hdGNoRmFyZXMuYmluZCh0aGlzKSxcclxuICAgICAgICBbXVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gW3JldHVybmRhdGFdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdHMxID8gW3Jlc3VsdHMxXSA6IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuICBtYXRjaEZhcmVzKGFjYzogRXVyb3N0YXJJdGVtW10sIG91dDogRXVyb3N0YXJJdGVtKTogRXVyb3N0YXJJdGVtW10ge1xyXG4gICAgY29uc3QgbWF0Y2hpbmdFdXJvc3RhciA9IGFjYy5maW5kKFxyXG4gICAgICAoaXRlbSkgPT4gaXRlbS5kYXRlRGVwYXJ0dXJlID09PSBvdXQuZGF0ZURlcGFydHVyZVxyXG4gICAgKTtcclxuICAgIGlmICghbWF0Y2hpbmdFdXJvc3Rhcikge1xyXG4gICAgICBhY2MucHVzaChvdXQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gY2hlY2sgd2hhdCBuZWVkcyBhZGRpbmcgYW5kIGFkZCBpdFxyXG4gICAgICBzd2l0Y2ggKG91dC5jYWJpbkNsYXNzKSB7XHJcbiAgICAgICAgY2FzZSBGbGlnaHRDYWJpbkNsYXNzLkVjb25vbXk6XHJcbiAgICAgICAgY2FzZSBGbGlnaHRDYWJpbkNsYXNzLkVjb25vbXlOb0JhZ3M6XHJcbiAgICAgICAgY2FzZSBGbGlnaHRDYWJpbkNsYXNzLkVjb25vbXlSZXN0cmljdGVkOlxyXG4gICAgICAgICAgbWF0Y2hpbmdFdXJvc3Rhci5zdGFuZGFyZEZhcmUgPSBvdXQuc3RhbmRhcmRGYXJlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnUHJlbWl1bSc6XHJcbiAgICAgICAgICBtYXRjaGluZ0V1cm9zdGFyLnN0YW5kYXJkUHJlbWllckZhcmUgPSBvdXQuc3RhbmRhcmRQcmVtaWVyRmFyZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRmxpZ2h0Q2FiaW5DbGFzcy5CdXNpbmVzczpcclxuICAgICAgICAgIG1hdGNoaW5nRXVyb3N0YXIuYnVzaW5lc3NQcmVtaWVyRmFyZSA9IG91dC5idXNpbmVzc1ByZW1pZXJGYXJlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdob3cgZGlkIEkgZ2V0IGhlcmUnLCBvdXQuY2FiaW5DbGFzcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFjYztcclxuICB9XHJcblxyXG4gIGZvcm1hdEV1cm9zdGFyUmVzdWx0cyhcclxuICAgIHJlc3VsdHM6IEZsaWdodEpvdXJuZXlbXSxcclxuICAgIHRvdGFsOiBGbGlnaHRGYXJlVG90YWwsXHJcbiAgICBpbmRleDogbnVtYmVyXHJcbiAgKTogRXVyb3N0YXJJdGVtIHtcclxuICAgIGNvbnN0IHJldHVybk9iamVjdDogRXVyb3N0YXJJdGVtID0ge1xyXG4gICAgICBkYXRlQXJyaXZhbDogbnVsbCxcclxuICAgICAgZGF0ZURlcGFydHVyZTogbnVsbCxcclxuICAgICAgZHVyYXRpb246IG51bGwsXHJcbiAgICAgIHRpbWVBcnJpdmFsOiBudWxsLFxyXG4gICAgICB0aW1lRGVwYXJ0dXJlOiBudWxsLFxyXG4gICAgICBjbzJQZXJJdGVtOiAwLFxyXG4gICAgICBjbzJQZXJQYXNzZW5nZXI6IDAsXHJcbiAgICAgIHNvdXJjZUlkOiBudWxsLFxyXG4gICAgICB0b3RhbDogbnVsbCxcclxuICAgICAgdWlkOiBudWxsLFxyXG4gICAgICBjYWJpbkNsYXNzOiBudWxsLFxyXG4gICAgICBidXNpbmVzc1ByZW1pZXJGYXJlOiB7XHJcbiAgICAgICAgY2xhc3M6IG51bGwsXHJcbiAgICAgICAgZmFyZTogbnVsbCxcclxuICAgICAgICBpc0Rpc2FibGVkOiB0cnVlLFxyXG4gICAgICAgIHByaWNlOiBOYU4sXHJcbiAgICAgICAgY3VycmVuY3k6ICdHQlAnLFxyXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBzdGFuZGFyZEZhcmU6IHtcclxuICAgICAgICBjbGFzczogbnVsbCxcclxuICAgICAgICBmYXJlOiBudWxsLFxyXG4gICAgICAgIGlzRGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgcHJpY2U6IE5hTixcclxuICAgICAgICBjdXJyZW5jeTogJ0dCUCcsXHJcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YW5kYXJkUHJlbWllckZhcmU6IHtcclxuICAgICAgICBjbGFzczogbnVsbCxcclxuICAgICAgICBmYXJlOiBudWxsLFxyXG4gICAgICAgIGlzRGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgcHJpY2U6IE5hTixcclxuICAgICAgICBjdXJyZW5jeTogJ0dCUCcsXHJcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAvLyByZXR1cm5PYmplY3QuZHVyYXRpb24gPSByZXN1bHRzLm91dGJvdW5kVG90YWxEdXJhdGlvbjtcclxuICAgIHJlc3VsdHMuZm9yRWFjaCgoZmxpZ2h0KSA9PiB7XHJcbiAgICAgIHJldHVybk9iamVjdC5kYXRlQXJyaXZhbCA9IGZsaWdodC5kYXRlVGltZUFycml2aW5nO1xyXG4gICAgICByZXR1cm5PYmplY3QuZGF0ZURlcGFydHVyZSA9IGZsaWdodC5kYXRlVGltZURlcGFydGluZztcclxuICAgICAgcmV0dXJuT2JqZWN0LmR1cmF0aW9uID0gdGhpcy5taW5Ub0hvdXIoZmxpZ2h0LnRvdGFsRHVyYXRpb24pO1xyXG4gICAgICByZXR1cm5PYmplY3QudGltZUFycml2YWwgPSBtb21lbnQoZmxpZ2h0LmRhdGVUaW1lQXJyaXZpbmcpLmZvcm1hdChcclxuICAgICAgICAnSEg6bW0nXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybk9iamVjdC50aW1lRGVwYXJ0dXJlID0gbW9tZW50KGZsaWdodC5kYXRlVGltZURlcGFydGluZykuZm9ybWF0KFxyXG4gICAgICAgICdISDptbSdcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuT2JqZWN0LmNhYmluQ2xhc3MgPSBmbGlnaHQuY2FiaW5DbGFzcztcclxuICAgICAgcmV0dXJuT2JqZWN0LnVpZCA9IGluZGV4O1xyXG4gICAgICAvLyBbMTQ6NDFdIEJyZW5kYW4gVmVuaW5nYVxyXG4gICAgICAvLyBFY29ub215IChhbmQgdGhlaXIgdmFyaWFudHMpIHdvdWxkIGJlIFN0YW5kYXJkXHJcbiAgICAgIC8vIFByZW1pdW0gd291bGQgYmUgU3RhbmRhcmQgUHJlbWl1bVxyXG4gICAgICAvLyBCdXNpbmVzcyB3b3VsZCBiZSBCdXNpbmVzcyBQcmVtaXVtXHJcbiAgICAgIHN3aXRjaCAoZmxpZ2h0LmNhYmluQ2xhc3MpIHtcclxuICAgICAgICBjYXNlIEZsaWdodENhYmluQ2xhc3MuRWNvbm9teUZsZXhpOlxyXG4gICAgICAgIGNhc2UgRmxpZ2h0Q2FiaW5DbGFzcy5FY29ub215Tm9CYWdzOlxyXG4gICAgICAgIGNhc2UgRmxpZ2h0Q2FiaW5DbGFzcy5FY29ub215UmVzdHJpY3RlZDpcclxuICAgICAgICBjYXNlIEZsaWdodENhYmluQ2xhc3MuRWNvbm9teTpcclxuICAgICAgICAgIHJldHVybk9iamVjdC5zdGFuZGFyZEZhcmUuaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5mYXJlID0gZmxpZ2h0O1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5wcmljZSA9IHRvdGFsLnByaWNlO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5jdXJyZW5jeSA9IHRvdGFsLmN1cnJlbmN5O1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5jbGFzcyA9IGZsaWdodC5jYWJpbkNsYXNzO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkRmFyZS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnUHJlbWl1bSc6XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRQcmVtaWVyRmFyZS5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRQcmVtaWVyRmFyZS5mYXJlID0gZmxpZ2h0O1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkUHJlbWllckZhcmUucHJpY2UgPSB0b3RhbC5wcmljZTtcclxuICAgICAgICAgIHJldHVybk9iamVjdC5zdGFuZGFyZFByZW1pZXJGYXJlLmN1cnJlbmN5ID0gdG90YWwuY3VycmVuY3k7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3Quc3RhbmRhcmRQcmVtaWVyRmFyZS5jbGFzcyA9IGZsaWdodC5jYWJpbkNsYXNzO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LnN0YW5kYXJkUHJlbWllckZhcmUuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRmxpZ2h0Q2FiaW5DbGFzcy5CdXNpbmVzczpcclxuICAgICAgICAgIHJldHVybk9iamVjdC5idXNpbmVzc1ByZW1pZXJGYXJlLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybk9iamVjdC5idXNpbmVzc1ByZW1pZXJGYXJlLmZhcmUgPSBmbGlnaHQ7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3QuYnVzaW5lc3NQcmVtaWVyRmFyZS5wcmljZSA9IHRvdGFsLnByaWNlO1xyXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LmJ1c2luZXNzUHJlbWllckZhcmUuY3VycmVuY3kgPSB0b3RhbC5jdXJyZW5jeTtcclxuICAgICAgICAgIHJldHVybk9iamVjdC5idXNpbmVzc1ByZW1pZXJGYXJlLmNsYXNzID0gZmxpZ2h0LmNhYmluQ2xhc3M7XHJcbiAgICAgICAgICByZXR1cm5PYmplY3QuYnVzaW5lc3NQcmVtaWVyRmFyZS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGNvbnNvbGUud2FybignbmV3IGNsYXNzIHRvIGJlIGltcGxlbWVudGVkOiAnLCBmbGlnaHQuY2FiaW5DbGFzcyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJldHVybk9iamVjdDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXNldFF1ZXJ5KGNoZWNrSXNWYWxpZDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlVGVtcFBhcmFtcyh0aGlzLnNlYXJjaFNlcnZpY2UubWFrZUV1cm9zdGFyUXVlcnkoKSk7XHJcbiAgICBpZiAoY2hlY2tJc1ZhbGlkKSB7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldFBhcmFtcygpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICAgIHRoaXMucmVzZXRRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNWYWxpZCgpIHtcclxuICAgIGlmICghdGhpcy5kb0NoZWNrcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBFdXJvc3RhckVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAge1xyXG4gICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtcyxcclxuICAgICAgICBvcmlnaW5hbFVzZXJTZWFyY2g6IHRoaXMub3JpZ2luYWxVc2VyU2VhcmNoXHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcclxuICAgIGlmICghdGhpcy5fb3JpZ2luQWlycG9ydCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgYWRkIGluIGEgZGVwYXJ0dXRyZSBsb2NhdGlvbicpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLl9kZXN0aW5hdGlvbkFpcnBvcnQpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIGFkZCBpbiBhIGFycml2YWwgZGVzdGluYXRpb24nKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZS5pc0FmdGVyKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdEZXBhcnR1cmUgZGF0ZSBjYW4gbm90IGJlIGluIHRoZSBwYXN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9vcmlnaW5BaXJwb3J0ICYmXHJcbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uQWlycG9ydCAmJlxyXG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbkFpcnBvcnQgPT09IHRoaXMuX29yaWdpbkFpcnBvcnRcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICdPcmlnaW4gYW5kIGRlc3RpbmF0aW9uIHN0YXRpb24gY2Fubm90IGJlIHRoZSBzYW1lJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNSZXR1cm4pIHtcclxuICAgICAgLy8gVE9ETyBjaGVjayB0aGF0IHJldHVybiBkZXRhaWxzIGFyZSBzZXRcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMudGVtcFBhcmFtcy5vdXRCb3VuZERhdGUuaXNTYW1lT3JBZnRlcihcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5pblRpbWVDcml0ZXJpYVxyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAgICdSZXR1cm4gZGF0ZSBtdXN0IGJlIGFmdGVyIHRoZSBkZXBhcnR1cmUgZGF0ZSdcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVmFsaWQubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDApO1xyXG4gICAgdGhpcy5tZXNzYWdlcy5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoW10pO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgdGhpcy5fb3JpZ2luYWxVc2VyU2VhcmNoID0gT2JqZWN0LmZyZWV6ZShcclxuICAgICAgICB0aGlzLmhlbHBlcnMuY2xvbmUodGhpcy50ZW1wUGFyYW1zKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICAgIEV1cm9zdGFyRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtcyxcclxuICAgICAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2hcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZVJlY2VudFNlYXJjaCh0aGlzLmdldFJlY2VudFNlYXJjaFF1ZXJ5KHF1ZXJ5KSk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWFyY2goXHJcbiAgICAgICAgdGhpcy5ldXJvc3RhckZldGNoZXIuZmV0Y2hMaXN0KHRoaXMuZ2V0U2VhcmNoUXVlcnkoKSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UmVjZW50U2VhcmNoUXVlcnkoXHJcbiAgICBxdWVyeTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXNcclxuICApOiBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMge1xyXG4gICAgY29uc3QgcmVjZW50U2VhcmNoUXVlcnk6IElFdXJvc3RhclNlYXJjaEFyZ3MgPSB0aGlzLnVwZGF0ZVNlcmNoUXVlcnkocXVlcnkpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNlcnZpY2VUeXBlOiBTZXJ2aWNlVHlwZS5FdXJvc3RhcixcclxuICAgICAgc2VhcmNoQXJnczogcmVjZW50U2VhcmNoUXVlcnksXHJcbiAgICAgIHRyYXZlbERhdGU6IHRoaXMub3V0Qm91bmREYXRlLmZvcm1hdCgpLFxyXG4gICAgICB0cmF2ZWxsZXJzOiB0aGlzLmhlbHBlcnMuZ2V0VHJhdmVsbGVyc0lkKHRoaXMudHJhdmVsbGVycylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNlcmNoUXVlcnkocXVlcnk6IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzKTogSUV1cm9zdGFyU2VhcmNoQXJnc3tcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5OiBJRXVyb3N0YXJTZWFyY2hBcmdzID0gcXVlcnk7XHJcbiAgICBpZiAodGhpcy5kZXBhcnRMb2NhdGlvbikge1xyXG4gICAgICBzZWFyY2hRdWVyeS5kZXBhcnRMb2NhdGlvbiA9IHRoaXMuZGVwYXJ0TG9jYXRpb247XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hcnJpdmVMb2NhdGlvbikge1xyXG4gICAgICBzZWFyY2hRdWVyeS5hcnJpdmVMb2NhdGlvbiA9IHRoaXMuYXJyaXZlTG9jYXRpb247XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VhcmNoUXVlcnk7XHJcbiAgfVxyXG5cclxuICBzdGFydFJlY2VudFNlYXJjaChyZWNlbnRTZWFyY2g6IFJlY2VudFNlYXJjaCk6IHZvaWQge1xyXG4gICAgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm91dGJvdW5kRGF0ZSkge1xyXG4gICAgICBsZXQgb3V0Ym91bmRUaW1lV2luZG93ID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3NcclxuICAgICAgICAub3V0Ym91bmREZXBhcnR1cmVUaW1lV2luZG93XHJcbiAgICAgICAgPyByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5vdXRib3VuZERlcGFydHVyZVRpbWVXaW5kb3dcclxuICAgICAgICA6IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm91dGJvdW5kQXJyaXZhbFRpbWVXaW5kb3c7XHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlID0gdGhpcy5jb252ZXJ0UmVjZW50U2VhcmNoRGF0ZVRpbWUoXHJcbiAgICAgICAgcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub3V0Ym91bmREYXRlLFxyXG4gICAgICAgIG91dGJvdW5kVGltZVdpbmRvd1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yZXR1cm5EYXRlKSB7XHJcbiAgICAgIGxldCByZXR1cm5UaW1lV2luZG93ID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucmV0dXJuRGVwYXJ0dXJlVGltZVdpbmRvd1xyXG4gICAgICAgID8gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucmV0dXJuRGVwYXJ0dXJlVGltZVdpbmRvd1xyXG4gICAgICAgIDogcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucmV0dXJuQXJyaXZhbFRpbWVXaW5kb3c7XHJcbiAgICAgIHRoaXMuaW5ib3VuZERhdGUgPSB0aGlzLmNvbnZlcnRSZWNlbnRTZWFyY2hEYXRlVGltZShcclxuICAgICAgICByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yZXR1cm5EYXRlLFxyXG4gICAgICAgIHJldHVyblRpbWVXaW5kb3dcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZhcmVUeXBlID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZmFyZVR5cGU7XHJcbiAgICB0aGlzLm1heENvbm5lY3Rpb25zID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubWF4Q29ubmVjdGlvbnM7XHJcblxyXG4gICAgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm91dGJvdW5kQ2FiaW5DbGFzcykge1xyXG4gICAgICB0aGlzLmNhYmluQ2xhc3MgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5vdXRib3VuZENhYmluQ2xhc3NbMF07XHJcbiAgICB9XHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucmV0dXJuQ2FiaW5DbGFzcykge1xyXG4gICAgICB0aGlzLnJldHVybkNhYmluQ2xhc3MgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yZXR1cm5DYWJpbkNsYXNzWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jbHVkZU5lYXJieUFpcnBvcnRzID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuaW5jbHVkZU5lYXJieUFpcnBvcnRzO1xyXG5cclxuICAgIHRoaXMuY2hvc2VuU2VhcmNoVHlwZSA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnJldHVyblRyaXBcclxuICAgICAgPyBFdXJvc3RhclNlYXJjaFR5cGUucmV0dXJuXHJcbiAgICAgIDogRXVyb3N0YXJTZWFyY2hUeXBlLm9uZVdheTtcclxuXHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub3V0Ym91bmREZXBhcnR1cmVUaW1lV2luZG93KSB7XHJcbiAgICAgIHRoaXMub3V0VGltZUNyaXRlcmlhID0gVGltZVdpbmRvdy5EZXBhcnQ7XHJcbiAgICB9IGVsc2UgaWYgKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm91dGJvdW5kQXJyaXZhbFRpbWVXaW5kb3cpIHtcclxuICAgICAgdGhpcy5vdXRUaW1lQ3JpdGVyaWEgPSBUaW1lV2luZG93LkFycml2ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3V0VGltZUNyaXRlcmlhID0gVGltZVdpbmRvdy5Bbnl0aW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5yZXR1cm5EZXBhcnR1cmVUaW1lV2luZG93KSB7XHJcbiAgICAgIHRoaXMuaW5UaW1lQ3JpdGVyaWEgPSBUaW1lV2luZG93LkRlcGFydDtcclxuICAgIH0gZWxzZSBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucmV0dXJuQXJyaXZhbFRpbWVXaW5kb3cpIHtcclxuICAgICAgdGhpcy5pblRpbWVDcml0ZXJpYSA9IFRpbWVXaW5kb3cuQXJyaXZlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pblRpbWVDcml0ZXJpYSA9IFRpbWVXaW5kb3cuQW55dGltZTtcclxuICAgIH1cclxuICAgIHRoaXMuX29yaWdpbkFpcnBvcnQgPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy5vcmlnaW5BaXJwb3J0O1xyXG4gICAgdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0ID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuZGVzdGluYXRpb25BaXJwb3J0O1xyXG4gICAgdGhpcy5hcnJpdmVMb2NhdGlvbiA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmFycml2ZUxvY2F0aW9uO1xyXG4gICAgdGhpcy5kZXBhcnRMb2NhdGlvbiA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmRlcGFydExvY2F0aW9uO1xyXG4gICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFrZURlcGFydHVyZVRpbWVXaW5kb3coXHJcbiAgICBkYXRlVGltZTogbW9tZW50Lk1vbWVudCxcclxuICAgIHdpbmRvdzogVGltZVdpbmRvd1xyXG4gICk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gd2luZG93ID09PSBUaW1lV2luZG93LkRlcGFydFxyXG4gICAgICA/IHRoaXMuaGVscGVycy5tYWtlVGltZVdpbmRvdyhkYXRlVGltZSwgLTIsIDIpXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFrZUFycml2YWxUaW1lV2luZG93KFxyXG4gICAgZGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQsXHJcbiAgICB3aW5kb3c6IFRpbWVXaW5kb3dcclxuICApOiBzdHJpbmcge1xyXG4gICAgaWYgKHdpbmRvdyAhPT0gVGltZVdpbmRvdy5BcnJpdmUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5tYWtlVGltZVdpbmRvdyhkYXRlVGltZSwgLTIsIDIpO1xyXG4gIH1cclxuXHJcbiAgY29udmVydFJlY2VudFNlYXJjaERhdGVUaW1lKFxyXG4gICAgZGF0ZTogc3RyaW5nLFxyXG4gICAgdGltZVdpbmRvdz86IHN0cmluZ1xyXG4gICk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgaWYgKHRpbWVXaW5kb3cpIHtcclxuICAgICAgY29uc3QgZmxpZ2h0VGltZSA9IHRpbWVXaW5kb3cuc3BsaXQoJy0nKTtcclxuICAgICAgbGV0IHRpbWVBbmREYXRlID0gbW9tZW50KGRhdGUpLmFkZChcclxuICAgICAgICBtb21lbnQuZHVyYXRpb24odGhpcy5oZWxwZXJzLmhobW1Ub1RpbWUoZmxpZ2h0VGltZVswXSkpXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIGFkZCAyIGhvdXJcclxuICAgICAgcmV0dXJuIHRpbWVBbmREYXRlLmNsb25lKCkuYWRkKDIsICdob3VyJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbW9tZW50KGRhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U2VhcmNoUXVlcnkoKTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMge1xyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5yZW1vdmVOdWxsczxTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcz4oXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAge30sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3JpZ2luQWlycG9ydDogdGhpcy5fb3JpZ2luQWlycG9ydCxcclxuICAgICAgICAgIGRlc3RpbmF0aW9uQWlycG9ydDogdGhpcy5fZGVzdGluYXRpb25BaXJwb3J0LFxyXG4gICAgICAgICAgb3V0Ym91bmREYXRlOiB0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZShcclxuICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZVxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIG91dGJvdW5kRGVwYXJ0dXJlVGltZVdpbmRvdzogdGhpcy5tYWtlRGVwYXJ0dXJlVGltZVdpbmRvdyhcclxuICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm91dEJvdW5kRGF0ZSxcclxuICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLm91dFRpbWVDcml0ZXJpYVxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIG91dGJvdW5kQXJyaXZhbFRpbWVXaW5kb3c6IHRoaXMubWFrZUFycml2YWxUaW1lV2luZG93KFxyXG4gICAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlLFxyXG4gICAgICAgICAgICB0aGlzLnRlbXBQYXJhbXMub3V0VGltZUNyaXRlcmlhXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwYXNzZW5nZXJzOiB0aGlzLl9wYXNzZW5nZXJzLFxyXG4gICAgICAgICAgcmV0dXJuVHJpcDogdGhpcy5pc1JldHVybixcclxuICAgICAgICAgIG91dGJvdW5kQ2FiaW5DbGFzczogdGhpcy50ZW1wUGFyYW1zLmNhYmluQ2xhc3NcclxuICAgICAgICAgICAgPyBbdGhpcy50ZW1wUGFyYW1zLmNhYmluQ2xhc3NdXHJcbiAgICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICAgIHJlcXVpcmVGcmVlQmFnOiBudWxsLFxyXG4gICAgICAgICAgbWF4Q29ubmVjdGlvbnM6IHRoaXMudGVtcFBhcmFtcy5tYXhDb25uZWN0aW9ucyxcclxuICAgICAgICAgIGluY2x1ZGVOZWFyYnlBaXJwb3J0czogdGhpcy50ZW1wUGFyYW1zLmluY2x1ZGVOZWFyYnlBaXJwb3J0cyxcclxuICAgICAgICAgIHByZWZlcnJlZENhcnJpZXJzOiB0aGlzLnRlbXBQYXJhbXMucHJlZmVycmVkQ2FycmllcnMubWFwKFxyXG4gICAgICAgICAgICAoY2FycmllcjogT0JUQWlybGluZXNEZXRhaWxzKSA9PlxyXG4gICAgICAgICAgICAgIGNhcnJpZXI/LmNvZGUgPyBjYXJyaWVyLmNvZGUgOiBudWxsXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgZmFyZVR5cGU6IHRoaXMudGVtcFBhcmFtcy5mYXJlVHlwZSxcclxuICAgICAgICAgIHdpdGhHcm91cGVkOiBudWxsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0aGlzLmlzUmV0dXJuXHJcbiAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICByZXR1cm5EYXRlOiB0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZShcclxuICAgICAgICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5pbmJvdW5kRGF0ZVxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgcmV0dXJuRGVwYXJ0dXJlVGltZVdpbmRvdzogdGhpcy5tYWtlRGVwYXJ0dXJlVGltZVdpbmRvdyhcclxuICAgICAgICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5pbmJvdW5kRGF0ZSxcclxuICAgICAgICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5pblRpbWVDcml0ZXJpYVxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgcmV0dXJuQXJyaXZhbFRpbWVXaW5kb3c6IHRoaXMubWFrZUFycml2YWxUaW1lV2luZG93KFxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmluYm91bmREYXRlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmluVGltZUNyaXRlcmlhXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICByZXR1cm5DYWJpbkNsYXNzOiB0aGlzLnRlbXBQYXJhbXMucmV0dXJuQ2FiaW5DbGFzc1xyXG4gICAgICAgICAgICAgICAgPyBbdGhpcy50ZW1wUGFyYW1zLnJldHVybkNhYmluQ2xhc3NdXHJcbiAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgOiB7fVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUcmF2ZWxsZXJzKCkge1xyXG4gICAgY29uc3QgdHJhdmVsbGVyczogRmxpZ2h0UGFzc2VuZ2VyT2JqZWN0W10gPSBbXTtcclxuICAgIGZvciAobGV0IGxvb3AgPSAwOyBsb29wIDwgdGhpcy50ZW1wUGFyYW1zLmFkdWx0czsgbG9vcCArPSAxKSB7XHJcbiAgICAgIHRyYXZlbGxlcnMucHVzaCh7IHR5cGU6IEZsaWdodFBhc3NlbmdlclR5cGUuQWR1bHQgfSk7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBsb29wID0gMDsgbG9vcCA8IHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbjsgbG9vcCArPSAxKSB7XHJcbiAgICAgIHRyYXZlbGxlcnMucHVzaCh7IHR5cGU6IEZsaWdodFBhc3NlbmdlclR5cGUuQ2hpbGQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcGFzc2VuZ2VycyA9IHRyYXZlbGxlcnM7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUF2YWxpYWJsZUNsYXNzZXMoKSB7XHJcbiAgICB0aGlzLmF2YWxpYWJsZUNsYXNzZXMubmV4dChbXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnQW55JyxcclxuICAgICAgICB0eXBlOiBGbGlnaHRDYWJpbkNsYXNzLkFueVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1N0YW5kYXJkIChzZW1pIGZsZXhpYmxlKScsXHJcbiAgICAgICAgdHlwZTogRmxpZ2h0Q2FiaW5DbGFzcy5FY29ub215XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnU3RhbmRhcmQgcHJlbWllciAoc2VtaSBmbGV4aWJsZSknLFxyXG4gICAgICAgIHR5cGU6IEZsaWdodENhYmluQ2xhc3MuUHJlbWl1bUVjb25vbXlcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdCdXNpbmVzcyBwcmVtaWVyIChmdWxseSBmbGV4aWJsZSknLFxyXG4gICAgICAgIHR5cGU6IEZsaWdodENhYmluQ2xhc3MuQnVzaW5lc3NcclxuICAgICAgfVxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBzb3J0IHRoZSBmbGlnaHQgcmVzdWx0c1xyXG4gICAqIEB0b2RvIC0gRmlsbCBvdXQgUHJlZmVycmVkIGFuZCBDbzIgc29ydGluZyB3aGVuIHdlIGhhdmUgdGhhdCBkYXRhXHJcbiAgICovXHJcbiAgcHVibGljIHNvcnRSZXN1bHRzKFxyXG4gICAgc29ydE1ldGhvZFZhbHVlOiBTb3J0VHlwZXNFdXJvc3RhcixcclxuICAgIGRpcjogYm9vbGVhbixcclxuICAgIGdpdmVuUmVzdWx0cz86IEV1cm9zdGFyUmVzdWx0c1tdXHJcbiAgKTogdm9pZCB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IHRoaXMuaGVscGVycy5jbG9uZShcclxuICAgICAgZ2l2ZW5SZXN1bHRzXHJcbiAgICAgICAgPyBnaXZlblJlc3VsdHNcclxuICAgICAgICA6IDxFdXJvc3RhclJlc3VsdHNbXT4oPHVua25vd24+dGhpcy5mdWxsUmVzdWx0cylcclxuICAgICk7XHJcblxyXG4gICAgc3dpdGNoIChzb3J0TWV0aG9kVmFsdWUpIHtcclxuICAgICAgY2FzZSBTb3J0VHlwZXNFdXJvc3Rhci5DaGVhcGVzdEZpcnN0OlxyXG4gICAgICAgIHJlc3VsdHMgPSB0aGlzLnNvcnRCeVByaWNlKHJlc3VsdHMsIGRpcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU29ydFR5cGVzRXVyb3N0YXIuRWFybGllc3RGaXJzdDpcclxuICAgICAgICByZXN1bHRzID0gdGhpcy5zb3J0QnlEYXRlKHJlc3VsdHMsIGRpcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgKysrIFVua25vd24gc29ydGluZyBtZXRob2Q6ICR7c29ydE1ldGhvZFZhbHVlfSArKytgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChyZXN1bHRzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzb3J0UmVzdWx0c0ZsaWdodEpvdXJuZXlzKFxyXG4gICAgc29ydE1ldGhvZFZhbHVlOiBTb3J0VHlwZXNFdXJvc3RhcixcclxuICAgIGluYm91bmQ6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIGdpdmVuUmVzdWx0cz86IEZsaWdodEl0aW5lcmFyeVtdXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgbGV0IHJlc3VsdHMgPSB0aGlzLmhlbHBlcnMuY2xvbmUoZ2l2ZW5SZXN1bHRzKTtcclxuXHJcbiAgICBzd2l0Y2ggKHNvcnRNZXRob2RWYWx1ZSkge1xyXG4gICAgICBjYXNlIFNvcnRUeXBlc0V1cm9zdGFyLkNoZWFwZXN0Rmlyc3Q6XHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMuc29ydEJ5UHJpY2VGbGlnaHQocmVzdWx0cyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU29ydFR5cGVzRXVyb3N0YXIuRWFybGllc3RGaXJzdDpcclxuICAgICAgICByZXN1bHRzID0gdGhpcy5zb3J0QnlEYXRlRmxpZ2h0KHJlc3VsdHMsIGluYm91bmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNvcnRUeXBlc0V1cm9zdGFyLkxhdGVzdEZpcnN0OlxyXG4gICAgICAgIHJlc3VsdHMgPSB0aGlzLnNvcnRCeURhdGVGbGlnaHREZWNlbmRpbmcocmVzdWx0cywgaW5ib3VuZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgKysrIFVua25vd24gc29ydGluZyBtZXRob2Q6ICR7c29ydE1ldGhvZFZhbHVlfSArKytgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIHNvcnRCeVByaWNlRmxpZ2h0KHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgcmV0dXJuIHJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICByZXR1cm4gTnVtYmVyKGEudG90YWwucHJpY2UpIC0gTnVtYmVyKGIudG90YWwucHJpY2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzb3J0QnlEYXRlRmxpZ2h0KFxyXG4gICAgcmVzdWx0czogRmxpZ2h0SXRpbmVyYXJ5W10sXHJcbiAgICBpbmJvdW5kOiBib29sZWFuXHJcbiAgKTogRmxpZ2h0SXRpbmVyYXJ5W10ge1xyXG4gICAgcmV0dXJuIHJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBpZiAoaW5ib3VuZCkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICBtb21lbnQoYS5pbmJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZykudW5peCgpIC1cclxuICAgICAgICAgIG1vbWVudChiLmluYm91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS51bml4KClcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICBtb21lbnQoYS5vdXRib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpLnVuaXgoKSAtXHJcbiAgICAgICAgICBtb21lbnQoYi5vdXRib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpLnVuaXgoKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc29ydEJ5RGF0ZUZsaWdodERlY2VuZGluZyhcclxuICAgIHJlc3VsdHM6IEZsaWdodEl0aW5lcmFyeVtdLFxyXG4gICAgaW5ib3VuZDogYm9vbGVhblxyXG4gICk6IEZsaWdodEl0aW5lcmFyeVtdIHtcclxuICAgIHJldHVybiByZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgaWYgKGluYm91bmQpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgbW9tZW50KGIuaW5ib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmcpLnVuaXgoKSAtXHJcbiAgICAgICAgICBtb21lbnQoYS5pbmJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZykudW5peCgpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgbW9tZW50KGIub3V0Ym91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS51bml4KCkgLVxyXG4gICAgICAgICAgbW9tZW50KGEub3V0Ym91bmRGbGlnaHRzWzBdLmRhdGVUaW1lRGVwYXJ0aW5nKS51bml4KClcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvcnQgcmVzdWx0cyBieSBkZXBhcnR1cmUgdGltZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtFdXJvc3RhclJlc3VsdHNbXX0gcmVzdWx0c1xyXG4gICAqIEByZXR1cm5zXHJcbiAgICogQG1lbWJlcm9mIEV1cm9zdGFySW5mb1xyXG4gICAqL1xyXG4gIHNvcnRCeURhdGUocmVzdWx0czogRXVyb3N0YXJSZXN1bHRzW10sIGRpcj86IGJvb2xlYW4pOiBFdXJvc3RhclJlc3VsdHNbXSB7XHJcbiAgICBjb25zdCBieURhdGUgPSAoYTogRXVyb3N0YXJJdGVtLCBiOiBFdXJvc3Rhckl0ZW0pID0+IHtcclxuICAgICAgaWYgKGRpcikge1xyXG4gICAgICAgIHJldHVybiBtb21lbnQoYS5kYXRlRGVwYXJ0dXJlKS51bml4KCkgLSBtb21lbnQoYi5kYXRlRGVwYXJ0dXJlKS51bml4KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudChiLmRhdGVEZXBhcnR1cmUpLnVuaXgoKSAtIG1vbWVudChhLmRhdGVEZXBhcnR1cmUpLnVuaXgoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzb3J0ZWRSZXN1bHRzID0ge1xyXG4gICAgICBvdXRib3VuZDogcmVzdWx0c1swXS5vdXRib3VuZC5zb3J0KGJ5RGF0ZSksXHJcbiAgICAgIGluYm91bmQ6IHJlc3VsdHNbMF0uaW5ib3VuZC5zb3J0KGJ5RGF0ZSlcclxuICAgIH07XHJcbiAgICByZXR1cm4gW3NvcnRlZFJlc3VsdHNdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydCByZXN1bHRzIGJ5IHByaWNlXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0V1cm9zdGFyUmVzdWx0c1tdfSByZXN1bHRzXHJcbiAgICogQHJldHVybnNcclxuICAgKiBAbWVtYmVyb2YgRXVyb3N0YXJJbmZvXHJcbiAgICovXHJcbiAgc29ydEJ5UHJpY2UocmVzdWx0czogRXVyb3N0YXJSZXN1bHRzW10sIGRpcj86IGJvb2xlYW4pOiBFdXJvc3RhclJlc3VsdHNbXSB7XHJcbiAgICBjb25zdCBieVByaWNlID0gKGE6IEV1cm9zdGFySXRlbSwgYjogRXVyb3N0YXJJdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFQcmljZSA9XHJcbiAgICAgICAgK2Euc3RhbmRhcmRGYXJlLnByaWNlIHx8XHJcbiAgICAgICAgK2Euc3RhbmRhcmRQcmVtaWVyRmFyZS5wcmljZSB8fFxyXG4gICAgICAgICthLmJ1c2luZXNzUHJlbWllckZhcmUucHJpY2U7XHJcbiAgICAgIGNvbnN0IGJQcmljZSA9XHJcbiAgICAgICAgK2Iuc3RhbmRhcmRGYXJlLnByaWNlIHx8XHJcbiAgICAgICAgK2Iuc3RhbmRhcmRQcmVtaWVyRmFyZS5wcmljZSB8fFxyXG4gICAgICAgICtiLmJ1c2luZXNzUHJlbWllckZhcmUucHJpY2U7XHJcbiAgICAgIGlmIChkaXIpIHtcclxuICAgICAgICByZXR1cm4gYVByaWNlIC0gYlByaWNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBiUHJpY2UgLSBhUHJpY2U7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHNvcnRlZFJlc3VsdHMgPSB7XHJcbiAgICAgIG91dGJvdW5kOiByZXN1bHRzWzBdLm91dGJvdW5kLnNvcnQoYnlQcmljZSksXHJcbiAgICAgIGluYm91bmQ6IHJlc3VsdHNbMF0uaW5ib3VuZC5zb3J0KGJ5UHJpY2UpXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFtzb3J0ZWRSZXN1bHRzXTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUZyb21QcmV2aW91c1NlYXJjaGVzKFxyXG4gICAgcHJldmlvdXNJdGVtczogUmVjb3JkPFNlcnZpY2VUeXBlLCBCYXNrZXRJdGVtPlxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgZmxpZ2h0SXRlbTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMgPVxyXG4gICAgICBwcmV2aW91c0l0ZW1zW1NlcnZpY2VUeXBlLkZsaWdodF0/LnNlYXJjaFF1ZXJ5O1xyXG4gICAgaWYgKGZsaWdodEl0ZW0pIHtcclxuICAgICAgLy8gVE9ETyBmbGlnaHRzIGhhdmVuJ3QgYmVlbiBkb25lIHlldC5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRvdGFsQmFnZ2FnZShyZXN1bHQ6IEZsaWdodEl0aW5lcmFyeSk6IG51bWJlciB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG5cclxuICAgIGNvbnN0IHBhcnNlZEFkZGl0aW9uYWwgPSBKU09OLnBhcnNlKHJlc3VsdC5hZGRpdGlvbmFsKTtcclxuICAgIGlmIChwYXJzZWRBZGRpdGlvbmFsICYmIHBhcnNlZEFkZGl0aW9uYWwub3V0Ym91bmRGbGlnaHRzKSB7XHJcbiAgICAgIHBhcnNlZEFkZGl0aW9uYWwub3V0Ym91bmRGbGlnaHRzLmZvckVhY2goKGZsaWdodDogYW55KSA9PiB7XHJcbiAgICAgICAgZmxpZ2h0LmJhZ2dhZ2UuZm9yRWFjaCgoYmFnOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChiYWcuYWxsb3dhbmNlICYmIGJhZy5hbGxvd2FuY2UgPiB0b3RhbCkge1xyXG4gICAgICAgICAgICB0b3RhbCA9IGJhZy5hbGxvd2FuY2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChwYXJzZWRBZGRpdGlvbmFsICYmIHBhcnNlZEFkZGl0aW9uYWwuYmFnZ2FnZUFsbG93YW5jZSkge1xyXG4gICAgICBwYXJzZWRBZGRpdGlvbmFsLmJhZ2dhZ2VBbGxvd2FuY2UuZm9yRWFjaCgoYmFnZ2FnZUFsbG93OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBiYWdnYWdlQWxsb3cuYmFnZ2FnZS5xdHkgJiZcclxuICAgICAgICAgIE51bWJlcihiYWdnYWdlQWxsb3cuYmFnZ2FnZS5xdHkpID4gdG90YWxcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRvdGFsID0gTnVtYmVyKGJhZ2dhZ2VBbGxvdy5iYWdnYWdlLnF0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdG90YWw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBnaXZlIHRoZSBjb3JyZWN0IGZvcm1hdCBmb3IgdHJhbnNmZXJpbmcgbWludWV0ZXMgb24gdGhlIHNsaWRlcnNcclxuICAgKiBAcGFyYW0gbWluIC0gdGhlIG1pbiBpbiAxMDB0aCdzIHRvIHRyYW5zZm9ybSBvbnRvIDYwdGgnc1xyXG4gICAqL1xyXG4gIHRyYW5zZm9ybU1pbihtaW46IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgbnVtID0gKE51bWJlcihtaW4pICogNjApIC8gMTAwO1xyXG4gICAgLy8gY29uc29sZS5sb2coJysrKyBOdW0gQ29weTogJywgXy5jbG9uZShudW0pLCAnICsrKycpO1xyXG4gICAgaWYgKG51bSAlIDEgPCAwLjUpIHtcclxuICAgICAgbnVtID0gTWF0aC5mbG9vcihudW0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbnVtID0gTWF0aC5jZWlsKG51bSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBhcHBseSBhbGwgZmlsdGVycyB0byByZXN1bHRzXHJcbiAgICogQHBhcmFtIGZpbHRlcnNcclxuICAgKiBAcGFyYW0gaW5ib3VuZFxyXG4gICAqIEBwYXJhbSByZXN1bHRzXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhcHBseUZpbHRlcnMoZmlsdGVyczogRmxpZ2h0RmlsdGVycyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZnVsbFJlc3VsdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMucmVzdWx0cy5uZXh0KFtdKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBuZWVkIHRvIGZpbHRlciBvdmVyIHRoZSB0aW1lcywgc3RvcHMgYW5kIHByaWNlLCB0aG91Z2ggcHJpY2UgYW5kIHN0b3BzIGFsd2F5cyBzZWVtIHRvIGJlIHRoZSBzYW1lXHJcblxyXG4gICAgLy8gISAtIFZBUklPVVMgRlVOQ1RJT05TIFRPIFBBU1MgSU4gVE8gRE8gVEhFIEFDVFVBTCBGSUxURVJJTkdcclxuXHJcbiAgICBjb25zdCB0ZXN0ZXIgPSAoXHJcbiAgICAgIGZpbHRlcnNUb3Rlc3Q6IFJlY29yZDxudW1iZXIgfCBzdHJpbmcsIFNlbGVjdEZpbHRlcj4sXHJcbiAgICAgIHRlc3RGdW5jdGlvbjogKFxyXG4gICAgICAgIGZsaWdodEl0aW5lcmFyeTogRmxpZ2h0SXRpbmVyYXJ5IHwgRmxpZ2h0Sm91cm5leSxcclxuICAgICAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyXHJcbiAgICAgICkgPT4gYm9vbGVhblxyXG4gICAgKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXJzVG90ZXN0KS5maWx0ZXIoXHJcbiAgICAgICAgKGZpbHRlcjogU2VsZWN0RmlsdGVyKSA9PiBmaWx0ZXIuc2VsZWN0ZWRcclxuICAgICAgKTtcclxuICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiAoZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnkgfCBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gISFzZWxlY3RlZC5maW5kKChmaWx0ZXI6IFNlbGVjdEZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGVzdEZ1bmN0aW9uKGZsaWdodEl0aW5lcmFyeSwgZmlsdGVyLnZhbHVlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIChfZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnkgfCBGbGlnaHRKb3VybmV5KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGlzVGltZUJldHdlZW4gPSAoXHJcbiAgICAgIG1pbm1heDogTWluTWF4LFxyXG4gICAgICBmaWVsZDogc3RyaW5nXHJcbiAgICApOiAoKGZsaWdodEl0aW5lcmFyeTogRmxpZ2h0SXRpbmVyYXJ5KSA9PiBib29sZWFuKSA9PiB7XHJcbiAgICAgIHJldHVybiAoZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnkpOiBib29sZWFuID0+IHtcclxuICAgICAgICBjb25zdCB2YWwgPSBtb21lbnQoXHJcbiAgICAgICAgICB0aGlzLmhlbHBlcnMuZnJvbU9iamVjdChcclxuICAgICAgICAgICAgZmxpZ2h0SXRpbmVyYXJ5LFxyXG4gICAgICAgICAgICAuLi5yZXBsYWNlRmllbGRzKGZpZWxkLCBmbGlnaHRJdGluZXJhcnkpLnNwbGl0KCcuJylcclxuICAgICAgICAgIClcclxuICAgICAgICApLmdldCgnaG91cicpO1xyXG5cclxuICAgICAgICAvLyBub3cgYXR0ZW1wdCB0byBnZXQgdGhlIG1pbiAtIG1heSBuZWVkIHRvIG5vcm1hbGlzZSB0aGlzXHJcbiAgICAgICAgY29uc3QgdmFsMiA9IG1vbWVudChcclxuICAgICAgICAgIHRoaXMuaGVscGVycy5mcm9tT2JqZWN0KFxyXG4gICAgICAgICAgICBmbGlnaHRJdGluZXJhcnksXHJcbiAgICAgICAgICAgIC4uLnJlcGxhY2VGaWVsZHMoZmllbGQsIGZsaWdodEl0aW5lcmFyeSkuc3BsaXQoJy4nKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkuZ2V0KCdtaW51dGUnKTtcclxuXHJcbiAgICAgICAgY29uc3QgdG90YWxUaW1lOiBudW1iZXIgPSBOdW1iZXIoXHJcbiAgICAgICAgICBgJHt2YWwudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfSR7dmFsMlxyXG4gICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAucGFkU3RhcnQoMiwgJzAnKX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gdG90YWxUaW1lID49IG1pbm1heC5taW4gJiYgdG90YWxUaW1lIDw9IG1pbm1heC5tYXg7XHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHJlcGxhY2VGaWVsZHMgPSAoXHJcbiAgICAgIGZpZWxkOiBzdHJpbmcsXHJcbiAgICAgIGZsaWdodEl0aW5lcmFyeTogRmxpZ2h0SXRpbmVyYXJ5XHJcbiAgICApOiBzdHJpbmcgPT4ge1xyXG4gICAgICByZXR1cm4gZmllbGRcclxuICAgICAgICAucmVwbGFjZSgnT1VUQk9VTkRfREVQQVJUVVJFJywgJ291dGJvdW5kRmxpZ2h0cy4wJylcclxuICAgICAgICAucmVwbGFjZShcclxuICAgICAgICAgICdPVVRCT1VORF9BUlJJVkFMJyxcclxuICAgICAgICAgICdvdXRib3VuZEZsaWdodHMuJyArIChmbGlnaHRJdGluZXJhcnkub3V0Ym91bmRGbGlnaHRzLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5yZXBsYWNlKCdJTkJPVU5EX0RFUEFSVFVSRScsICdpbmJvdW5kRmxpZ2h0cy4wJylcclxuICAgICAgICAucmVwbGFjZShcclxuICAgICAgICAgICdJTkJPVU5EX0FSUklWQUwnLFxyXG4gICAgICAgICAgJ2luYm91bmRGbGlnaHRzLicgK1xyXG4gICAgICAgICAgICAoKGZsaWdodEl0aW5lcmFyeS5pbmJvdW5kRmxpZ2h0cyB8fCBbXSkubGVuZ3RoIC0gMSlcclxuICAgICAgICApO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBpc0JldHdlZW4gPSAoXHJcbiAgICAgIG1pbm1heDogTWluTWF4LFxyXG4gICAgICBmaWVsZDogc3RyaW5nXHJcbiAgICApOiAoKGZsaWdodEl0aW5lcmFyeTogRmxpZ2h0SXRpbmVyYXJ5KSA9PiBib29sZWFuKSA9PiB7XHJcbiAgICAgIHJldHVybiAoZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnkpOiBib29sZWFuID0+IHtcclxuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmhlbHBlcnMuZnJvbU9iamVjdChcclxuICAgICAgICAgIGZsaWdodEl0aW5lcmFyeSxcclxuICAgICAgICAgIC4uLnJlcGxhY2VGaWVsZHMoZmllbGQsIGZsaWdodEl0aW5lcmFyeSkuc3BsaXQoJy4nKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHZhbCA+PSBtaW5tYXgubWluICYmIHZhbCA8PSBtaW5tYXgubWF4O1xyXG4gICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmaWVsZEhhc1ZhbHVlID0gKFxyXG4gICAgICBmaWVsZDoga2V5b2YgRmxpZ2h0Sm91cm5leVxyXG4gICAgKTogKChmbGlnaHQ6IEZsaWdodEpvdXJuZXksIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4pID0+IHtcclxuICAgICAgcmV0dXJuIChmbGlnaHQ6IEZsaWdodEpvdXJuZXksIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcclxuICAgICAgICByZXR1cm4gZmxpZ2h0W2ZpZWxkXSA9PT0gdmFsdWU7XHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8vICEgLSBPdXRib3VuZCBhbmQgSW5ib3VuZCBGaWx0ZXJzXHJcblxyXG4gICAgY29uc3Qgb3V0SXRpbmVyYXJ5VGVzdGVyczogKChcclxuICAgICAgZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnlcclxuICAgICkgPT4gYm9vbGVhbilbXSA9IFtdO1xyXG4gICAgY29uc3QgaW5JdGluZXJhcnlUZXN0ZXJzOiAoKFxyXG4gICAgICBmbGlnaHRJdGluZXJhcnk6IEZsaWdodEl0aW5lcmFyeVxyXG4gICAgKSA9PiBib29sZWFuKVtdID0gW107XHJcblxyXG4gICAgb3V0SXRpbmVyYXJ5VGVzdGVycy5wdXNoKFxyXG4gICAgICBpc1RpbWVCZXR3ZWVuKGZpbHRlcnMuYXJyaXZhbFRpbWUsICdPVVRCT1VORF9BUlJJVkFMLmRhdGVUaW1lQXJyaXZpbmcnKVxyXG4gICAgKTtcclxuICAgIG91dEl0aW5lcmFyeVRlc3RlcnMucHVzaChcclxuICAgICAgaXNUaW1lQmV0d2VlbihcclxuICAgICAgICBmaWx0ZXJzLmRlcGFydHVyZVRpbWUsXHJcbiAgICAgICAgJ09VVEJPVU5EX0RFUEFSVFVSRS5kYXRlVGltZURlcGFydGluZydcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICBvdXRJdGluZXJhcnlUZXN0ZXJzLnB1c2goaXNCZXR3ZWVuKGZpbHRlcnMucHJpY2UsICd0b3RhbC5wcmljZScpKTtcclxuXHJcbiAgICBpbkl0aW5lcmFyeVRlc3RlcnMucHVzaChcclxuICAgICAgaXNUaW1lQmV0d2VlbihcclxuICAgICAgICBmaWx0ZXJzLnJldHVybkFycml2YWxUaW1lLFxyXG4gICAgICAgICdJTkJPVU5EX0FSUklWQUwuZGF0ZVRpbWVBcnJpdmluZydcclxuICAgICAgKVxyXG4gICAgKTtcclxuICAgIGluSXRpbmVyYXJ5VGVzdGVycy5wdXNoKFxyXG4gICAgICBpc1RpbWVCZXR3ZWVuKFxyXG4gICAgICAgIGZpbHRlcnMucmV0dXJuRGVwYXJ0dXJlVGltZSxcclxuICAgICAgICAnSU5CT1VORF9ERVBBUlRVUkUuZGF0ZVRpbWVEZXBhcnRpbmcnXHJcbiAgICAgIClcclxuICAgICk7XHJcblxyXG4gICAgLy8gISAtIFRlc3RlcnNcclxuICAgIGNvbnN0IG91dEpvdXJuZXlUZXN0ZXJzOiAoKFxyXG4gICAgICBmbGlnaHRJdGluZXJhcnk6IEZsaWdodEl0aW5lcmFyeSB8IEZsaWdodEpvdXJuZXlcclxuICAgICkgPT4gYm9vbGVhbilbXSA9IFtdO1xyXG5cclxuICAgIG91dEpvdXJuZXlUZXN0ZXJzLnB1c2goXHJcbiAgICAgIHRlc3RlcihmaWx0ZXJzLmNsYXNzZXMsIGZpZWxkSGFzVmFsdWUoJ2NhYmluQ2xhc3MnKSlcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgaW5Kb3VybmV5VGVzdGVyczogKChcclxuICAgICAgZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnkgfCBGbGlnaHRKb3VybmV5XHJcbiAgICApID0+IGJvb2xlYW4pW10gPSBbXTtcclxuXHJcbiAgICBpbkpvdXJuZXlUZXN0ZXJzLnB1c2godGVzdGVyKGZpbHRlcnMuY2xhc3NlcywgZmllbGRIYXNWYWx1ZSgnY2FiaW5DbGFzcycpKSk7XHJcblxyXG4gICAgLy8gIS0gSXRpbmVyYXJpZXNcclxuICAgIGNvbnN0IG91dEZpbHRlckl0aW5lcmFyaWVzID0gKFxyXG4gICAgICBmbGlnaHRJdGluZXJhcnk6IEZsaWdodEl0aW5lcmFyeSxcclxuICAgICAgZ3JvdXBJbmRleDogbnVtYmVyXHJcbiAgICApOiBib29sZWFuID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBvdXRJdGluZXJhcnlUZXN0ZXJzLnJlZHVjZShcclxuICAgICAgICAgIChcclxuICAgICAgICAgICAgYWNjOiBib29sZWFuLFxyXG4gICAgICAgICAgICB0ZXN0ZXIxOiAoZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnkpID0+IGJvb2xlYW5cclxuICAgICAgICAgICkgPT4ge1xyXG4gICAgICAgICAgICBhY2MgPSBhY2MgJiYgdGVzdGVyMShmbGlnaHRJdGluZXJhcnkpO1xyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApICYmXHJcbiAgICAgICAgKCFmbGlnaHRJdGluZXJhcnkub3V0Ym91bmRGbGlnaHRzIHx8XHJcbiAgICAgICAgICAhIShmbGlnaHRJdGluZXJhcnkub3V0Ym91bmRGbGlnaHRzIHx8IFtdKS5maW5kKFxyXG4gICAgICAgICAgICAoZmxpZ2h0Sm91cm5leTogRmxpZ2h0Sm91cm5leSk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiAhIW91dEpvdXJuZXlUZXN0ZXJzLnJlZHVjZShcclxuICAgICAgICAgICAgICAgIChcclxuICAgICAgICAgICAgICAgICAgYWNjOiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICB0ZXN0ZXIyOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnkgfCBGbGlnaHRKb3VybmV5XHJcbiAgICAgICAgICAgICAgICAgICkgPT4gYm9vbGVhblxyXG4gICAgICAgICAgICAgICAgKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBhY2MgJiYgdGVzdGVyMihmbGlnaHRKb3VybmV5KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0cnVlXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKSlcclxuICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaW5GaWx0ZXJJdGluZXJhcmllcyA9IChcclxuICAgICAgZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnksXHJcbiAgICAgIGdyb3VwSW5kZXg6IG51bWJlclxyXG4gICAgKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgaW5JdGluZXJhcnlUZXN0ZXJzLnJlZHVjZShcclxuICAgICAgICAgIChcclxuICAgICAgICAgICAgYWNjOiBib29sZWFuLFxyXG4gICAgICAgICAgICB0ZXN0ZXIxOiAoZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnkpID0+IGJvb2xlYW5cclxuICAgICAgICAgICkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWNjICYmIHRlc3RlcjEoZmxpZ2h0SXRpbmVyYXJ5KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0cnVlXHJcbiAgICAgICAgKSAmJlxyXG4gICAgICAgICghZmxpZ2h0SXRpbmVyYXJ5LmluYm91bmRGbGlnaHRzPy5sZW5ndGggfHxcclxuICAgICAgICAgICEhKGZsaWdodEl0aW5lcmFyeS5pbmJvdW5kRmxpZ2h0cyB8fCBbXSkuZmluZChcclxuICAgICAgICAgICAgKGZsaWdodEpvdXJuZXk6IEZsaWdodEpvdXJuZXkpOiBib29sZWFuID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gISFpbkpvdXJuZXlUZXN0ZXJzLnJlZHVjZShcclxuICAgICAgICAgICAgICAgIChcclxuICAgICAgICAgICAgICAgICAgYWNjOiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICB0ZXN0ZXIyOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZmxpZ2h0SXRpbmVyYXJ5OiBGbGlnaHRJdGluZXJhcnkgfCBGbGlnaHRKb3VybmV5XHJcbiAgICAgICAgICAgICAgICAgICkgPT4gYm9vbGVhblxyXG4gICAgICAgICAgICAgICAgKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBhY2MgJiYgdGVzdGVyMihmbGlnaHRKb3VybmV5KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0cnVlXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKSlcclxuICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gbm93IGZpbmFsbHkgcGVyZm9ybSB0aGUgZmlsdGVyaW5nIGFuZCBnbyBvdmVyIHRoZSByZXN1bHRzXHJcbiAgICAvLyBUT0RPIC0gYWRkIHRoZSBhZGRpdGlvbmFsIHN0dWZmIG5lZWRlZCBmb3IgR3JvdXBlZEZsaWdodHMgKExpZ2h0bmluZylcclxuXHJcbiAgICBjb25zdCBmdWxsUmVzdWx0c0Nsb25lID0gPGFueT50aGlzLmhlbHBlcnMuY2xvbmUodGhpcy5mdWxsUmVzdWx0cyk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdWxsUmVzdWx0c0Nsb25lLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGZ1bGxSZXN1bHQgPSBmdWxsUmVzdWx0c0Nsb25lW2ldO1xyXG4gICAgICBmdWxsUmVzdWx0LmpvdXJuZXlzID0gZnVsbFJlc3VsdC5qb3VybmV5cy5maWx0ZXIob3V0RmlsdGVySXRpbmVyYXJpZXMpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaXNSZXR1cm4pIHtcclxuICAgICAgICBmdWxsUmVzdWx0LmpvdXJuZXlzID0gZnVsbFJlc3VsdC5qb3VybmV5cy5maWx0ZXIoaW5GaWx0ZXJJdGluZXJhcmllcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bGxSZXN1bHQuam91cm5leXMgPSBmdWxsUmVzdWx0LmpvdXJuZXlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KGZ1bGxSZXN1bHRzQ2xvbmUpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2VsZWN0R3JvdXBlZEV1cm9zdGFyKFxyXG4gICAgc2VsZWN0ZWRFdXJvc3RhcjogRXVyb3N0YXJJdGVtLFxyXG4gICAgZmFyZTogRXVyb3N0YXJGYXJlLFxyXG4gICAgZGlyZWN0aW9uOiBGbGlnaHREaXJlY3Rpb25FbnVtXHJcbiAgKSB7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIC8vIG9uZSB3YXkgZWFzeVxyXG4gICAgaWYgKFxyXG4gICAgICBiYXNrZXQgJiZcclxuICAgICAgdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2guY2hvc2VuU2VhcmNoVHlwZSA9PT0gRXVyb3N0YXJTZWFyY2hUeXBlLm9uZVdheSAmJlxyXG4gICAgICBkaXJlY3Rpb24gPT09IEZsaWdodERpcmVjdGlvbkVudW0uT3V0Ym91bmRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmRvQm9va2luZyhcclxuICAgICAgICBpbnRCYXNrZXQsXHJcbiAgICAgICAgc2VsZWN0ZWRFdXJvc3RhcixcclxuICAgICAgICB7XHJcbiAgICAgICAgICBvdXRib3VuZEZsaWdodHM6IFt0aGlzLm1ha2VTY2hlbWFGbGlnaHRzKGZhcmUuZmFyZSwgJ291dGJvdW5kJywgMCldLFxyXG4gICAgICAgICAgaW5ib3VuZEZsaWdodHM6IFtdLFxyXG4gICAgICAgICAgam91cm5leVR5cGU6ICdzaW5nbGUnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZWxlY3RlZEV1cm9zdGFyLmRhdGVEZXBhcnR1cmUsXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICBmYXJlLnByaWNlXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIHJldHVybiBsb2dpYyBuZWVkcyB1cGRhdGluZyAtIGVpdGhlciBhY2NlcHQgb3V0Ym91bmQgb3IgcmV0dXJuIGFuZCBzb21laG93IGRpc3RpZ3Vpc2ggdGhlbVxyXG4gICAgaWYgKFxyXG4gICAgICBiYXNrZXQgJiZcclxuICAgICAgdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2guY2hvc2VuU2VhcmNoVHlwZSA9PT0gRXVyb3N0YXJTZWFyY2hUeXBlLnJldHVyblxyXG4gICAgKSB7XHJcbiAgICAgIC8vIGNsaWNrZWQgb24gYW4gb3V0Ym91bmQgZXVyb3N0YXJcclxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gRmxpZ2h0RGlyZWN0aW9uRW51bS5PdXRib3VuZCkge1xyXG4gICAgICAgIC8vIGdpdmVuIHRoZSBvdXRib3VuZCBidXQgd2UgYWxyZWFkeSBoYXZlIGluYm91bmQgc2VsZWN0ZWRcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkR3JvdXBFdXJvc3Rhcj8uZGlyZWN0aW9uID09PSBGbGlnaHREaXJlY3Rpb25FbnVtLkluYm91bmRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIC8vIExVIGxvZ2ljIHNob3dzIHRoZSBiaWdnZXN0IHByaWNlIGFjcm9zcyBvdXRib3VuZCBhbmQgcmV0dXJuXHJcbiAgICAgICAgICBjb25zdCBwcmljZSA9XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFdXJvc3RhckZhcmUuaXRlbS5wcmljZSA+IGZhcmUucHJpY2VcclxuICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWRFdXJvc3RhckZhcmUuaXRlbS5wcmljZVxyXG4gICAgICAgICAgICAgIDogZmFyZS5wcmljZTtcclxuICAgICAgICAgIHRoaXMuZG9Cb29raW5nKFxyXG4gICAgICAgICAgICBpbnRCYXNrZXQsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkRXVyb3N0YXIsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBpbmJvdW5kRmxpZ2h0czogW1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlU2NoZW1hRmxpZ2h0cyhcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV1cm9zdGFyRmFyZS5pdGVtLmZhcmUsXHJcbiAgICAgICAgICAgICAgICAgICdpbmJvdW5kJyxcclxuICAgICAgICAgICAgICAgICAgMFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgb3V0Ym91bmRGbGlnaHRzOiBbXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VTY2hlbWFGbGlnaHRzKGZhcmUuZmFyZSwgJ291dGJvdW5kJywgMClcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIGpvdXJuZXlUeXBlOiAncm91bmR0cmlwJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZWxlY3RlZEV1cm9zdGFyLmRhdGVEZXBhcnR1cmUsXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cEV1cm9zdGFyLml0ZW0uZGF0ZUFycml2YWwsXHJcbiAgICAgICAgICAgIHByaWNlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkRmFyZXMoKTtcclxuICAgICAgICAgIHRoaXMuYmFza2V0U2VydmljZS50b2dnbGVNZW51KCk7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdHMubmV4dChcclxuICAgICAgICAgICAgKHRoaXMuZnVsbFJlc3VsdHMgYXMgRXVyb3N0YXJSZXN1bHRzW10pLm1hcChcclxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkRmxhZ3NcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwRXVyb3N0YXI/LmRpcmVjdGlvbiA9PT0gRmxpZ2h0RGlyZWN0aW9uRW51bS5PdXRib3VuZFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkRmFyZXMoKTtcclxuICAgICAgICAgIC8vIHdlIGhhdmUgYW4gb3V0Ym91bmQgYWxyZWFkeSBzZWxlY3RlZCAtIGRlc2VsZWN0IGl0XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdHMubmV4dCh0aGlzLmZ1bGxSZXN1bHRzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gd2UgZG9udCBoYXZlIGFuIGluYm91bmQgc2VsZWN0ZWRcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cEV1cm9zdGFyID0ge1xyXG4gICAgICAgICAgICBpdGVtOiBzZWxlY3RlZEV1cm9zdGFyLFxyXG4gICAgICAgICAgICBkaXJlY3Rpb25cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRXVyb3N0YXJGYXJlID0ge1xyXG4gICAgICAgICAgICBpdGVtOiBmYXJlLFxyXG4gICAgICAgICAgICBkaXJlY3Rpb25cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGVkRXVyb3N0YXIudWlkO1xyXG4gICAgICAgICAgLy8gZmlsdGVyIG9uIG91dGJvdW5kcyBhcyB3ZSBoYXZlIHNlbGVjdGVkIGFuZCBhZGRlZCBhbiBvdXRib3VuZFxyXG4gICAgICAgICAgdGhpcy5yZXN1bHRzLm5leHQoXHJcbiAgICAgICAgICAgICh0aGlzLmZ1bGxSZXN1bHRzIGFzIEV1cm9zdGFyUmVzdWx0c1tdKS5tYXAoXHJcbiAgICAgICAgICAgICAgKHJlc3VsdDogRXVyb3N0YXJSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRib3VuZCA9IHJlc3VsdC5vdXRib3VuZC5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgIChpdGVtOiBFdXJvc3Rhckl0ZW0pID0+IGluZGV4ID09PSBpdGVtLnVpZFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGluYm91bmQ6IHJlc3VsdC5pbmJvdW5kLCBvdXRib3VuZCB9O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSBGbGlnaHREaXJlY3Rpb25FbnVtLkluYm91bmQpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkR3JvdXBFdXJvc3Rhcj8uZGlyZWN0aW9uID09PSBGbGlnaHREaXJlY3Rpb25FbnVtLk91dGJvdW5kXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAvLyBlc3NlbnRpYWxseSBhZGQgYXMgd2UgZGlkIGJlZm9yZVxyXG4gICAgICAgICAgY29uc3QgcHJpY2UgPVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRXVyb3N0YXJGYXJlLml0ZW0ucHJpY2UgPiBmYXJlLnByaWNlXHJcbiAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRXVyb3N0YXJGYXJlLml0ZW0ucHJpY2VcclxuICAgICAgICAgICAgICA6IGZhcmUucHJpY2U7XHJcbiAgICAgICAgICB0aGlzLmRvQm9va2luZyhcclxuICAgICAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgICAgICBzZWxlY3RlZEV1cm9zdGFyLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgb3V0Ym91bmRGbGlnaHRzOiBbXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VTY2hlbWFGbGlnaHRzKFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRXVyb3N0YXJGYXJlLml0ZW0uZmFyZSxcclxuICAgICAgICAgICAgICAgICAgJ291dGJvdW5kJyxcclxuICAgICAgICAgICAgICAgICAgMFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgaW5ib3VuZEZsaWdodHM6IFt0aGlzLm1ha2VTY2hlbWFGbGlnaHRzKGZhcmUuZmFyZSwgJ2luYm91bmQnLCAwKV0sXHJcbiAgICAgICAgICAgICAgam91cm5leVR5cGU6ICdyb3VuZHRyaXAnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNlbGVjdGVkRXVyb3N0YXIuZGF0ZURlcGFydHVyZSxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwRXVyb3N0YXIuaXRlbS5kYXRlQXJyaXZhbCxcclxuICAgICAgICAgICAgcHJpY2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRGYXJlcygpO1xyXG4gICAgICAgICAgdGhpcy5iYXNrZXRTZXJ2aWNlLnRvZ2dsZU1lbnUoKTtcclxuICAgICAgICAgIHRoaXMucmVzdWx0cy5uZXh0KFxyXG4gICAgICAgICAgICAodGhpcy5mdWxsUmVzdWx0cyBhcyBFdXJvc3RhclJlc3VsdHNbXSkubWFwKFxyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRGbGFnc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkR3JvdXBFdXJvc3Rhcj8uZGlyZWN0aW9uID09PSBGbGlnaHREaXJlY3Rpb25FbnVtLkluYm91bmRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMucmVzZXRTZWxlY3RlZEZhcmVzKCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5yZXN1bHRzLm5leHQodGhpcy5mdWxsUmVzdWx0cyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cEV1cm9zdGFyID0ge1xyXG4gICAgICAgICAgICBpdGVtOiBzZWxlY3RlZEV1cm9zdGFyLFxyXG4gICAgICAgICAgICBkaXJlY3Rpb25cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRXVyb3N0YXJGYXJlID0ge1xyXG4gICAgICAgICAgICBpdGVtOiBmYXJlLFxyXG4gICAgICAgICAgICBkaXJlY3Rpb25cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGVkRXVyb3N0YXIudWlkO1xyXG4gICAgICAgICAgLy8gZmlsdGVyIG9uIG91dGJvdW5kcyBhcyB3ZSBoYXZlIHNlbGVjdGVkIGFuZCBhZGRlZCBhbiBvdXRib3VuZFxyXG4gICAgICAgICAgdGhpcy5yZXN1bHRzLm5leHQoXHJcbiAgICAgICAgICAgICh0aGlzLmZ1bGxSZXN1bHRzIGFzIEV1cm9zdGFyUmVzdWx0c1tdKS5tYXAoXHJcbiAgICAgICAgICAgICAgKHJlc3VsdDogRXVyb3N0YXJSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmJvdW5kID0gcmVzdWx0LmluYm91bmQuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAoaXRlbTogRXVyb3N0YXJJdGVtKSA9PiBpbmRleCA9PT0gaXRlbS51aWRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBpbmJvdW5kLCBvdXRib3VuZDogcmVzdWx0Lm91dGJvdW5kIH07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXNldFNlbGVjdGVkRmFyZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkR3JvdXBFdXJvc3RhciA9IHtcclxuICAgICAgZGlyZWN0aW9uOiBudWxsLFxyXG4gICAgICBpdGVtOiBudWxsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zZWxlY3RlZEV1cm9zdGFyRmFyZSA9IHtcclxuICAgICAgZGlyZWN0aW9uOiBudWxsLFxyXG4gICAgICBpdGVtOiBudWxsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU2VsZWN0ZWRGbGFncyhyZXN1bHQ6IEV1cm9zdGFyUmVzdWx0cyk6IEV1cm9zdGFyUmVzdWx0cyB7XHJcbiAgICBjb25zdCBpbmJvdW5kID0gcmVzdWx0LmluYm91bmQubWFwKChpdGVtOiBFdXJvc3Rhckl0ZW0pID0+IHtcclxuICAgICAgaXRlbS5zdGFuZGFyZFByZW1pZXJGYXJlLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgIGl0ZW0uc3RhbmRhcmRGYXJlLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgIGl0ZW0uYnVzaW5lc3NQcmVtaWVyRmFyZS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0pO1xyXG4gICAgY29uc3Qgb3V0Ym91bmQgPSByZXN1bHQub3V0Ym91bmQubWFwKChpdGVtOiBFdXJvc3Rhckl0ZW0pID0+IHtcclxuICAgICAgaXRlbS5zdGFuZGFyZFByZW1pZXJGYXJlLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgIGl0ZW0uc3RhbmRhcmRGYXJlLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgIGl0ZW0uYnVzaW5lc3NQcmVtaWVyRmFyZS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHsgaW5ib3VuZCwgb3V0Ym91bmQgfTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHM6IEV1cm9zdGFyUXVvdGVSZXN1bHRBcnJheSk6IElDaGVhcGVzdFByaWNlIHtcclxuICAgIGlmICghcmVzdWx0cy5sZW5ndGggfHwgdGhpcy5zZWFyY2hTZXJ2aWNlLmlzRmxpZ2h0c0dyb3VwZWQoKSkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0c1swXSBhcyBFdXJvc3RhclF1b3RlUmVzdWx0O1xyXG4gICAgY29uc3Qgam91cm5leXMgPSByZXN1bHQuam91cm5leXM7XHJcbiAgICBpZiAoIWpvdXJuZXlzLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgY29uc3QgY3VycmVuY3kgPSBqb3VybmV5c1swXS50b3RhbC5jdXJyZW5jeTtcclxuICAgIHJldHVybiBqb3VybmV5cy5yZWR1Y2UoXHJcbiAgICAgIChjaGVhcGVzdFByaWNlOiBJQ2hlYXBlc3RQcmljZSwgcmVzdWx0OiBGbGlnaHRJdGluZXJhcnkpID0+IHtcclxuICAgICAgICBjb25zdCBwcmljZSA9IHJlc3VsdC50b3RhbC5wcmljZTtcclxuICAgICAgICBpZiAoY2hlYXBlc3RQcmljZS5hbW91bnQgPiBwcmljZSkgY2hlYXBlc3RQcmljZS5hbW91bnQgPSBwcmljZTtcclxuICAgICAgICByZXR1cm4gY2hlYXBlc3RQcmljZTtcclxuICAgICAgfSxcclxuICAgICAgeyBhbW91bnQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBjdXJyZW5jeUNvZGU6IGN1cnJlbmN5IH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGRvQm9va2luZyhcclxuICAgIGludEJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UsXHJcbiAgICBzZWxlY3RlZEZsaWdodDogRXVyb3N0YXJJdGVtLFxyXG4gICAgc2NoZW1hRGV0YWlsczogYW55LFxyXG4gICAgb3V0Ym91bmREYXRlOiBzdHJpbmcsXHJcbiAgICBpbmJvdW5kRGF0ZTogc3RyaW5nLFxyXG4gICAgcHJpY2U6IG51bWJlclxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBzb3VyY2VJZCwgY28yUGVySXRlbSwgY28yUGVyUGFzc2VuZ2VyLCB0b3RhbCB9ID0gc2VsZWN0ZWRGbGlnaHQ7XHJcbiAgICBjb25zdCBib29raW5nOiBBZGRJdGVtVG9CYXNrZXRNdXRhdGlvblZhcmlhYmxlcyA9IHtcclxuICAgICAgYWR1bHRzOiB0aGlzLmFkdWx0cyxcclxuICAgICAgYmFza2V0OiBpbnRCYXNrZXQuaWQsXHJcbiAgICAgIGNoaWxkcmVuOiB0aGlzLmNoaWxkcmVuLFxyXG4gICAgICBjbzJQZXJJdGVtLFxyXG4gICAgICBjbzJQZXJQYXNzZW5nZXIsXHJcbiAgICAgIGN1cnJlbmN5OiB0b3RhbC5jdXJyZW5jeSBhcyBDdXJyZW5jeUNvZGUsXHJcbiAgICAgIGRldGFpbDogc2NoZW1hRGV0YWlscyxcclxuICAgICAgcHJpY2UsXHJcbiAgICAgIHNlYXJjaFF1ZXJ5OiB0aGlzLnJlc3VsdFF1ZXJ5LFxyXG4gICAgICBzZXJ2aWNlOiBzb3VyY2VJZC50b1N0cmluZygpLFxyXG4gICAgICBvdXRib3VuZERhdGVcclxuICAgIH07XHJcbiAgICBpZiAoaW5ib3VuZERhdGUpIHtcclxuICAgICAgYm9va2luZy5pbmJvdW5kRGF0ZSA9IGluYm91bmREYXRlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICBib29raW5nLFxyXG4gICAgICBpbnRCYXNrZXQsXHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgdGhpcy50cmF2ZWxsZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbWFrZVNjaGVtYUZsaWdodHMoXHJcbiAgICBzZWxlY3RlZEZsaWdodDogRmxpZ2h0Sm91cm5leSxcclxuICAgIGZsaWdodEdyb3VwOiAnb3V0Ym91bmQnIHwgJ2luYm91bmQnLFxyXG4gICAgZ3JvdXBJbmRleDogbnVtYmVyLFxyXG4gICAgc2VnbWVudEluZGV4PzogbnVtYmVyXHJcbiAgKTogYW55IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLnNlbGVjdGVkRmxpZ2h0LFxyXG4gICAgICBqb3VybmV5SW5mbzoge1xyXG4gICAgICAgIGZsaWdodEdyb3VwLFxyXG4gICAgICAgIGdyb3VwSW5kZXgsXHJcbiAgICAgICAgc2VnbWVudEluZGV4XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUdyb3VwZWRJdGVtKFxyXG4gICAgcmV0dXJuT2JqZWN0OiBFdXJvc3Rhckdyb3VwZWRRdW90ZVJlc3VsdCxcclxuICAgIHNvdXJjZTogc3RyaW5nLFxyXG4gICAgb3V0Ym91bmRGbGlnaHRzOiBGbGlnaHRKb3VybmV5W10sXHJcbiAgICBvdXRib3VuZFRvdGFsRHVyYXRpb246IG51bWJlcixcclxuICAgIGluYm91bmRGbGlnaHRzOiBGbGlnaHRKb3VybmV5W10sXHJcbiAgICBpbmJvdW5kVG90YWxEdXJhdGlvbjogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAob3V0Ym91bmRGbGlnaHRzPy5sZW5ndGggJiYgIXJldHVybk9iamVjdC5kZXBhcnREYXRlVGltZSkge1xyXG4gICAgICBjb25zdCBmaXJzdCA9IG91dGJvdW5kRmxpZ2h0c1swXTtcclxuICAgICAgY29uc3QgbGFzdCA9IG91dGJvdW5kRmxpZ2h0c1tvdXRib3VuZEZsaWdodHMubGVuZ3RoIC0gMV07XHJcbiAgICAgIHJldHVybk9iamVjdC5vcmlnaW5BaXJwb3J0ID0gZmlyc3Qub3JpZ2luQWlycG9ydDtcclxuICAgICAgcmV0dXJuT2JqZWN0Lm9yaWdpbkFpcnBvcnROYW1lID0gZmlyc3Qub3JpZ2luQWlycG9ydE5hbWU7XHJcbiAgICAgIHJldHVybk9iamVjdC5kZXN0aW5hdGlvbkFpcnBvcnQgPSBsYXN0LmRlc3RpbmF0aW9uQWlycG9ydDtcclxuICAgICAgcmV0dXJuT2JqZWN0LmRlc3RpbmF0aW9uQWlycG9ydE5hbWUgPSBsYXN0LmRlc3RpbmF0aW9uQWlycG9ydE5hbWU7XHJcbiAgICAgIHJldHVybk9iamVjdC5kZXBhcnREYXRlVGltZSA9IGZpcnN0LmRhdGVUaW1lRGVwYXJ0aW5nO1xyXG4gICAgICByZXR1cm5PYmplY3QuYXJyaXZhbERhdGVUaW1lID0gbGFzdC5kYXRlVGltZUFycml2aW5nO1xyXG4gICAgICByZXR1cm5PYmplY3Qub3V0Ym91bmRUb3RhbER1cmF0aW9uID0gb3V0Ym91bmRUb3RhbER1cmF0aW9uO1xyXG4gICAgICByZXR1cm5PYmplY3QuZGF0YVNvdXJjZSA9IHNvdXJjZTtcclxuICAgICAgcmV0dXJuT2JqZWN0Lm9wZXJhdG9yID0gZmlyc3Qub3BlcmF0aW5nQ2FycmllcjtcclxuICAgICAgcmV0dXJuT2JqZWN0Lm9wZXJhdG9yRnVsbCA9IGZpcnN0Lm9wZXJhdGluZ0NhcnJpZXJOYW1lO1xyXG4gICAgICByZXR1cm5PYmplY3Qub3V0bGVnc0NvdW50ID0gb3V0Ym91bmRGbGlnaHRzLmxlbmd0aDtcclxuICAgICAgcmV0dXJuT2JqZWN0Lm91dGxlZ3MgPSBvdXRib3VuZEZsaWdodHM7XHJcbiAgICAgIHJldHVybk9iamVjdC5vdXRib3VuZEZsaWdodE51bWJlciA9XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmpvaW5Gcm9tQXR0cmlidXRlPEZsaWdodEpvdXJuZXk+KFxyXG4gICAgICAgICAgJy0nLFxyXG4gICAgICAgICAgJ29wZXJhdGluZ0ZsaWdodE51bWJlcicsXHJcbiAgICAgICAgICBvdXRib3VuZEZsaWdodHNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuT2JqZWN0LmlzUmV0dXJuID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGluYm91bmRGbGlnaHRzPy5sZW5ndGggJiYgIXJldHVybk9iamVjdC5pbmJvdW5kVG90YWxEdXJhdGlvbikge1xyXG4gICAgICByZXR1cm5PYmplY3QuaW5ib3VuZFRvdGFsRHVyYXRpb24gPSBpbmJvdW5kVG90YWxEdXJhdGlvbjtcclxuICAgICAgcmV0dXJuT2JqZWN0LmlubGVnc0NvdW50ID0gaW5ib3VuZEZsaWdodHMubGVuZ3RoO1xyXG4gICAgICByZXR1cm5PYmplY3QuaW5sZWdzID0gaW5ib3VuZEZsaWdodHM7XHJcbiAgICAgIHJldHVybk9iamVjdC5pbmJvdW5kRmxpZ2h0TnVtYmVyID1cclxuICAgICAgICB0aGlzLmhlbHBlcnMuam9pbkZyb21BdHRyaWJ1dGU8RmxpZ2h0Sm91cm5leT4oXHJcbiAgICAgICAgICAnLScsXHJcbiAgICAgICAgICAnb3BlcmF0aW5nRmxpZ2h0TnVtYmVyJyxcclxuICAgICAgICAgIGluYm91bmRGbGlnaHRzXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybk9iamVjdC5pc1JldHVybiA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbWFrZVNlc3Npb25SZXN1bHRzKFxyXG4gICAgZGF0YTogRXVyb3N0YXJRdW90ZVJlc3VsdEFycmF5XHJcbiAgKTogRXVyb3N0YXJTZXNzaW9uVHlwZSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXN1bHRzOiBbXSxcclxuICAgICAgZ3JvdXBEYXRhOiBbXSxcclxuICAgICAgZ3JvdXBlZDogW10sXHJcbiAgICAgIHF1ZXJ5OiB0aGlzLnJlc3VsdFF1ZXJ5XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TWluRmxpZ2h0UHJpY2VGb3JCcmFuZChtYXRjaGluZ0JyYW5kRmxpZ2h0czogRmxpZ2h0SXRpbmVyYXJ5W10pOiBudW1iZXIge1xyXG4gICAgbGV0IG1pbiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xyXG4gICAgbWF0Y2hpbmdCcmFuZEZsaWdodHMuZm9yRWFjaCgoZmxpZ2h0KSA9PiB7XHJcbiAgICAgIGlmIChtaW4gPiBmbGlnaHQ/LnRvdGFsPy5wcmljZSkge1xyXG4gICAgICAgIG1pbiA9IGZsaWdodC50b3RhbC5wcmljZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbWluO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4RmxpZ2h0UHJpY2VGb3JCcmFuZChtYXRjaGluZ0JyYW5kRmxpZ2h0czogRmxpZ2h0SXRpbmVyYXJ5W10pOiBudW1iZXIge1xyXG4gICAgbGV0IG1heCA9IDA7XHJcbiAgICBtYXRjaGluZ0JyYW5kRmxpZ2h0cy5mb3JFYWNoKChmbGlnaHQpID0+IHtcclxuICAgICAgaWYgKG1heCA8IGZsaWdodD8udG90YWw/LnByaWNlKSB7XHJcbiAgICAgICAgbWF4ID0gZmxpZ2h0LnRvdGFsLnByaWNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBtYXg7XHJcbiAgfVxyXG5cclxuICBpc092ZXJOaWdodCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG91dHdhcmREYXkgPSB0aGlzLm91dEJvdW5kRGF0ZS5kYXRlKCk7XHJcbiAgICBjb25zdCByZXR1cm5EYXkgPSB0aGlzLmluYm91bmREYXRlLmRhdGUoKTtcclxuICAgIGlmIChyZXR1cm5EYXkgLSBvdXR3YXJkRGF5ID49IDEpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBtaW5Ub0hvdXIgPSAoZHVyOiBudW1iZXIpOiBzdHJpbmcgPT4gYCR7TWF0aC5mbG9vcihkdXIgLyA2MCl9aCAke2R1ciAlIDYwfW1gO1xyXG5cclxuICBhc3luYyBhZGRFdXJvc3RhckpvdXJuZXlzVG9CYXNrZXQoXHJcbiAgICBldXJvc3RhclF1b3RlOiBGbGlnaHRJdGluZXJhcnlXaXRoRXh0ZW5zaW9uc1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGV1cm9zdGFyUXVvdGUudW5hdmFpbGFibGUpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgY29uc3QgeyBzb3VyY2VJZCwgY28yUGVySXRlbSwgY28yUGVyUGFzc2VuZ2VyLCB0b3RhbCB9ID0gZXVyb3N0YXJRdW90ZTtcclxuICAgICAgY29uc3Qgb3V0Ym91bmREYXRlOiBhbnkgPSBtb21lbnQoXHJcbiAgICAgICAgZXVyb3N0YXJRdW90ZS5vdXRib3VuZEZsaWdodHNbMF0uZGF0ZVRpbWVEZXBhcnRpbmdcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgaW5ib3VuZERhdGU6IGFueSA9IGV1cm9zdGFyUXVvdGUuaW5ib3VuZEZsaWdodHMubGVuZ3RoXHJcbiAgICAgICAgPyBtb21lbnQoZXVyb3N0YXJRdW90ZS5pbmJvdW5kRmxpZ2h0c1swXS5kYXRlVGltZURlcGFydGluZylcclxuICAgICAgICA6IG51bGw7XHJcbiAgICAgIGNvbnN0IHRlcm1zQW5kQ29uZGl0aW9ucyA9IHRoaXMuZ2V0VGVybXNBbmRDb25kKGV1cm9zdGFyUXVvdGUpO1xyXG4gICAgICBjb25zdCBzY2hlbWFEZXRhaWxzID0ge1xyXG4gICAgICAgIG91dGJvdW5kRmxpZ2h0czogW1xyXG4gICAgICAgICAgLi4uZXVyb3N0YXJRdW90ZS5vdXRib3VuZEZsaWdodHMubWFwKFxyXG4gICAgICAgICAgICAoZmxpZ2h0OiBGbGlnaHRKb3VybmV5LCBzZWdtZW50SW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgICAgICAgICB0aGlzLm1ha2VTY2hlbWFGbGlnaHRzKGZsaWdodCwgJ291dGJvdW5kJywgMCwgc2VnbWVudEluZGV4KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgaW5ib3VuZEZsaWdodHM6IFtcclxuICAgICAgICAgIC4uLmV1cm9zdGFyUXVvdGUuaW5ib3VuZEZsaWdodHMubWFwKFxyXG4gICAgICAgICAgICAoZmxpZ2h0OiBGbGlnaHRKb3VybmV5LCBzZWdtZW50SW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgICAgICAgICB0aGlzLm1ha2VTY2hlbWFGbGlnaHRzKGZsaWdodCwgJ2luYm91bmQnLCAwLCBzZWdtZW50SW5kZXgpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgXSxcclxuICAgICAgICB0ZXJtc0FuZENvbmQ6IHRlcm1zQW5kQ29uZGl0aW9ucyxcclxuICAgICAgICBqb3VybmV5VHlwZTogJ3NpbmdsZSdcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgYm9va2luZzogQWRkSXRlbVRvQmFza2V0TXV0YXRpb25WYXJpYWJsZXMgPSB7XHJcbiAgICAgICAgYWR1bHRzOiB0aGlzLmFkdWx0cyxcclxuICAgICAgICBiYXNrZXQ6IGludEJhc2tldC5pZCxcclxuICAgICAgICBjaGlsZHJlbjogdGhpcy5jaGlsZHJlbixcclxuICAgICAgICBjbzJQZXJJdGVtLFxyXG4gICAgICAgIGNvMlBlclBhc3NlbmdlcixcclxuICAgICAgICBjdXJyZW5jeTogdG90YWwuY3VycmVuY3kgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgICAgIGRldGFpbDogc2NoZW1hRGV0YWlscyxcclxuICAgICAgICBwcmljZTogdG90YWwucHJpY2UsXHJcbiAgICAgICAgc2VhcmNoUXVlcnk6IHRoaXMucmVzdWx0UXVlcnksXHJcbiAgICAgICAgc2VydmljZTogc291cmNlSWQudG9TdHJpbmcoKSxcclxuICAgICAgICBvdXRib3VuZERhdGU6IG91dGJvdW5kRGF0ZS5mb3JtYXQoKVxyXG4gICAgICB9O1xyXG4gICAgICBpZiAoaW5ib3VuZERhdGUpIHtcclxuICAgICAgICBib29raW5nLmluYm91bmREYXRlID0gaW5ib3VuZERhdGUuZm9ybWF0KCk7XHJcbiAgICAgICAgc2NoZW1hRGV0YWlscy5qb3VybmV5VHlwZSA9ICdyb3VuZHRyaXAnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICAgIGJvb2tpbmcsXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgICB0aGlzLnRyYXZlbGxlcnNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOyAvLyBUT0RPIHNob3VsZCB0aGlzIHRocm93IGFuIGVycm9yP1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyB3YWl0aW5nIGZvciBkYXRhXHJcbiAgZ2V0VGVybXNBbmRDb25kKGV1cm9zdGFyUXVvdGU6IEZsaWdodEl0aW5lcmFyeVdpdGhFeHRlbnNpb25zKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1BlbmFsdGllcycsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnRWxpZ2liaWxpdHknLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICAsXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnRGF5L3RpbWUnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1NlYXNvbmFsaXR5JyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdGbGlnaHTCoEFwcGxpY2F0aW9uJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdBZHZhbmNlwqBSZXNlcnZhdGlvbnMvdGlja2V0aW5nJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdNYXhpbXVtwqBTdGF5JyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdNaW5pbXVtwqBTdGF5JyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdTdG9wb3ZlcnMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1RyYW5zZmVycycsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnQ29tYmluYXRpb25zJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdCbGFja291dMKgRGF0ZXMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1N1cmNoYXJnZXMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0FjY29tcGFuaWVkwqBUcmF2ZWwnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1RyYXZlbMKgUmVzdHJpY3Rpb25zJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdTYWxlc8KgUmVzdHJpY3Rpb25zJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdIaXAvbWlsZWFnZcKgRXhjZXB0aW9ucycsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnVGlja2V0wqBFbmRvcnNlbWVudHMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0NoaWxkcmVuwqBEaXNjb3VudHMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1RvdXLCoENvbmR1Y3RvcsKgRGlzY291bnRzJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdBZ2VudMKgRGlzY291bnRzJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdBbGzCoE90aGVywqBEaXNjb3VudHMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ01pc2NlbGxhbmVvdXPCoFByb3Zpc2lvbnMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0ZhcmXCoEJ5wqBSdWxlJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdHcm91cHMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1RvdXJzJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdWaXNpdMKgQW5vdGhlcsKgQ291bnRyeScsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnRGVwb3NpdHMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ1ZvbHVudGFyecKgQ2hhbmdlcycsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnVm9sdW50YXJ5wqBSZWZ1bmRzJyxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdOZWdvdGlhdGVkwqBGYXJlcycsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnUnVsZcKgQXBwbGljYXRpb27CoEFuZMKgT3RoZXLCoENvbmRpdGlvbnMnLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVNlYXJjaCgpOiBPYnNlcnZhYmxlPFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHQ+e1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICBjb25zdCBxdWVyeTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIGNvbnN0IGZhdm91cml0ZVNlYXJjaFF1ZXJ5OiBJRXVyb3N0YXJTZWFyY2hBcmdzID0gdGhpcy51cGRhdGVTZXJjaFF1ZXJ5KHF1ZXJ5KTtcclxuICAgICAgY29uc3Qgc2VhcmNoSW5mbyA9IHtcclxuICAgICAgICBuYW1lOiBgJHttb21lbnQoKX1gLFxyXG4gICAgICAgIHNlcnZpY2VUeXBlOiBTZXJ2aWNlVHlwZS5FdXJvc3RhcixcclxuICAgICAgICBzZWFyY2hBcmdzOiBmYXZvdXJpdGVTZWFyY2hRdWVyeVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZUZhdm91cml0ZVNlYXJjaChzZWFyY2hJbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|