@tiba-spark/client-shared-lib 26.2.0-157 → 26.2.0-166

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.
@@ -1,11 +1,11 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, catchError, combineLatest } from 'rxjs';
2
+ import { BehaviorSubject, catchError, combineLatest, EMPTY } from 'rxjs';
3
3
  import { delay, map, startWith, tap } from 'rxjs/operators';
4
4
  import { RestartLinkComponent } from '../components/restart-link/restart-link.component';
5
5
  import { ONE_SECOND_IN_MILLISECONDS } from '../constants/global-constants';
6
6
  import { ClearFacilityDictionaryAction, SetSmartparkBasicAllAction } from '../modules/facility/facility.actions';
7
7
  import { ClearSmartparksBasicAction, SetSmartParkTableAction, SetSmartParkVersionsAction } from '../modules/smartparks/smartpark.actions';
8
- import { SmartparkState } from '../modules/smartparks/smartpark.state';
8
+ import { AppModule, SubModule } from '../service-proxy/cloud-service-proxies';
9
9
  import { HttpStatusCode } from '../service-proxy/identity-service-proxies';
10
10
  import { AppType } from '../enums/app-type.enum';
11
11
  import * as i0 from "@angular/core";
@@ -29,8 +29,55 @@ export class SmartparkService {
29
29
  this.messageBarService = messageBarService;
30
30
  this.loading = new BehaviorSubject(false);
31
31
  this.hasError = new BehaviorSubject(false);
32
+ this.facilitySubModuleFetchMethodsMapping = {
33
+ [SubModule.EValidation]: this.facilityIdentityServiceProxy.facilityAllValidationEValidation,
34
+ [SubModule.SelfValidation]: this.facilityIdentityServiceProxy.facilityAllValidationSelfValidation,
35
+ [SubModule.Coupons]: this.facilityIdentityServiceProxy.facilityAllValidationCoupons,
36
+ [SubModule.Stickers]: this.facilityIdentityServiceProxy.facilityAllValidationStickers,
37
+ [SubModule.Monthlies]: this.facilityIdentityServiceProxy.facilityAllMonthlies,
38
+ [SubModule.ImporterTool]: this.facilityIdentityServiceProxy.facilityAllMonthliesImporterTool,
39
+ [SubModule.Guests]: this.facilityIdentityServiceProxy.facilityAllGuests,
40
+ [SubModule.HotelGuests]: this.facilityIdentityServiceProxy.facilityAllGuestsHotelGuests,
41
+ [SubModule.HotelGuestsIO]: this.facilityIdentityServiceProxy.facilityAllGuestsHotelGuestsIO,
42
+ [SubModule.EVoucher]: this.facilityIdentityServiceProxy.facilityAllGuestsEVoucher,
43
+ [SubModule.Accounts]: this.facilityIdentityServiceProxy.facilityAllAccounts,
44
+ [SubModule.Rates]: this.facilityIdentityServiceProxy.facilityAllLotConfigurationRates,
45
+ [SubModule.Scheduler]: this.facilityIdentityServiceProxy.facilityAllLotConfigurationScheduler,
46
+ [SubModule.DynamicPricing]: this.facilityIdentityServiceProxy.facilityAllLotConfigurationDynamicPricing,
47
+ [SubModule.ValidationProfiles]: this.facilityIdentityServiceProxy.facilityAllLotConfigurationValidationProfiles,
48
+ [SubModule.AccessProfiles]: this.facilityIdentityServiceProxy.facilityAllLotConfigurationAccessProfiles,
49
+ [SubModule.CashiersManagement]: this.facilityIdentityServiceProxy.facilityAllLotConfigurationCashiersManagement,
50
+ [SubModule.UserManagement]: this.facilityIdentityServiceProxy.facilityAllManagementUserManagement,
51
+ [SubModule.Audit]: this.facilityIdentityServiceProxy.facilityAllManagementAudit,
52
+ [SubModule.DigitalReceipt]: this.facilityIdentityServiceProxy.facilityAllManagementDigitalReceipt,
53
+ [SubModule.EnforcementIntegration]: this.facilityIdentityServiceProxy.facilityAllManagementEnforcementIntegration,
54
+ [SubModule.Scan2Pay]: this.facilityIdentityServiceProxy.facilityAllScan2Pay,
55
+ [SubModule.Insights]: this.facilityIdentityServiceProxy.facilityAllInsights,
56
+ [SubModule.FacilitiesAndSmartparks]: null,
57
+ [SubModule.Logo]: null,
58
+ [SubModule.SmtpSettings]: null,
59
+ [SubModule.DefaultUserSettings]: null,
60
+ [SubModule.ECommerceMySite]: null,
61
+ [SubModule.ECommerceConfiguration]: null,
62
+ };
63
+ this.facilityAppModuleFetchMethodsMapping = {
64
+ [AppModule.Cc]: this.facilityIdentityServiceProxy.facilityAllCc,
65
+ [AppModule.Reports]: this.facilityIdentityServiceProxy.facilityAllReports,
66
+ [AppModule.ECommerceBackoffice]: this.facilityIdentityServiceProxy.facilityAllECommerceConfiguration,
67
+ [AppModule.Management]: null,
68
+ [AppModule.Settings]: null,
69
+ [AppModule.Validation]: null,
70
+ [AppModule.Guests]: null,
71
+ [AppModule.Monthlies]: null,
72
+ [AppModule.Backoffice]: null,
73
+ [AppModule.Pi]: this.facilityIdentityServiceProxy.facilityAllPi,
74
+ [AppModule.Accounts]: null,
75
+ [AppModule.LotConfiguration]: null,
76
+ [AppModule.Scan2Pay]: null,
77
+ [AppModule.Insights]: null,
78
+ };
32
79
  }
