@veloceapps/sdk 8.0.0-132 → 8.0.0-134

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. package/cms/components/preview/preview.component.d.ts +2 -2
  2. package/cms/vendor-map.d.ts +2 -2
  3. package/core/modules/configuration/configuration.module.d.ts +2 -1
  4. package/core/modules/configuration/index.d.ts +1 -1
  5. package/core/modules/configuration/services/configuration-state.service.d.ts +48 -0
  6. package/core/modules/configuration/services/configuration.service.d.ts +2 -1
  7. package/core/modules/flow-configuration/flow-configuration.module.d.ts +2 -1
  8. package/core/services/flow-info.service.d.ts +1 -0
  9. package/core/services/flow-state-configuration.service.d.ts +5 -6
  10. package/esm2020/cms/components/preview/preview.component.mjs +4 -4
  11. package/esm2020/cms/vendor-map.mjs +3 -3
  12. package/esm2020/core/core.module.mjs +16 -2
  13. package/esm2020/core/modules/configuration/configuration.module.mjs +7 -23
  14. package/esm2020/core/modules/configuration/helpers.mjs +1 -1
  15. package/esm2020/core/modules/configuration/index.mjs +2 -2
  16. package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +267 -0
  17. package/esm2020/core/modules/configuration/services/configuration.service.mjs +21 -15
  18. package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +6 -6
  19. package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +3 -4
  20. package/esm2020/core/services/context.service.mjs +3 -4
  21. package/esm2020/core/services/flow-info.service.mjs +6 -4
  22. package/esm2020/core/services/flow-state-configuration.service.mjs +27 -26
  23. package/esm2020/core/services/flow-state.service.mjs +15 -7
  24. package/esm2020/core/services/integration.state.mjs +3 -4
  25. package/esm2020/core/services/metric-calculation/metric-calculation.service.mjs +3 -4
  26. package/esm2020/core/services/product-images.service.mjs +3 -4
  27. package/esm2020/core/services/quote-draft.service.mjs +3 -4
  28. package/esm2020/core/services/runtime-settings.service.mjs +4 -5
  29. package/esm2020/src/guards/context.guard.mjs +1 -2
  30. package/esm2020/src/pages/product/product.component.mjs +21 -8
  31. package/esm2020/src/pages/remote/remote.component.mjs +4 -4
  32. package/esm2020/src/services/flow-router.service.mjs +30 -13
  33. package/esm2020/src/services/flow.service.mjs +48 -27
  34. package/fesm2015/veloceapps-sdk-cms.mjs +4 -4
  35. package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
  36. package/fesm2015/veloceapps-sdk-core.mjs +292 -152
  37. package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
  38. package/fesm2015/veloceapps-sdk.mjs +94 -45
  39. package/fesm2015/veloceapps-sdk.mjs.map +1 -1
  40. package/fesm2020/veloceapps-sdk-cms.mjs +4 -4
  41. package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
  42. package/fesm2020/veloceapps-sdk-core.mjs +281 -151
  43. package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
  44. package/fesm2020/veloceapps-sdk.mjs +93 -44
  45. package/fesm2020/veloceapps-sdk.mjs.map +1 -1
  46. package/package.json +1 -1
  47. package/src/pages/product/product.component.d.ts +6 -4
  48. package/src/pages/remote/remote.component.d.ts +2 -2
  49. package/src/services/flow-router.service.d.ts +4 -2
  50. package/src/services/flow.service.d.ts +7 -3
  51. package/core/modules/configuration/services/configuration.state.d.ts +0 -30
  52. package/esm2020/core/modules/configuration/services/configuration.state.mjs +0 -142
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veloceapps/sdk",
3
- "version": "8.0.0-132",
3
+ "version": "8.0.0-134",
4
4
  "private": false,
5
5
  "peerDependencies": {
6
6
  "@angular/animations": "~15.2.0",
@@ -1,22 +1,24 @@
1
1
  import { UIDefinition } from '@veloceapps/core';
2
2
  import { CMSPreviewConfig } from '@veloceapps/sdk/cms';
3
- import { ConfigurationRuntimeService, ConfigurationService, ConfigurationState, ContextService, FlowCustomization, IntegrationState, QuoteDraftService } from '@veloceapps/sdk/core';
3
+ import { ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, ContextService, FlowCustomization, FlowInfoService, FlowStateService, IntegrationState, QuoteDraftService } from '@veloceapps/sdk/core';
4
4
  import { BehaviorSubject } from 'rxjs';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class ProductComponent {
7
7
  private contextService;
8
8
  private configurationRuntimeService;
9
9
  private configurationService;
10
- private configurationState;
10
+ private configurationStateService;
11
11
  private quoteDraftService;
12
+ private flowInfoService;
13
+ private flowStateService;
12
14
  private integrationState;
13
15
  private customizationService?;
14
16
  config: CMSPreviewConfig;
15
17
  uiDefinition$: BehaviorSubject<UIDefinition | undefined>;
16
- constructor(contextService: ContextService, configurationRuntimeService: ConfigurationRuntimeService, configurationService: ConfigurationService, configurationState: ConfigurationState, quoteDraftService: QuoteDraftService, integrationState: IntegrationState, customizationService?: FlowCustomization | undefined);
18
+ constructor(contextService: ContextService, configurationRuntimeService: ConfigurationRuntimeService, configurationService: ConfigurationService, configurationStateService: ConfigurationStateService, quoteDraftService: QuoteDraftService, flowInfoService: FlowInfoService, flowStateService: FlowStateService, integrationState: IntegrationState, customizationService?: FlowCustomization | undefined);
17
19
  private customizeUI$;
18
20
  private init$;
19
21
  private getLineItemId;
20
- static ɵfac: i0.ɵɵFactoryDeclaration<ProductComponent, [null, null, null, null, null, null, { optional: true; }]>;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<ProductComponent, [null, null, null, null, null, null, null, null, { optional: true; }]>;
21
23
  static ɵcmp: i0.ɵɵComponentDeclaration<ProductComponent, "vl-flow-product", never, {}, {}, never, never, false, never>;
22
24
  }
@@ -1,7 +1,7 @@
1
1
  import { Location } from '@angular/common';
2
2
  import { OnDestroy } from '@angular/core';
3
3
  import { UIDefinition } from '@veloceapps/core';
4
- import { ConfigurationRuntimeService, ConfigurationService, ConfigurationState, ContextService, IntegrationState, QuoteDraftService } from '@veloceapps/sdk/core';
4
+ import { ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, ContextService, IntegrationState, QuoteDraftService } from '@veloceapps/sdk/core';
5
5
  import { MessageService } from 'primeng/api';
6
6
  import { BehaviorSubject } from 'rxjs';
7
7
  import * as i0 from "@angular/core";
@@ -23,7 +23,7 @@ export declare class RemoteComponent implements OnDestroy {
23
23
  private readonly DYNAMIC_OPTION_PRODUCTS_KEY;
24
24
  private rpcMessage;
25
25
  private destroyed$;
26
- constructor(contextService: ContextService, quoteDraftService: QuoteDraftService, runtimeService: ConfigurationRuntimeService, configurationService: ConfigurationService, configurationState: ConfigurationState, messageService: MessageService, integrationState: IntegrationState, location: Location);
26
+ constructor(contextService: ContextService, quoteDraftService: QuoteDraftService, runtimeService: ConfigurationRuntimeService, configurationService: ConfigurationService, configurationState: ConfigurationStateService, messageService: MessageService, integrationState: IntegrationState, location: Location);
27
27
  ngOnDestroy(): void;
28
28
  private initConfiguration;
29
29
  private throwIfNoUIDefinition;
@@ -1,5 +1,5 @@
1
1
  import { ActivatedRoute, ActivatedRouteSnapshot, Params, Router } from '@angular/router';
2
- import { ContextService, IntegrationState } from '@veloceapps/sdk/core';
2
+ import { ContextService, FlowInfoService, FlowStateService, IntegrationState } from '@veloceapps/sdk/core';
3
3
  import { Observable } from 'rxjs';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class FlowRouterService {
@@ -7,12 +7,14 @@ export declare class FlowRouterService {
7
7
  private route;
8
8
  private contextService;
9
9
  private integrationState;
10
+ private flowInfoService;
11
+ private flowStateService;
10
12
  private routeChange$;
11
13
  private lastChildParams$;
12
14
  private lastChildRoute$;
13
15
  private urlHistory;
14
16
  loading$: Observable<boolean>;
15
- constructor(router: Router, route: ActivatedRoute, contextService: ContextService, integrationState: IntegrationState);
17
+ constructor(router: Router, route: ActivatedRoute, contextService: ContextService, integrationState: IntegrationState, flowInfoService: FlowInfoService, flowStateService: FlowStateService);
16
18
  getFlowRootRoute(route: ActivatedRouteSnapshot): ActivatedRouteSnapshot | undefined;
17
19
  getFlowRootPath(route: ActivatedRouteSnapshot): string;
18
20
  get route$(): Observable<ActivatedRouteSnapshot>;
@@ -1,5 +1,5 @@
1
1
  import { IntegrationState } from '@veloceapps/sdk/cms';
2
- import { ConfigurationService, FlowConfigurationService, QuoteDraftService } from '@veloceapps/sdk/core';
2
+ import { ConfigurationService, ConfigurationStateService, FlowConfigurationService, FlowInfoService, FlowStateService, QuoteDraftService } from '@veloceapps/sdk/core';
3
3
  import { FlowDialogService } from './flow-dialog.service';
4
4
  import { FlowRouterService } from './flow-router.service';
5
5
  import * as i0 from "@angular/core";
@@ -8,13 +8,17 @@ export declare class FlowService {
8
8
  private flowRouterService;
9
9
  private quoteDraftService;
10
10
  private configurationService;
11
- private flowConfigurationService;
11
+ private configurationStateService;
12
12
  private flowDialogService;
13
+ private flowConfigurationService;
14
+ private flowInfoService;
15
+ private flowStateService;
13
16
  private cleanup$;
14
- constructor(integrationState: IntegrationState, flowRouterService: FlowRouterService, quoteDraftService: QuoteDraftService, configurationService: ConfigurationService, flowConfigurationService: FlowConfigurationService, flowDialogService: FlowDialogService);
17
+ constructor(integrationState: IntegrationState, flowRouterService: FlowRouterService, quoteDraftService: QuoteDraftService, configurationService: ConfigurationService, configurationStateService: ConfigurationStateService, flowDialogService: FlowDialogService, flowConfigurationService: FlowConfigurationService, flowInfoService: FlowInfoService, flowStateService: FlowStateService);
15
18
  cleanup(): void;
16
19
  initSubscriptions(): void;
17
20
  private updateFlowPath;
21
+ private legacyApplyConfiguration;
18
22
  static ɵfac: i0.ɵɵFactoryDeclaration<FlowService, never>;
19
23
  static ɵprov: i0.ɵɵInjectableDeclaration<FlowService>;
20
24
  }
@@ -1,30 +0,0 @@
1
- import { StatefulConfigurationApiService } from '@veloceapps/api';
2
- import { ToastService } from '@veloceapps/components';
3
- import { ConfigurationExecuteRequest } from '@veloceapps/core';
4
- import { Observable } from 'rxjs';
5
- import { ConfigurationRuntimeService } from './configuration-runtime.service';
6
- import { ConfigurationService } from './configuration.service';
7
- import * as i0 from "@angular/core";
8
- export declare class ConfigurationState {
9
- private statefulConfigurationApiService;
10
- private runtimeService;
11
- private configurationService;
12
- private toastService;
13
- private readonly stateSubj$;
14
- state$: Observable<Record<string, unknown>>;
15
- private stateId;
16
- constructor(statefulConfigurationApiService: StatefulConfigurationApiService, runtimeService: ConfigurationRuntimeService, configurationService: ConfigurationService, toastService: ToastService);
17
- init$(): Observable<void>;
18
- cleanup(): void;
19
- execute$(req: ConfigurationExecuteRequest): Observable<void>;
20
- dispatch$(actionName: string, inputData: unknown): Observable<void>;
21
- select$(selectorName: string, inputData: unknown): Observable<unknown>;
22
- private get isStatefulConfiguration();
23
- private executeStateless$;
24
- private executeStateful$;
25
- private executeActionScript;
26
- private executeSelectorScript;
27
- private executeProcessorScript;
28
- static ɵfac: i0.ɵɵFactoryDeclaration<ConfigurationState, never>;
29
- static ɵprov: i0.ɵɵInjectableDeclaration<ConfigurationState>;
30
- }
@@ -1,142 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { StatefulConfigurationApiService } from '@veloceapps/api';
3
- import { ToastService, ToastType } from '@veloceapps/components';
4
- import { EntityUtil, UUID, } from '@veloceapps/core';
5
- import { omit } from 'lodash';
6
- import { BehaviorSubject, map, of, switchMap, tap } from 'rxjs';
7
- import { ConfigurationRuntimeService } from './configuration-runtime.service';
8
- import { ConfigurationService } from './configuration.service';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@veloceapps/api";
11
- import * as i2 from "./configuration-runtime.service";
12
- import * as i3 from "./configuration.service";
13
- import * as i4 from "@veloceapps/components";
14
- export class ConfigurationState {
15
- constructor(statefulConfigurationApiService, runtimeService, configurationService, toastService) {
16
- this.statefulConfigurationApiService = statefulConfigurationApiService;
17
- this.runtimeService = runtimeService;
18
- this.configurationService = configurationService;
19
- this.toastService = toastService;
20
- this.stateSubj$ = new BehaviorSubject({});
21
- this.state$ = this.stateSubj$.asObservable();
22
- this.stateId = null;
23
- }
24
- init$() {
25
- return this.configurationService.configure().pipe(switchMap(() => {
26
- if (!this.isStatefulConfiguration) {
27
- return of(undefined);
28
- }
29
- const { actions, selectors } = this.runtimeService.runtimeContext?.uiDefinitionContainer ?? {};
30
- return this.statefulConfigurationApiService.init({
31
- item: this.configurationService.generateRequest(),
32
- actions: actions?.map(action => ({ name: action.apiName, script: action.script })),
33
- selectors: selectors?.map(selector => ({ name: selector.apiName, script: selector.script })),
34
- });
35
- }), tap(stateId => (this.stateId = stateId || null)), map(() => undefined));
36
- }
37
- cleanup() {
38
- this.stateId = null;
39
- this.configurationService.reset();
40
- this.stateSubj$.next({});
41
- }
42
- execute$(req) {
43
- if (this.isStatefulConfiguration) {
44
- return this.executeStateful$(req);
45
- }
46
- else {
47
- return this.executeStateless$(req);
48
- }
49
- }
50
- dispatch$(actionName, inputData) {
51
- return this.execute$({ actions: [{ name: actionName, inputData }] });
52
- }
53
- select$(selectorName, inputData) {
54
- const requestId = UUID.UUID();
55
- return this.execute$({
56
- selectors: {
57
- [requestId]: {
58
- name: selectorName,
59
- inputData,
60
- },
61
- },
62
- }).pipe(map(() => this.stateSubj$.value[requestId]), tap(() => this.stateSubj$.next(omit(this.stateSubj$.value, requestId))));
63
- }
64
- get isStatefulConfiguration() {
65
- return this.runtimeService.uiDefinitionProperties.statefulConfigurationEnabled ?? false;
66
- }
67
- executeStateless$(request) {
68
- return of(undefined).pipe(switchMap(() => {
69
- // Apply actions and execute configuration/price call
70
- // No need to run configuration if no actions in the request
71
- if (!request.actions?.length) {
72
- return of(undefined);
73
- }
74
- let configurationRequest = this.configurationService.generateRequest();
75
- request.actions.forEach(action => {
76
- configurationRequest = this.executeActionScript(configurationRequest, action) ?? configurationRequest;
77
- });
78
- return this.configurationService.configureRequest$(configurationRequest);
79
- }), tap(() => {
80
- if (!request.selectors) {
81
- return;
82
- }
83
- // Run selectors and apply them to the state
84
- const finalConfigurationRequest = this.configurationService.generateRequest();
85
- const selectorsResult = EntityUtil.entries(request.selectors).reduce((trunk, [key, selector]) => {
86
- trunk[key] = this.executeSelectorScript(finalConfigurationRequest, selector);
87
- return trunk;
88
- }, {});
89
- this.stateSubj$.next({
90
- ...this.stateSubj$.value,
91
- ...selectorsResult,
92
- });
93
- }), map(() => undefined));
94
- }
95
- executeStateful$(request) {
96
- if (!this.stateId) {
97
- return of(undefined);
98
- }
99
- return this.statefulConfigurationApiService.execute(this.stateId, request).pipe(tap(response => {
100
- this.stateId = response.stateId;
101
- const updatedState = this.stateSubj$.value;
102
- EntityUtil.entries(response.selectors).forEach(([key, value]) => {
103
- if (!value.success) {
104
- if (!this.runtimeService.uiDefinitionProperties.suppressToastMessages) {
105
- this.toastService.add({ summary: value.errorMessage, severity: ToastType.error });
106
- }
107
- return;
108
- }
109
- updatedState[key] = value.result;
110
- });
111
- this.stateSubj$.next(updatedState);
112
- }), map(() => undefined));
113
- }
114
- executeActionScript(request, processor) {
115
- const { actions } = this.runtimeService.runtimeContext?.uiDefinitionContainer ?? {};
116
- const script = actions?.find(action => action.apiName === processor.name)?.script;
117
- if (!script) {
118
- return null;
119
- }
120
- return this.executeProcessorScript(request, script, processor.inputData);
121
- }
122
- executeSelectorScript(request, processor) {
123
- const { selectors } = this.runtimeService.runtimeContext?.uiDefinitionContainer ?? {};
124
- const script = selectors?.find(selector => selector.apiName === processor.name)?.script;
125
- if (!script) {
126
- return null;
127
- }
128
- return this.executeProcessorScript(request, script, processor.inputData);
129
- }
130
- executeProcessorScript(request, script, inputData) {
131
- return new Function(`${script}\nreturn transform;`)()({
132
- request,
133
- inputData: inputData,
134
- });
135
- }
136
- }
137
- ConfigurationState.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationState, deps: [{ token: i1.StatefulConfigurationApiService }, { token: i2.ConfigurationRuntimeService }, { token: i3.ConfigurationService }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Injectable });
138
- ConfigurationState.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationState });
139
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationState, decorators: [{
140
- type: Injectable
141
- }], ctorParameters: function () { return [{ type: i1.StatefulConfigurationApiService }, { type: i2.ConfigurationRuntimeService }, { type: i3.ConfigurationService }, { type: i4.ToastService }]; } });
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2RrL2NvcmUvbW9kdWxlcy9jb25maWd1cmF0aW9uL3NlcnZpY2VzL2NvbmZpZ3VyYXRpb24uc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFLTCxVQUFVLEVBQ1YsSUFBSSxHQUNMLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsZUFBZSxFQUFjLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7O0FBRy9ELE1BQU0sT0FBTyxrQkFBa0I7SUFPN0IsWUFDVSwrQkFBZ0UsRUFDaEUsY0FBMkMsRUFDM0Msb0JBQTBDLEVBQzFDLFlBQTBCO1FBSDFCLG9DQUErQixHQUEvQiwrQkFBK0IsQ0FBaUM7UUFDaEUsbUJBQWMsR0FBZCxjQUFjLENBQTZCO1FBQzNDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFWbkIsZUFBVSxHQUFHLElBQUksZUFBZSxDQUEwQixFQUFFLENBQUMsQ0FBQztRQUV4RSxXQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV2QyxZ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QzNFLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxPQUE2QixFQUFFLE1BQWMsRUFBRSxTQUFrQjtRQUM5RixPQUFPLElBQUksUUFBUSxDQUFDLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTztZQUNQLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7OytHQXhLVSxrQkFBa0I7bUhBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RhdGVmdWxDb25maWd1cmF0aW9uQXBpU2VydmljZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2FwaSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UsIFRvYXN0VHlwZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbkV4ZWN1dGVSZXF1ZXN0LFxuICBDb25maWd1cmF0aW9uUmVxdWVzdCxcbiAgQ29uZmlndXJhdGlvblJlcXVlc3RBY3Rpb24sXG4gIENvbmZpZ3VyYXRpb25SZXF1ZXN0U2VsZWN0b3IsXG4gIEVudGl0eVV0aWwsXG4gIFVVSUQsXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2NvcmUnO1xuaW1wb3J0IHsgb21pdCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG1hcCwgb2YsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24tcnVudGltZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvblN0YXRlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVN1YmokID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe30pO1xuXG4gIHB1YmxpYyBzdGF0ZSQgPSB0aGlzLnN0YXRlU3ViaiQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBzdGF0ZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0YXRlZnVsQ29uZmlndXJhdGlvbkFwaVNlcnZpY2U6IFN0YXRlZnVsQ29uZmlndXJhdGlvbkFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBydW50aW1lU2VydmljZTogQ29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlndXJhdGlvblNlcnZpY2U6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICkge31cblxuICBwdWJsaWMgaW5pdCQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuY29uZmlndXJlKCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBhY3Rpb25zLCBzZWxlY3RvcnMgfSA9IHRoaXMucnVudGltZVNlcnZpY2UucnVudGltZUNvbnRleHQ/LnVpRGVmaW5pdGlvbkNvbnRhaW5lciA/PyB7fTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZWZ1bENvbmZpZ3VyYXRpb25BcGlTZXJ2aWNlLmluaXQoe1xuICAgICAgICAgIGl0ZW06IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuZ2VuZXJhdGVSZXF1ZXN0KCksXG4gICAgICAgICAgYWN0aW9uczogYWN0aW9ucz8ubWFwKGFjdGlvbiA9PiAoeyBuYW1lOiBhY3Rpb24uYXBpTmFtZSwgc2NyaXB0OiBhY3Rpb24uc2NyaXB0IH0pKSxcbiAgICAgICAgICBzZWxlY3RvcnM6IHNlbGVjdG9ycz8ubWFwKHNlbGVjdG9yID0+ICh7IG5hbWU6IHNlbGVjdG9yLmFwaU5hbWUsIHNjcmlwdDogc2VsZWN0b3Iuc2NyaXB0IH0pKSxcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIHRhcChzdGF0ZUlkID0+ICh0aGlzLnN0YXRlSWQgPSBzdGF0ZUlkIHx8IG51bGwpKSxcbiAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlSWQgPSBudWxsO1xuICAgIHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLnN0YXRlU3ViaiQubmV4dCh7fSk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZSQocmVxOiBDb25maWd1cmF0aW9uRXhlY3V0ZVJlcXVlc3QpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0YXRlZnVsJChyZXEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlU3RhdGVsZXNzJChyZXEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaCQoYWN0aW9uTmFtZTogc3RyaW5nLCBpbnB1dERhdGE6IHVua25vd24pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlJCh7IGFjdGlvbnM6IFt7IG5hbWU6IGFjdGlvbk5hbWUsIGlucHV0RGF0YSB9XSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3QkKHNlbGVjdG9yTmFtZTogc3RyaW5nLCBpbnB1dERhdGE6IHVua25vd24pOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSBVVUlELlVVSUQoKTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUkKHtcbiAgICAgIHNlbGVjdG9yczoge1xuICAgICAgICBbcmVxdWVzdElkXToge1xuICAgICAgICAgIG5hbWU6IHNlbGVjdG9yTmFtZSxcbiAgICAgICAgICBpbnB1dERhdGEsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gdGhpcy5zdGF0ZVN1YmokLnZhbHVlW3JlcXVlc3RJZF0pLFxuICAgICAgdGFwKCgpID0+IHRoaXMuc3RhdGVTdWJqJC5uZXh0KG9taXQodGhpcy5zdGF0ZVN1YmokLnZhbHVlLCByZXF1ZXN0SWQpKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzU3RhdGVmdWxDb25maWd1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvblByb3BlcnRpZXMuc3RhdGVmdWxDb25maWd1cmF0aW9uRW5hYmxlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVN0YXRlbGVzcyQocmVxdWVzdDogQ29uZmlndXJhdGlvbkV4ZWN1dGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG9mKHVuZGVmaW5lZCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIC8vIEFwcGx5IGFjdGlvbnMgYW5kIGV4ZWN1dGUgY29uZmlndXJhdGlvbi9wcmljZSBjYWxsXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gcnVuIGNvbmZpZ3VyYXRpb24gaWYgbm8gYWN0aW9ucyBpbiB0aGUgcmVxdWVzdFxuICAgICAgICBpZiAoIXJlcXVlc3QuYWN0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlndXJhdGlvblJlcXVlc3QgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdlbmVyYXRlUmVxdWVzdCgpO1xuICAgICAgICByZXF1ZXN0LmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGNvbmZpZ3VyYXRpb25SZXF1ZXN0ID0gdGhpcy5leGVjdXRlQWN0aW9uU2NyaXB0KGNvbmZpZ3VyYXRpb25SZXF1ZXN0LCBhY3Rpb24pID8/IGNvbmZpZ3VyYXRpb25SZXF1ZXN0O1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5jb25maWd1cmVSZXF1ZXN0JChjb25maWd1cmF0aW9uUmVxdWVzdCk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdC5zZWxlY3RvcnMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gc2VsZWN0b3JzIGFuZCBhcHBseSB0aGVtIHRvIHRoZSBzdGF0ZVxuICAgICAgICBjb25zdCBmaW5hbENvbmZpZ3VyYXRpb25SZXF1ZXN0ID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZW5lcmF0ZVJlcXVlc3QoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JzUmVzdWx0ID0gRW50aXR5VXRpbC5lbnRyaWVzKHJlcXVlc3Quc2VsZWN0b3JzKS5yZWR1Y2UoXG4gICAgICAgICAgKHRydW5rOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgW2tleSwgc2VsZWN0b3JdKSA9PiB7XG4gICAgICAgICAgICB0cnVua1trZXldID0gdGhpcy5leGVjdXRlU2VsZWN0b3JTY3JpcHQoZmluYWxDb25maWd1cmF0aW9uUmVxdWVzdCwgc2VsZWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIHRydW5rO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30sXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZVN1YmokLm5leHQoe1xuICAgICAgICAgIC4uLnRoaXMuc3RhdGVTdWJqJC52YWx1ZSxcbiAgICAgICAgICAuLi5zZWxlY3RvcnNSZXN1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlU3RhdGVmdWwkKHJlcXVlc3Q6IENvbmZpZ3VyYXRpb25FeGVjdXRlUmVxdWVzdCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGlmICghdGhpcy5zdGF0ZUlkKSB7XG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZWZ1bENvbmZpZ3VyYXRpb25BcGlTZXJ2aWNlLmV4ZWN1dGUodGhpcy5zdGF0ZUlkLCByZXF1ZXN0KS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZUlkID0gcmVzcG9uc2Uuc3RhdGVJZDtcbiAgICAgICAgY29uc3QgdXBkYXRlZFN0YXRlID0gdGhpcy5zdGF0ZVN1YmokLnZhbHVlO1xuXG4gICAgICAgIEVudGl0eVV0aWwuZW50cmllcyhyZXNwb25zZS5zZWxlY3RvcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmICghdmFsdWUuc3VjY2Vzcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvblByb3BlcnRpZXMuc3VwcHJlc3NUb2FzdE1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmFkZCh7IHN1bW1hcnk6IHZhbHVlLmVycm9yTWVzc2FnZSwgc2V2ZXJpdHk6IFRvYXN0VHlwZS5lcnJvciB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZWRTdGF0ZVtrZXldID0gdmFsdWUucmVzdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN0YXRlU3ViaiQubmV4dCh1cGRhdGVkU3RhdGUpO1xuICAgICAgfSksXG4gICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlQWN0aW9uU2NyaXB0KFxuICAgIHJlcXVlc3Q6IENvbmZpZ3VyYXRpb25SZXF1ZXN0LFxuICAgIHByb2Nlc3NvcjogQ29uZmlndXJhdGlvblJlcXVlc3RBY3Rpb24sXG4gICk6IENvbmZpZ3VyYXRpb25SZXF1ZXN0IHwgbnVsbCB7XG4gICAgY29uc3QgeyBhY3Rpb25zIH0gPSB0aGlzLnJ1bnRpbWVTZXJ2aWNlLnJ1bnRpbWVDb250ZXh0Py51aURlZmluaXRpb25Db250YWluZXIgPz8ge307XG4gICAgY29uc3Qgc2NyaXB0ID0gYWN0aW9ucz8uZmluZChhY3Rpb24gPT4gYWN0aW9uLmFwaU5hbWUgPT09IHByb2Nlc3Nvci5uYW1lKT8uc2NyaXB0O1xuICAgIGlmICghc2NyaXB0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUHJvY2Vzc29yU2NyaXB0KHJlcXVlc3QsIHNjcmlwdCwgcHJvY2Vzc29yLmlucHV0RGF0YSkgYXMgQ29uZmlndXJhdGlvblJlcXVlc3Q7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTZWxlY3RvclNjcmlwdChyZXF1ZXN0OiBDb25maWd1cmF0aW9uUmVxdWVzdCwgcHJvY2Vzc29yOiBDb25maWd1cmF0aW9uUmVxdWVzdFNlbGVjdG9yKTogdW5rbm93biB7XG4gICAgY29uc3QgeyBzZWxlY3RvcnMgfSA9IHRoaXMucnVudGltZVNlcnZpY2UucnVudGltZUNvbnRleHQ/LnVpRGVmaW5pdGlvbkNvbnRhaW5lciA/PyB7fTtcbiAgICBjb25zdCBzY3JpcHQgPSBzZWxlY3RvcnM/LmZpbmQoc2VsZWN0b3IgPT4gc2VsZWN0b3IuYXBpTmFtZSA9PT0gcHJvY2Vzc29yLm5hbWUpPy5zY3JpcHQ7XG4gICAgaWYgKCFzY3JpcHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVQcm9jZXNzb3JTY3JpcHQocmVxdWVzdCwgc2NyaXB0LCBwcm9jZXNzb3IuaW5wdXREYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVByb2Nlc3NvclNjcmlwdChyZXF1ZXN0OiBDb25maWd1cmF0aW9uUmVxdWVzdCwgc2NyaXB0OiBzdHJpbmcsIGlucHV0RGF0YTogdW5rbm93bik6IHVua25vd24ge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb24oYCR7c2NyaXB0fVxcbnJldHVybiB0cmFuc2Zvcm07YCkoKSh7XG4gICAgICByZXF1ZXN0LFxuICAgICAgaW5wdXREYXRhOiBpbnB1dERhdGEsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==