33
- getSmartparkBasicAll(appModule, setSmartparkBasic = true) {
80
+ getSmartparkBasicAll(appModule, subModule, setSmartparkBasic = true) {
34
81
  this.hasError.next(false);
35
82
  this.loading.next(true);
36
83
  if (setSmartparkBasic) {
@@ -38,8 +85,13 @@ export class SmartparkService {
38
85
  this.store.dispatch(new ClearSmartparksBasicAction());
39
86
  this.store.dispatch(new ClearFacilityDictionaryAction());
40
87
  }
41
- // the subModule sent in the header by the CloudAuthTokenInterceptor
42
- const response = this.facilityIdentityServiceProxy.facilityAll(appModule);
88
+ const facilityAllFetchMethod = this.getFacilityAllFetchMethod(appModule, subModule);
89
+ if (!facilityAllFetchMethod) {
90
+ console.warn(`SmartparkService: no fetch method mapped for AppModule=${AppModule[appModule]} SubModule=${subModule != null ? SubModule[subModule] : 'none'} — skipping fetch`);
91
+ this.loading.next(false);
92
+ return EMPTY;
93
+ }
94
+ const response = facilityAllFetchMethod();
43
95
  return response.pipe(tap(smartparkBasic => {
44
96
  if (setSmartparkBasic) {
45
97
  this.store.dispatch(new SetSmartParkVersionsAction(this.extractSparkVersions(smartparkBasic.data.smartParks)));
@@ -68,7 +120,9 @@ export class SmartparkService {
68
120
  return this.createLoadingOverlayOptions(loading$, hasError$, noDataMessage);
69
121
  }
70
122
  getLoadingStream(actions) {
71
- const isSmartparkDataLoaded = this.store.selectSnapshot(SmartparkState.smartparks) !== null;
123
+ // Untyped state access to avoid a circular dependency with SmartparkState; keep in sync with the 'smartpark' state name/shape by hand.
124
+ const smartparks = this.store.selectSnapshot((state) => state.smartpark?.smartparks);
125
+ const isSmartparkDataLoaded = smartparks !== null && smartparks !== undefined;
72
126
  const response$ = isSmartparkDataLoaded ? this.actionStatusService.actionsExecuting$(actions) :
73
127
  (combineLatest([
74
128
  this.loading$.pipe(delay(ONE_SECOND_IN_MILLISECONDS)),
@@ -96,10 +150,14 @@ export class SmartparkService {
96
150
  }
97
151
  return versions;
98
152
  }
153
+ getFacilityAllFetchMethod(appModule, subModule) {
154
+ const fetchMethod = this.facilitySubModuleFetchMethodsMapping[subModule] ?? this.facilityAppModuleFetchMethodsMapping[appModule];
155
+ return fetchMethod ? fetchMethod.bind(this.facilityIdentityServiceProxy) : null;
156
+ }
99
157
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SmartparkService, deps: [{ token: i1.Store }, { token: i2.AppConfigService }, { token: i3.FacilityIdentityServiceProxy }, { token: i4.ActionStatusService }, { token: i5.MessageBarService }], target: i0.ɵɵFactoryTarget.Injectable }); }
100
158
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SmartparkService }); }
101
159
  }
102
160
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SmartparkService, decorators: [{
103
161
  type: Injectable
104
162
  }], ctorParameters: () => [{ type: i1.Store }, { type: i2.AppConfigService }, { type: i3.FacilityIdentityServiceProxy }, { type: i4.ActionStatusService }, { type: i5.MessageBarService }] });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRwYXJrLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtc2hhcmVkLWxpYi9zcmMvbGlicmFyaWVzL3NlcnZpY2VzL3NtYXJ0cGFyay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN6RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsdUJBQXVCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxSSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkUsT0FBTyxFQUFnQyxjQUFjLEVBQTBELE1BQU0sMkNBQTJDLENBQUM7QUFJakssT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7O0FBR2pELE1BQU0sT0FBTyxnQkFBZ0I7SUFFM0IsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUtELFlBQW9CLEtBQVksRUFDdEIsU0FB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QUM7SUFDL0IsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFVBQXdDO1FBQ25FLE1BQU0sUUFBUSxHQUFzQixFQUFFLENBQUM7UUFFdkMsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDM0MsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDakQsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7K0dBM0dVLGdCQUFnQjttSEFBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9uVHlwZSwgU3RvcmUgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNhdGNoRXJyb3IsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlbGF5LCBtYXAsIHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWVzc2FnZUJhclNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL21lc3NhZ2UtYmFyL21lc3NhZ2UtYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnZUluZm8gfSBmcm9tICcuLi9jb21wb25lbnRzL21lc3NhZ2UtYmFyL21lc3NhZ2UtaW5mby5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVzdGFydExpbmtDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3Jlc3RhcnQtbGluay9yZXN0YXJ0LWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IE9ORV9TRUNPTkRfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi4vY29uc3RhbnRzL2dsb2JhbC1jb25zdGFudHMnO1xuaW1wb3J0IHsgTG9hZGluZ092ZXJsYXlPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9sb2FkaW5nLW92ZXJsYXktb3B0aW9ucyc7XG5pbXBvcnQgeyBDbGVhckZhY2lsaXR5RGljdGlvbmFyeUFjdGlvbiwgU2V0U21hcnRwYXJrQmFzaWNBbGxBY3Rpb24gfSBmcm9tICcuLi9tb2R1bGVzL2ZhY2lsaXR5L2ZhY2lsaXR5LmFjdGlvbnMnO1xuaW1wb3J0IHsgQ2xlYXJTbWFydHBhcmtzQmFzaWNBY3Rpb24sIFNldFNtYXJ0UGFya1RhYmxlQWN0aW9uLCBTZXRTbWFydFBhcmtWZXJzaW9uc0FjdGlvbiB9IGZyb20gJy4uL21vZHVsZXMvc21hcnRwYXJrcy9zbWFydHBhcmsuYWN0aW9ucyc7XG5pbXBvcnQgeyBTbWFydHBhcmtTdGF0ZSB9IGZyb20gJy4uL21vZHVsZXMvc21hcnRwYXJrcy9zbWFydHBhcmsuc3RhdGUnO1xuaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSAnLi4vc2VydmljZS1wcm94eS9jbG91ZC1zZXJ2aWNlLXByb3hpZXMnO1xuaW1wb3J0IHsgRmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eSwgSHR0cFN0YXR1c0NvZGUsIFNtYXJ0cGFya0Jhc2ljRHRvLCBTbWFydFBhcmtXcmFwcGVyRHRvSHR0cFJlc3BvbnNlRGF0YSB9IGZyb20gJy4uL3NlcnZpY2UtcHJveHkvaWRlbnRpdHktc2VydmljZS1wcm94aWVzJztcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gJy4uL3V0aWxzL2xhbmcudXRpbCc7XG5pbXBvcnQgeyBBY3Rpb25TdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvbmd4cy9hY3Rpb24tc3RhdHVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwQ29uZmlnU2VydmljZSB9IGZyb20gJy4vYXBwLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFR5cGUgfSBmcm9tICcuLi9lbnVtcy9hcHAtdHlwZS5lbnVtJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNtYXJ0cGFya1NlcnZpY2Uge1xuXG4gIGdldCBsb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGhhc0Vycm9yJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oYXNFcnJvci5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZGluZzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgaGFzRXJyb3I6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgYXBwQ29uZmlnOiBBcHBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eTogRmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eSxcbiAgICBwcml2YXRlIGFjdGlvblN0YXR1c1NlcnZpY2U6IEFjdGlvblN0YXR1c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlQmFyU2VydmljZTogTWVzc2FnZUJhclNlcnZpY2UpIHtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTbWFydHBhcmtCYXNpY0FsbChhcHBNb2R1bGU6IEFwcE1vZHVsZSwgc2V0U21hcnRwYXJrQmFzaWMgPSB0cnVlKTogT2JzZXJ2YWJsZTxTbWFydFBhcmtXcmFwcGVyRHRvSHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgIHRoaXMuaGFzRXJyb3IubmV4dChmYWxzZSk7XG4gICAgdGhpcy5sb2FkaW5nLm5leHQodHJ1ZSk7XG5cbiAgICBpZiAoc2V0U21hcnRwYXJrQmFzaWMpIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNldFNtYXJ0UGFya1RhYmxlQWN0aW9uKG51bGwpKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IENsZWFyU21hcnRwYXJrc0Jhc2ljQWN0aW9uKCkpO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgQ2xlYXJGYWNpbGl0eURpY3Rpb25hcnlBY3Rpb24oKSk7XG4gICAgfVxuXG4gICAgLy8gdGhlIHN1Yk1vZHVsZSBzZW50IGluIHRoZSBoZWFkZXIgYnkgdGhlIENsb3VkQXV0aFRva2VuSW50ZXJjZXB0b3JcbiAgICBjb25zdCByZXNwb25zZTogT2JzZXJ2YWJsZTxTbWFydFBhcmtXcmFwcGVyRHRvSHR0cFJlc3BvbnNlRGF0YT4gPSB0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkuZmFjaWxpdHlBbGwoYXBwTW9kdWxlKTtcbiAgICByZXR1cm4gcmVzcG9uc2UucGlwZShcbiAgICAgIHRhcChzbWFydHBhcmtCYXNpYyA9PiB7XG4gICAgICAgIGlmIChzZXRTbWFydHBhcmtCYXNpYykge1xuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNldFNtYXJ0UGFya1ZlcnNpb25zQWN0aW9uKHRoaXMuZXh0cmFjdFNwYXJrVmVyc2lvbnMoc21hcnRwYXJrQmFzaWMuZGF0YS5zbWFydFBhcmtzKSkpO1xuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNldFNtYXJ0cGFya0Jhc2ljQWxsQWN0aW9uKHNtYXJ0cGFya0Jhc2ljKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGUgPT4ge1xuICAgICAgICB0aGlzLmhhc0Vycm9yLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMubG9hZGluZy5uZXh0KGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpc01vYmlsZUFwcE1vZGUgPSB0aGlzLmFwcENvbmZpZy5nZXRDb25maWcoKS5hcHBUeXBlID09PSBBcHBUeXBlLk1vYmlsZTtcbiAgICAgICAgaWYgKGUuc3RhdHVzICE9PSBIdHRwU3RhdHVzQ29kZS5SZXF1ZXN0VGltZW91dCAmJiAhaXNNb2JpbGVBcHBNb2RlKSB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluZm86IE1lc3NhZ2VJbmZvID0ge1xuICAgICAgICAgICAgZHVyYXRpb246IE9ORV9TRUNPTkRfSU5fTUlMTElTRUNPTkRTICogMTUsXG4gICAgICAgICAgICBhY3Rpb246IHtcbiAgICAgICAgICAgICAgY29tcG9uZW50OiBSZXN0YXJ0TGlua0NvbXBvbmVudFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2Uud2FybihcIlwiLCBtZXNzYWdlSW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldExvYWRpbmdPdmVybGF5T3B0aW9ucyhhY3Rpb25zOiBBY3Rpb25UeXBlIHwgQWN0aW9uVHlwZVtdLCBub0RhdGFNZXNzYWdlOiBzdHJpbmcgPSBudWxsKTogTG9hZGluZ092ZXJsYXlPcHRpb25zIHtcbiAgICBjb25zdCBsb2FkaW5nJCA9IHRoaXMuZ2V0TG9hZGluZ1N0cmVhbShhY3Rpb25zKTtcbiAgICBjb25zdCBoYXNFcnJvciQgPSB0aGlzLmdldEVycm9yU3RyZWFtKGFjdGlvbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9hZGluZ092ZXJsYXlPcHRpb25zKGxvYWRpbmckLCBoYXNFcnJvciQsIG5vRGF0YU1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2FkaW5nU3RyZWFtKGFjdGlvbnM6IEFjdGlvblR5cGUgfCBBY3Rpb25UeXBlW10pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBpc1NtYXJ0cGFya0RhdGFMb2FkZWQgPSB0aGlzLnN0b3JlLnNlbGVjdFNuYXBzaG90KFNtYXJ0cGFya1N0YXRlLnNtYXJ0cGFya3MpICE9PSBudWxsO1xuICAgIGNvbnN0IHJlc3BvbnNlJCA9IGlzU21hcnRwYXJrRGF0YUxvYWRlZCA/IHRoaXMuYWN0aW9uU3RhdHVzU2VydmljZS5hY3Rpb25zRXhlY3V0aW5nJChhY3Rpb25zKSA6XG4gICAgICAoXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgIHRoaXMubG9hZGluZyQucGlwZShkZWxheShPTkVfU0VDT05EX0lOX01JTExJU0VDT05EUykpLFxuICAgICAgICAgIHRoaXMuYWN0aW9uU3RhdHVzU2VydmljZS5hY3Rpb25zRXhlY3V0aW5nJChhY3Rpb25zKVxuICAgICAgICBdKS5waXBlKFxuICAgICAgICAgIG1hcCgoW3NtYXJ0cGFya3NMb2FkaW5nLCBhY3Rpb25Mb2FkaW5nXSkgPT4gc21hcnRwYXJrc0xvYWRpbmcgfHwgYWN0aW9uTG9hZGluZyksXG4gICAgICAgICAgc3RhcnRXaXRoKHRydWUpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlJDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXJyb3JTdHJlYW0oYWN0aW9uczogQWN0aW9uVHlwZSB8IEFjdGlvblR5cGVbXSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmFjdGlvblN0YXR1c1NlcnZpY2UuYWN0aW9uc0Vycm9yZWQkKGFjdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2FkaW5nT3ZlcmxheU9wdGlvbnMobG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4sIGhhc0Vycm9yJDogT2JzZXJ2YWJsZTxib29sZWFuPiwgbm9EYXRhTWVzc2FnZTogc3RyaW5nKTogTG9hZGluZ092ZXJsYXlPcHRpb25zIHtcbiAgICBjb25zdCBsb2FkaW5nT3ZlcmxheU9wdGlvbnM6IExvYWRpbmdPdmVybGF5T3B0aW9ucyA9IHtcbiAgICAgIGxvYWRpbmckLFxuICAgICAgaGFzRXJyb3IkLFxuICAgIH07XG5cbiAgICBpZiAobm9EYXRhTWVzc2FnZSkge1xuICAgICAgbG9hZGluZ092ZXJsYXlPcHRpb25zLmVtcHR5UmVzdWx0c09wdGlvbnMgPSB7IG5vRGF0YU1lc3NhZ2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9hZGluZ092ZXJsYXlPcHRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0U3BhcmtWZXJzaW9ucyhzbWFydHBhcmtzOiBTdHJpbmdNYXA8U21hcnRwYXJrQmFzaWNEdG8+KTogU3RyaW5nTWFwPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcnNpb25zOiBTdHJpbmdNYXA8c3RyaW5nPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBndWlkIG9mIE9iamVjdC5rZXlzKHNtYXJ0cGFya3MpKSB7XG4gICAgICB2ZXJzaW9uc1tndWlkXSA9IHNtYXJ0cGFya3NbZ3VpZF0uc3BhcmtWZXJzaW9uO1xuICAgIH1cblxuICAgIHJldHVybiB2ZXJzaW9ucztcbiAgfVxufVxuIl19
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRwYXJrLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtc2hhcmVkLWxpYi9zcmMvbGlicmFyaWVzL3NlcnZpY2VzL3NtYXJ0cGFyay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNyRixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDekYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0UsT0FBTyxFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakgsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLDBCQUEwQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDMUksT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQWdDLGNBQWMsRUFBMEQsTUFBTSwyQ0FBMkMsQ0FBQztBQUlqSyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7QUFHakQsTUFBTSxPQUFPLGdCQUFnQjtJQUUzQixJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBS0Qs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QkFBMkIsQ0FBQyxRQUE2QixFQUFFLFNBQThCLEVBQUUsYUFBcUI7UUFDdEgsTUFBTSxxQkFBcUIsR0FBMEI7WUFDbkQsUUFBUTtZQUNSLFNBQVM7U0FDVixDQUFDO1FBRUYsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixxQkFBcUIsQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ2hFLENBQUM7UUFFRCxPQUFPLHFCQUFxQixDQUFDO0lBQy9CLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxVQUF3QztRQUNuRSxNQUFNLFFBQVEsR0FBc0IsRUFBRSxDQUFDO1FBRXZDLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzNDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ2pELENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8seUJBQXlCLENBQUMsU0FBb0IsRUFBRSxTQUFxQjtRQUMzRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLG9DQUFvQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pJLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEYsQ0FBQzsrR0F2SFUsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3Rpb25UeXBlLCBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY2F0Y2hFcnJvciwgY29tYmluZUxhdGVzdCwgRU1QVFksIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlbGF5LCBtYXAsIHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWVzc2FnZUJhclNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL21lc3NhZ2UtYmFyL21lc3NhZ2UtYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnZUluZm8gfSBmcm9tICcuLi9jb21wb25lbnRzL21lc3NhZ2UtYmFyL21lc3NhZ2UtaW5mby5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVzdGFydExpbmtDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3Jlc3RhcnQtbGluay9yZXN0YXJ0LWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IE9ORV9TRUNPTkRfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi4vY29uc3RhbnRzL2dsb2JhbC1jb25zdGFudHMnO1xuaW1wb3J0IHsgTG9hZGluZ092ZXJsYXlPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9sb2FkaW5nLW92ZXJsYXktb3B0aW9ucyc7XG5pbXBvcnQgeyBDbGVhckZhY2lsaXR5RGljdGlvbmFyeUFjdGlvbiwgU2V0U21hcnRwYXJrQmFzaWNBbGxBY3Rpb24gfSBmcm9tICcuLi9tb2R1bGVzL2ZhY2lsaXR5L2ZhY2lsaXR5LmFjdGlvbnMnO1xuaW1wb3J0IHsgQ2xlYXJTbWFydHBhcmtzQmFzaWNBY3Rpb24sIFNldFNtYXJ0UGFya1RhYmxlQWN0aW9uLCBTZXRTbWFydFBhcmtWZXJzaW9uc0FjdGlvbiB9IGZyb20gJy4uL21vZHVsZXMvc21hcnRwYXJrcy9zbWFydHBhcmsuYWN0aW9ucyc7XG5pbXBvcnQgeyBBcHBNb2R1bGUsIFN1Yk1vZHVsZSB9IGZyb20gJy4uL3NlcnZpY2UtcHJveHkvY2xvdWQtc2VydmljZS1wcm94aWVzJztcbmltcG9ydCB7IEZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHksIEh0dHBTdGF0dXNDb2RlLCBTbWFydHBhcmtCYXNpY0R0bywgU21hcnRQYXJrV3JhcHBlckR0b0h0dHBSZXNwb25zZURhdGEgfSBmcm9tICcuLi9zZXJ2aWNlLXByb3h5L2lkZW50aXR5LXNlcnZpY2UtcHJveGllcyc7XG5pbXBvcnQgeyBOdW1iZXJNYXAsIFN0cmluZ01hcCB9IGZyb20gJy4uL3V0aWxzL2xhbmcudXRpbCc7XG5pbXBvcnQgeyBBY3Rpb25TdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvbmd4cy9hY3Rpb24tc3RhdHVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwQ29uZmlnU2VydmljZSB9IGZyb20gJy4vYXBwLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFR5cGUgfSBmcm9tICcuLi9lbnVtcy9hcHAtdHlwZS5lbnVtJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNtYXJ0cGFya1NlcnZpY2Uge1xuXG4gIGdldCBsb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGhhc0Vycm9yJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oYXNFcnJvci5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZGluZzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgaGFzRXJyb3I6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgYXBwQ29uZmlnOiBBcHBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eTogRmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eSxcbiAgICBwcml2YXRlIGFjdGlvblN0YXR1c1NlcnZpY2U6IEFjdGlvblN0YXR1c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlQmFyU2VydmljZTogTWVzc2FnZUJhclNlcnZpY2UpIHtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTbWFydHBhcmtCYXNpY0FsbChhcHBNb2R1bGU6IEFwcE1vZHVsZSwgc3ViTW9kdWxlPzogU3ViTW9kdWxlLCBzZXRTbWFydHBhcmtCYXNpYyA9IHRydWUpOiBPYnNlcnZhYmxlPFNtYXJ0UGFya1dyYXBwZXJEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgdGhpcy5oYXNFcnJvci5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmxvYWRpbmcubmV4dCh0cnVlKTtcblxuICAgIGlmIChzZXRTbWFydHBhcmtCYXNpYykge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU2V0U21hcnRQYXJrVGFibGVBY3Rpb24obnVsbCkpO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgQ2xlYXJTbWFydHBhcmtzQmFzaWNBY3Rpb24oKSk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBDbGVhckZhY2lsaXR5RGljdGlvbmFyeUFjdGlvbigpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmYWNpbGl0eUFsbEZldGNoTWV0aG9kID0gdGhpcy5nZXRGYWNpbGl0eUFsbEZldGNoTWV0aG9kKGFwcE1vZHVsZSwgc3ViTW9kdWxlKTtcbiAgICBpZiAoIWZhY2lsaXR5QWxsRmV0Y2hNZXRob2QpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU21hcnRwYXJrU2VydmljZTogbm8gZmV0Y2ggbWV0aG9kIG1hcHBlZCBmb3IgQXBwTW9kdWxlPSR7QXBwTW9kdWxlW2FwcE1vZHVsZV19IFN1Yk1vZHVsZT0ke3N1Yk1vZHVsZSAhPSBudWxsID8gU3ViTW9kdWxlW3N1Yk1vZHVsZV0gOiAnbm9uZSd9IOKAlCBza2lwcGluZyBmZXRjaGApO1xuICAgICAgdGhpcy5sb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZTogT2JzZXJ2YWJsZTxTbWFydFBhcmtXcmFwcGVyRHRvSHR0cFJlc3BvbnNlRGF0YT4gPSBmYWNpbGl0eUFsbEZldGNoTWV0aG9kKCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnBpcGUoXG4gICAgICB0YXAoc21hcnRwYXJrQmFzaWMgPT4ge1xuICAgICAgICBpZiAoc2V0U21hcnRwYXJrQmFzaWMpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTZXRTbWFydFBhcmtWZXJzaW9uc0FjdGlvbih0aGlzLmV4dHJhY3RTcGFya1ZlcnNpb25zKHNtYXJ0cGFya0Jhc2ljLmRhdGEuc21hcnRQYXJrcykpKTtcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTZXRTbWFydHBhcmtCYXNpY0FsbEFjdGlvbihzbWFydHBhcmtCYXNpYykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGluZy5uZXh0KGZhbHNlKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlID0+IHtcbiAgICAgICAgdGhpcy5oYXNFcnJvci5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmxvYWRpbmcubmV4dChmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgaXNNb2JpbGVBcHBNb2RlID0gdGhpcy5hcHBDb25maWcuZ2V0Q29uZmlnKCkuYXBwVHlwZSA9PT0gQXBwVHlwZS5Nb2JpbGU7XG4gICAgICAgIGlmIChlLnN0YXR1cyAhPT0gSHR0cFN0YXR1c0NvZGUuUmVxdWVzdFRpbWVvdXQgJiYgIWlzTW9iaWxlQXBwTW9kZSkge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbmZvOiBNZXNzYWdlSW5mbyA9IHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBPTkVfU0VDT05EX0lOX01JTExJU0VDT05EUyAqIDE1LFxuICAgICAgICAgICAgYWN0aW9uOiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudDogUmVzdGFydExpbmtDb21wb25lbnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLndhcm4oXCJcIiwgbWVzc2FnZUluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2FkaW5nT3ZlcmxheU9wdGlvbnMoYWN0aW9uczogQWN0aW9uVHlwZSB8IEFjdGlvblR5cGVbXSwgbm9EYXRhTWVzc2FnZTogc3RyaW5nID0gbnVsbCk6IExvYWRpbmdPdmVybGF5T3B0aW9ucyB7XG4gICAgY29uc3QgbG9hZGluZyQgPSB0aGlzLmdldExvYWRpbmdTdHJlYW0oYWN0aW9ucyk7XG4gICAgY29uc3QgaGFzRXJyb3IkID0gdGhpcy5nZXRFcnJvclN0cmVhbShhY3Rpb25zKTtcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvYWRpbmdPdmVybGF5T3B0aW9ucyhsb2FkaW5nJCwgaGFzRXJyb3IkLCBub0RhdGFNZXNzYWdlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9hZGluZ1N0cmVhbShhY3Rpb25zOiBBY3Rpb25UeXBlIHwgQWN0aW9uVHlwZVtdKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgLy8gVW50eXBlZCBzdGF0ZSBhY2Nlc3MgdG8gYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggU21hcnRwYXJrU3RhdGU7IGtlZXAgaW4gc3luYyB3aXRoIHRoZSAnc21hcnRwYXJrJyBzdGF0ZSBuYW1lL3NoYXBlIGJ5IGhhbmQuXG4gICAgY29uc3Qgc21hcnRwYXJrcyA9IHRoaXMuc3RvcmUuc2VsZWN0U25hcHNob3QoKHN0YXRlOiBhbnkpID0+IHN0YXRlLnNtYXJ0cGFyaz8uc21hcnRwYXJrcyk7XG4gICAgY29uc3QgaXNTbWFydHBhcmtEYXRhTG9hZGVkID0gc21hcnRwYXJrcyAhPT0gbnVsbCAmJiBzbWFydHBhcmtzICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzcG9uc2UkID0gaXNTbWFydHBhcmtEYXRhTG9hZGVkID8gdGhpcy5hY3Rpb25TdGF0dXNTZXJ2aWNlLmFjdGlvbnNFeGVjdXRpbmckKGFjdGlvbnMpIDpcbiAgICAgIChcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgdGhpcy5sb2FkaW5nJC5waXBlKGRlbGF5KE9ORV9TRUNPTkRfSU5fTUlMTElTRUNPTkRTKSksXG4gICAgICAgICAgdGhpcy5hY3Rpb25TdGF0dXNTZXJ2aWNlLmFjdGlvbnNFeGVjdXRpbmckKGFjdGlvbnMpXG4gICAgICAgIF0pLnBpcGUoXG4gICAgICAgICAgbWFwKChbc21hcnRwYXJrc0xvYWRpbmcsIGFjdGlvbkxvYWRpbmddKSA9PiBzbWFydHBhcmtzTG9hZGluZyB8fCBhY3Rpb25Mb2FkaW5nKSxcbiAgICAgICAgICBzdGFydFdpdGgodHJ1ZSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2UkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFcnJvclN0cmVhbShhY3Rpb25zOiBBY3Rpb25UeXBlIHwgQWN0aW9uVHlwZVtdKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uU3RhdHVzU2VydmljZS5hY3Rpb25zRXJyb3JlZCQoYWN0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxvYWRpbmdPdmVybGF5T3B0aW9ucyhsb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPiwgaGFzRXJyb3IkOiBPYnNlcnZhYmxlPGJvb2xlYW4+LCBub0RhdGFNZXNzYWdlOiBzdHJpbmcpOiBMb2FkaW5nT3ZlcmxheU9wdGlvbnMge1xuICAgIGNvbnN0IGxvYWRpbmdPdmVybGF5T3B0aW9uczogTG9hZGluZ092ZXJsYXlPcHRpb25zID0ge1xuICAgICAgbG9hZGluZyQsXG4gICAgICBoYXNFcnJvciQsXG4gICAgfTtcblxuICAgIGlmIChub0RhdGFNZXNzYWdlKSB7XG4gICAgICBsb2FkaW5nT3ZlcmxheU9wdGlvbnMuZW1wdHlSZXN1bHRzT3B0aW9ucyA9IHsgbm9EYXRhTWVzc2FnZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBsb2FkaW5nT3ZlcmxheU9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTcGFya1ZlcnNpb25zKHNtYXJ0cGFya3M6IFN0cmluZ01hcDxTbWFydHBhcmtCYXNpY0R0bz4pOiBTdHJpbmdNYXA8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyc2lvbnM6IFN0cmluZ01hcDxzdHJpbmc+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGd1aWQgb2YgT2JqZWN0LmtleXMoc21hcnRwYXJrcykpIHtcbiAgICAgIHZlcnNpb25zW2d1aWRdID0gc21hcnRwYXJrc1tndWlkXS5zcGFya1ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcnNpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGYWNpbGl0eUFsbEZldGNoTWV0aG9kKGFwcE1vZHVsZTogQXBwTW9kdWxlLCBzdWJNb2R1bGU/OiBTdWJNb2R1bGUpOiBGYWNpbGl0eUZldGNoTWV0aG9kU2lnbmF0dXJlIHwgbnVsbCB7XG4gICAgY29uc3QgZmV0Y2hNZXRob2QgPSB0aGlzLmZhY2lsaXR5U3ViTW9kdWxlRmV0Y2hNZXRob2RzTWFwcGluZ1tzdWJNb2R1bGVdID8/IHRoaXMuZmFjaWxpdHlBcHBNb2R1bGVGZXRjaE1ldGhvZHNNYXBwaW5nW2FwcE1vZHVsZV07XG4gICAgcmV0dXJuIGZldGNoTWV0aG9kID8gZmV0Y2hNZXRob2QuYmluZCh0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkpIDogbnVsbDtcbiAgfVxuXG4gIGZhY2lsaXR5U3ViTW9kdWxlRmV0Y2hNZXRob2RzTWFwcGluZzogRmFjaWxpdHlGZXRjaE1ldGhvZHNNYXAgPSB7XG4gICAgW1N1Yk1vZHVsZS5FVmFsaWRhdGlvbl06IHRoaXMuZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eS5mYWNpbGl0eUFsbFZhbGlkYXRpb25FVmFsaWRhdGlvbixcbiAgICBbU3ViTW9kdWxlLlNlbGZWYWxpZGF0aW9uXTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsVmFsaWRhdGlvblNlbGZWYWxpZGF0aW9uLFxuICAgIFtTdWJNb2R1bGUuQ291cG9uc106IHRoaXMuZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eS5mYWNpbGl0eUFsbFZhbGlkYXRpb25Db3Vwb25zLFxuICAgIFtTdWJNb2R1bGUuU3RpY2tlcnNdOiB0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkuZmFjaWxpdHlBbGxWYWxpZGF0aW9uU3RpY2tlcnMsXG4gICAgW1N1Yk1vZHVsZS5Nb250aGxpZXNdOiB0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkuZmFjaWxpdHlBbGxNb250aGxpZXMsXG4gICAgW1N1Yk1vZHVsZS5JbXBvcnRlclRvb2xdOiB0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkuZmFjaWxpdHlBbGxNb250aGxpZXNJbXBvcnRlclRvb2wsXG4gICAgW1N1Yk1vZHVsZS5HdWVzdHNdOiB0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkuZmFjaWxpdHlBbGxHdWVzdHMsXG4gICAgW1N1Yk1vZHVsZS5Ib3RlbEd1ZXN0c106IHRoaXMuZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eS5mYWNpbGl0eUFsbEd1ZXN0c0hvdGVsR3Vlc3RzLFxuICAgIFtTdWJNb2R1bGUuSG90ZWxHdWVzdHNJT106IHRoaXMuZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eS5mYWNpbGl0eUFsbEd1ZXN0c0hvdGVsR3Vlc3RzSU8sXG4gICAgW1N1Yk1vZHVsZS5FVm91Y2hlcl06IHRoaXMuZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eS5mYWNpbGl0eUFsbEd1ZXN0c0VWb3VjaGVyLFxuICAgIFtTdWJNb2R1bGUuQWNjb3VudHNdOiB0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkuZmFjaWxpdHlBbGxBY2NvdW50cyxcbiAgICBbU3ViTW9kdWxlLlJhdGVzXTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsTG90Q29uZmlndXJhdGlvblJhdGVzLFxuICAgIFtTdWJNb2R1bGUuU2NoZWR1bGVyXTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsTG90Q29uZmlndXJhdGlvblNjaGVkdWxlcixcbiAgICBbU3ViTW9kdWxlLkR5bmFtaWNQcmljaW5nXTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsTG90Q29uZmlndXJhdGlvbkR5bmFtaWNQcmljaW5nLFxuICAgIFtTdWJNb2R1bGUuVmFsaWRhdGlvblByb2ZpbGVzXTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsTG90Q29uZmlndXJhdGlvblZhbGlkYXRpb25Qcm9maWxlcyxcbiAgICBbU3ViTW9kdWxlLkFjY2Vzc1Byb2ZpbGVzXTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsTG90Q29uZmlndXJhdGlvbkFjY2Vzc1Byb2ZpbGVzLFxuICAgIFtTdWJNb2R1bGUuQ2FzaGllcnNNYW5hZ2VtZW50XTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsTG90Q29uZmlndXJhdGlvbkNhc2hpZXJzTWFuYWdlbWVudCxcbiAgICBbU3ViTW9kdWxlLlVzZXJNYW5hZ2VtZW50XTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsTWFuYWdlbWVudFVzZXJNYW5hZ2VtZW50LFxuICAgIFtTdWJNb2R1bGUuQXVkaXRdOiB0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkuZmFjaWxpdHlBbGxNYW5hZ2VtZW50QXVkaXQsXG4gICAgW1N1Yk1vZHVsZS5EaWdpdGFsUmVjZWlwdF06IHRoaXMuZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eS5mYWNpbGl0eUFsbE1hbmFnZW1lbnREaWdpdGFsUmVjZWlwdCxcbiAgICBbU3ViTW9kdWxlLkVuZm9yY2VtZW50SW50ZWdyYXRpb25dOiB0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkuZmFjaWxpdHlBbGxNYW5hZ2VtZW50RW5mb3JjZW1lbnRJbnRlZ3JhdGlvbixcbiAgICBbU3ViTW9kdWxlLlNjYW4yUGF5XTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsU2NhbjJQYXksXG4gICAgW1N1Yk1vZHVsZS5JbnNpZ2h0c106IHRoaXMuZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eS5mYWNpbGl0eUFsbEluc2lnaHRzLFxuICAgIFtTdWJNb2R1bGUuRmFjaWxpdGllc0FuZFNtYXJ0cGFya3NdOiBudWxsLFxuICAgIFtTdWJNb2R1bGUuTG9nb106IG51bGwsXG4gICAgW1N1Yk1vZHVsZS5TbXRwU2V0dGluZ3NdOiBudWxsLFxuICAgIFtTdWJNb2R1bGUuRGVmYXVsdFVzZXJTZXR0aW5nc106IG51bGwsXG4gICAgW1N1Yk1vZHVsZS5FQ29tbWVyY2VNeVNpdGVdOiBudWxsLFxuICAgIFtTdWJNb2R1bGUuRUNvbW1lcmNlQ29uZmlndXJhdGlvbl06IG51bGwsXG4gIH07XG4gIGZhY2lsaXR5QXBwTW9kdWxlRmV0Y2hNZXRob2RzTWFwcGluZzogRmFjaWxpdHlGZXRjaE1ldGhvZHNNYXAgPSB7XG4gICAgW0FwcE1vZHVsZS5DY106IHRoaXMuZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eS5mYWNpbGl0eUFsbENjLFxuICAgIFtBcHBNb2R1bGUuUmVwb3J0c106IHRoaXMuZmFjaWxpdHlJZGVudGl0eVNlcnZpY2VQcm94eS5mYWNpbGl0eUFsbFJlcG9ydHMsXG4gICAgW0FwcE1vZHVsZS5FQ29tbWVyY2VCYWNrb2ZmaWNlXTogdGhpcy5mYWNpbGl0eUlkZW50aXR5U2VydmljZVByb3h5LmZhY2lsaXR5QWxsRUNvbW1lcmNlQ29uZmlndXJhdGlvbixcbiAgICBbQXBwTW9kdWxlLk1hbmFnZW1lbnRdOiBudWxsLFxuICAgIFtBcHBNb2R1bGUuU2V0dGluZ3NdOiBudWxsLFxuICAgIFtBcHBNb2R1bGUuVmFsaWRhdGlvbl06IG51bGwsXG4gICAgW0FwcE1vZHVsZS5HdWVzdHNdOiBudWxsLFxuICAgIFtBcHBNb2R1bGUuTW9udGhsaWVzXTogbnVsbCxcbiAgICBbQXBwTW9kdWxlLkJhY2tvZmZpY2VdOiBudWxsLFxuICAgIFtBcHBNb2R1bGUuUGldOiB0aGlzLmZhY2lsaXR5SWRlbnRpdHlTZXJ2aWNlUHJveHkuZmFjaWxpdHlBbGxQaSxcbiAgICBbQXBwTW9kdWxlLkFjY291bnRzXTogbnVsbCxcbiAgICBbQXBwTW9kdWxlLkxvdENvbmZpZ3VyYXRpb25dOiBudWxsLFxuICAgIFtBcHBNb2R1bGUuU2NhbjJQYXldOiBudWxsLFxuICAgIFtBcHBNb2R1bGUuSW5zaWdodHNdOiBudWxsLFxuICB9O1xufVxuXG50eXBlIEZhY2lsaXR5RmV0Y2hNZXRob2RTaWduYXR1cmUgPSAoKSA9PiBPYnNlcnZhYmxlPFNtYXJ0UGFya1dyYXBwZXJEdG9IdHRwUmVzcG9uc2VEYXRhPjtcbnR5cGUgRmFjaWxpdHlGZXRjaE1ldGhvZHNNYXAgPSBOdW1iZXJNYXA8RmFjaWxpdHlGZXRjaE1ldGhvZFNpZ25hdHVyZT47XG4iXX0=