vc-layout 1.2.10 → 1.2.11

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.
@@ -3,19 +3,23 @@ import { LocalStorageService } from '../../shared/services/local-storage.service
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class VcAiAssistantComponent implements OnInit {
5
5
  private localStorageService;
6
- aiAssistantUrl: string;
7
6
  isAiAssistantInitialized: boolean;
8
7
  isAiAssistantMaximized: boolean;
9
8
  isAiAssistantVisible: boolean;
10
- aiAssistantStateClassesChange: EventEmitter<string[]>;
11
- private aiAssistantOrigin;
9
+ aiAssistantUrl: string;
10
+ set isAiAssistantOpen(value: boolean);
11
+ aiAssistantVisibility: EventEmitter<boolean>;
12
12
  constructor(localStorageService: LocalStorageService);
13
13
  ngOnInit(): void;
14
- openFromHeader(): void;
15
14
  onWindowMessage(event: MessageEvent): void;
16
- private setAssistantState;
17
- private setThreadId;
15
+ private applyAssistantState;
16
+ openAiAssistant(): void;
17
+ private handleAssistantMessage;
18
+ private updateAssistantContext;
18
19
  private restoreAssistantState;
20
+ getAiAssistantContainerClasses(): {
21
+ [klass: string]: boolean;
22
+ };
19
23
  static ɵfac: i0.ɵɵFactoryDeclaration<VcAiAssistantComponent, never>;
20
- static ɵcmp: i0.ɵɵComponentDeclaration<VcAiAssistantComponent, "vc-ai-assistant-container", never, { "aiAssistantUrl": { "alias": "aiAssistantUrl"; "required": false; }; }, { "aiAssistantStateClassesChange": "aiAssistantStateClassesChange"; }, never, never, false, never>;
24
+ static ɵcmp: i0.ɵɵComponentDeclaration<VcAiAssistantComponent, "vc-ai-assistant-container", never, { "aiAssistantUrl": { "alias": "aiAssistantUrl"; "required": false; }; "isAiAssistantOpen": { "alias": "isAiAssistantOpen"; "required": false; }; }, { "aiAssistantVisibility": "aiAssistantVisibility"; }, never, never, false, never>;
21
25
  }
@@ -0,0 +1,11 @@
1
+ export interface AssistantStateInterface {
2
+ initialize: boolean;
3
+ maximize: boolean;
4
+ visible: boolean;
5
+ assistant_state: 0 | 1;
6
+ }
7
+ export declare const AssistantStates: {
8
+ maximize: AssistantStateInterface;
9
+ minimize: AssistantStateInterface;
10
+ close: AssistantStateInterface;
11
+ };
@@ -2,10 +2,11 @@ import { EventEmitter, OnInit } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  export declare class AiAssistantComponent implements OnInit {
4
4
  ASSETS: any;
5
- isOpen: boolean;
6
- openAiAssistant: EventEmitter<any>;
5
+ isAiAssistantOpen: boolean;
6
+ openAiAssistant: EventEmitter<boolean>;
7
7
  constructor();
8
8
  ngOnInit(): void;
9
+ onClick(): void;
9
10
  static ɵfac: i0.ɵɵFactoryDeclaration<AiAssistantComponent, never>;
10
- static ɵcmp: i0.ɵɵComponentDeclaration<AiAssistantComponent, "vc-ai-assistant", never, { "isOpen": { "alias": "isOpen"; "required": false; }; }, { "openAiAssistant": "openAiAssistant"; }, never, never, false, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<AiAssistantComponent, "vc-ai-assistant", never, { "isAiAssistantOpen": { "alias": "isAiAssistantOpen"; "required": false; }; }, { "openAiAssistant": "openAiAssistant"; }, never, never, false, never>;
11
12
  }
@@ -23,14 +23,14 @@ export declare class HeaderContainerComponent implements OnInit, OnDestroy {
23
23
  businessCycleChange: EventEmitter<any>;
24
24
  openDialog: EventEmitter<any>;
25
25
  onSearchAction: EventEmitter<any>;
26
- openAiAssistant: EventEmitter<void>;
26
+ openAiAssistant: EventEmitter<boolean>;
27
27
  constructor(apiService: ApiService, layoutService: LayoutService, router: ActivatedRoute);
28
28
  ngOnInit(): void;
29
29
  ngOnDestroy(): void;
30
30
  businessCycleChangeHandler(event: any): void;
31
31
  onRouterChange(): void;
32
32
  get isBusinessCycleVisible(): boolean;
33
- getFlagStatus(): void;
33
+ checkAiAssistantEnabled(): void;
34
34
  checkSnowFallVisibility(): void;
35
35
  checkXmasCapVisibility(): void;
36
36
  static ɵfac: i0.ɵɵFactoryDeclaration<HeaderContainerComponent, never>;
@@ -7,7 +7,7 @@ import * as i5 from "./queue/queue.component";
7
7
  import * as i6 from "./user-details/user-details.component";
8
8
  import * as i7 from "./support/support.component";
9
9
  import * as i8 from "./ai-assistant/ai-assistant.component";
10
- import * as i9 from "../ai-assistant/ai-assistant.component";
10
+ import * as i9 from "../ai-assistant/ai-assistant-container.component";
11
11
  import * as i10 from "@angular/common";
12
12
  import * as i11 from "../../shared/ui-kit/tooltip/tooltip.module";
13
13
  import * as i12 from "../../shared/ui-kit/avatar/avatar.module";
@@ -18,6 +18,6 @@ import * as i16 from "../../shared/pipe/pipes.module";
18
18
  import * as i17 from "@angular/forms";
19
19
  export declare class HeaderModule {
20
20
  static ɵfac: i0.ɵɵFactoryDeclaration<HeaderModule, never>;
21
- static ɵmod: i0.ɵɵNgModuleDeclaration<HeaderModule, [typeof i1.HeaderContainerComponent, typeof i2.BusinessCycleComponent, typeof i3.SearchComponent, typeof i4.CreateWorkflowComponent, typeof i5.QueueComponent, typeof i6.UserDetailsComponent, typeof i7.SupportComponent, typeof i8.AiAssistantComponent, typeof i9.VcAiAssistantComponent], [typeof i10.CommonModule, typeof i11.TooltipModule, typeof i12.AvatarModule, typeof i13.PopoverModule, typeof i14.FormgroupModule, typeof i15.GlobalAlertModule, typeof i16.PipesModule, typeof i17.FormsModule, typeof i14.FormgroupModule], [typeof i1.HeaderContainerComponent, typeof i9.VcAiAssistantComponent]>;
21
+ static ɵmod: i0.ɵɵNgModuleDeclaration<HeaderModule, [typeof i1.HeaderContainerComponent, typeof i2.BusinessCycleComponent, typeof i3.SearchComponent, typeof i4.CreateWorkflowComponent, typeof i5.QueueComponent, typeof i6.UserDetailsComponent, typeof i7.SupportComponent, typeof i8.AiAssistantComponent, typeof i9.VcAiAssistantComponent], [typeof i10.CommonModule, typeof i11.TooltipModule, typeof i12.AvatarModule, typeof i13.PopoverModule, typeof i14.FormgroupModule, typeof i15.GlobalAlertModule, typeof i16.PipesModule, typeof i17.FormsModule, typeof i14.FormgroupModule], [typeof i1.HeaderContainerComponent]>;
22
22
  static ɵinj: i0.ɵɵInjectorDeclaration<HeaderModule>;
23
23
  }
@@ -1,7 +1,7 @@
1
1
  import * as i0 from "@angular/core";
2
2
  export declare class LocalStorageService {
3
- setItem(key: string, value: unknown): void;
4
3
  getItem<T = any>(key: string): T | null;
4
+ setItem(key: string, value: unknown): void;
5
5
  removeItem(key: string): void;
6
6
  static ɵfac: i0.ɵɵFactoryDeclaration<LocalStorageService, never>;
7
7
  static ɵprov: i0.ɵɵInjectableDeclaration<LocalStorageService>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vc-layout",
3
- "version": "1.2.10",
3
+ "version": "1.2.11",
4
4
  "peerDependencies": {
5
5
  "@angular/common": " 12.x || 13.x || 14.x || 15.x || 16.x || 17.x || 18.x || 19.x ",
6
6
  "@angular/core": " 12.x || 13.x || 14.x || 15.x || 16.x || 17.x || 18.x || 19.x "
package/public-api.d.ts CHANGED
@@ -8,4 +8,3 @@ export * from './lib/components/sub-menu/sub-menu-container/sub-menu-container.c
8
8
  export * from './lib/components/product-list/product-list.module';
9
9
  export * from './lib/components/header/header.module';
10
10
  export * from './lib/components/sub-menu/sub-menu.module';
11
- export * from './lib/components/ai-assistant/ai-assistant.component';
@@ -1,100 +0,0 @@
1
- import { Component, EventEmitter, HostListener, Input, Output, } from '@angular/core';
2
- import { ASSISTANT_CONTEXT_KEY, ASSISTANT_URL, } from '../../constants/assistant.constants';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../../shared/services/local-storage.service";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "../../shared/pipe/safe-url.pipe";
7
- export class VcAiAssistantComponent {
8
- constructor(localStorageService) {
9
- this.localStorageService = localStorageService;
10
- this.aiAssistantUrl = window.location.origin + ASSISTANT_URL;
11
- this.isAiAssistantInitialized = false;
12
- this.isAiAssistantMaximized = false;
13
- this.isAiAssistantVisible = false;
14
- this.aiAssistantStateClassesChange = new EventEmitter();
15
- this.aiAssistantOrigin = null;
16
- }
17
- ngOnInit() {
18
- this.aiAssistantOrigin = new URL(this.aiAssistantUrl).origin;
19
- this.restoreAssistantState();
20
- }
21
- openFromHeader() {
22
- this.isAiAssistantInitialized = true;
23
- this.isAiAssistantMaximized = false;
24
- this.isAiAssistantVisible = true;
25
- this.setAssistantState(1);
26
- }
27
- onWindowMessage(event) {
28
- if (this.aiAssistantOrigin && event.origin !== this.aiAssistantOrigin) {
29
- return;
30
- }
31
- const data = event.data || {};
32
- if (!data || !data.type) {
33
- return;
34
- }
35
- const type = data.type;
36
- switch (type) {
37
- case 'assistant.thread': {
38
- const threadId = data.thread?.threadId;
39
- if (threadId) {
40
- this.setThreadId(threadId);
41
- }
42
- this.isAiAssistantInitialized = true;
43
- this.isAiAssistantMaximized = false;
44
- this.isAiAssistantVisible = true;
45
- this.setAssistantState(1);
46
- break;
47
- }
48
- case 'assistant.maximize':
49
- this.isAiAssistantInitialized = true;
50
- this.isAiAssistantMaximized = true;
51
- this.isAiAssistantVisible = true;
52
- this.setAssistantState(1);
53
- break;
54
- case 'assistant.minimize':
55
- this.isAiAssistantInitialized = true;
56
- this.isAiAssistantMaximized = false;
57
- this.isAiAssistantVisible = true;
58
- this.setAssistantState(1);
59
- break;
60
- case 'assistant.close':
61
- this.isAiAssistantMaximized = false;
62
- this.isAiAssistantVisible = false;
63
- this.setAssistantState(0);
64
- break;
65
- default:
66
- break;
67
- }
68
- }
69
- setAssistantState(state) {
70
- const context = this.localStorageService.getItem(ASSISTANT_CONTEXT_KEY) || {};
71
- context.assistant_state = state;
72
- this.localStorageService.setItem(ASSISTANT_CONTEXT_KEY, context);
73
- }
74
- setThreadId(threadId) {
75
- const context = this.localStorageService.getItem(ASSISTANT_CONTEXT_KEY) || {};
76
- context.threadId = threadId;
77
- this.localStorageService.setItem(ASSISTANT_CONTEXT_KEY, context);
78
- }
79
- restoreAssistantState() {
80
- const context = this.localStorageService.getItem(ASSISTANT_CONTEXT_KEY);
81
- if (context && context.assistant_state === 1) {
82
- this.isAiAssistantInitialized = true;
83
- this.isAiAssistantVisible = true;
84
- }
85
- }
86
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VcAiAssistantComponent, deps: [{ token: i1.LocalStorageService }], target: i0.ɵɵFactoryTarget.Component }); }
87
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: VcAiAssistantComponent, selector: "vc-ai-assistant-container", inputs: { aiAssistantUrl: "aiAssistantUrl" }, outputs: { aiAssistantStateClassesChange: "aiAssistantStateClassesChange" }, host: { listeners: { "window:message": "onWindowMessage($event)" } }, ngImport: i0, template: "<div\n [ngClass]=\"{\n 'ai-assistant-container': !isAiAssistantMaximized,\n 'ai-assistant-maximized': isAiAssistantMaximized,\n 'ai-assistant-hidden': !isAiAssistantVisible\n }\"\n>\n <iframe\n *ngIf=\"isAiAssistantInitialized\"\n #iframeElement\n class=\"ai-assistant-iframe\"\n [src]=\"aiAssistantUrl | SafeUrl\"\n frameborder=\"0\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n loading=\"lazy\"\n ></iframe>\n</div>\n\n", styles: [".ai-assistant-container{width:420px;min-width:320px;height:calc(100% - .25rem);background:#fff;border-radius:.75rem;overflow:hidden}.ai-assistant-iframe{width:100%;height:100%;border:none}.ai-assistant-maximized{position:fixed;inset:0;background:#000;z-index:9999;width:calc(100% - .5rem);height:calc(100% - .5rem);top:.25rem;left:.25rem;border-radius:.75rem;overflow:hidden}.ai-assistant-hidden{display:none}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.SafeUrlPipe, name: "SafeUrl" }] }); }
88
- }
89
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VcAiAssistantComponent, decorators: [{
90
- type: Component,
91
- args: [{ selector: 'vc-ai-assistant-container', template: "<div\n [ngClass]=\"{\n 'ai-assistant-container': !isAiAssistantMaximized,\n 'ai-assistant-maximized': isAiAssistantMaximized,\n 'ai-assistant-hidden': !isAiAssistantVisible\n }\"\n>\n <iframe\n *ngIf=\"isAiAssistantInitialized\"\n #iframeElement\n class=\"ai-assistant-iframe\"\n [src]=\"aiAssistantUrl | SafeUrl\"\n frameborder=\"0\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n loading=\"lazy\"\n ></iframe>\n</div>\n\n", styles: [".ai-assistant-container{width:420px;min-width:320px;height:calc(100% - .25rem);background:#fff;border-radius:.75rem;overflow:hidden}.ai-assistant-iframe{width:100%;height:100%;border:none}.ai-assistant-maximized{position:fixed;inset:0;background:#000;z-index:9999;width:calc(100% - .5rem);height:calc(100% - .5rem);top:.25rem;left:.25rem;border-radius:.75rem;overflow:hidden}.ai-assistant-hidden{display:none}\n"] }]
92
- }], ctorParameters: function () { return [{ type: i1.LocalStorageService }]; }, propDecorators: { aiAssistantUrl: [{
93
- type: Input
94
- }], aiAssistantStateClassesChange: [{
95
- type: Output
96
- }], onWindowMessage: [{
97
- type: HostListener,
98
- args: ['window:message', ['$event']]
99
- }] } });
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXNzaXN0YW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZjLWxheW91dC9zcmMvbGliL2NvbXBvbmVudHMvYWktYXNzaXN0YW50L2FpLWFzc2lzdGFudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Yy1sYXlvdXQvc3JjL2xpYi9jb21wb25lbnRzL2FpLWFzc2lzdGFudC9haS1hc3Npc3RhbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixhQUFhLEdBQ2QsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7QUFPN0MsTUFBTSxPQUFPLHNCQUFzQjtJQWNqQyxZQUFvQixtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQVpuRCxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQztRQUVqRSw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFFakMsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUVuQixrQ0FBNkIsR0FBMkIsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUV2RixzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBRWUsQ0FBQztJQUVoRSxRQUFRO1FBQ04sSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDN0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFB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QU8sQ0FBTSxxQkFBcUIsQ0FBQyxDQUFDO1FBRS9ELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEtBQUssQ0FBQyxFQUFFO1lBQzVDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7WUFDckMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztTQUNsQztJQUNILENBQUM7K0dBbkdVLHNCQUFzQjttR0FBdEIsc0JBQXNCLGtRQ25CbkMsbWZBa0JBOzs0RkRDYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsMkJBQTJCOzBHQU01QixjQUFjO3NCQUF0QixLQUFLO2dCQVFJLDZCQUE2QjtzQkFBdEMsTUFBTTtnQkFtQlAsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvY2FsU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbG9jYWwtc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEFTU0lTVEFOVF9DT05URVhUX0tFWSxcbiAgQVNTSVNUQU5UX1VSTCxcbn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2Fzc2lzdGFudC5jb25zdGFudHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2Yy1haS1hc3Npc3RhbnQtY29udGFpbmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FpLWFzc2lzdGFudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FpLWFzc2lzdGFudC5jb21wb25lbnQubGVzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBWY0FpQXNzaXN0YW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBhaUFzc2lzdGFudFVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBBU1NJU1RBTlRfVVJMO1xuXG4gIGlzQWlBc3Npc3RhbnRJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIGlzQWlBc3Npc3RhbnRNYXhpbWl6ZWQgPSBmYWxzZTtcblxuICBpc0FpQXNzaXN0YW50VmlzaWJsZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBhaUFzc2lzdGFudFN0YXRlQ2xhc3Nlc0NoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZ1tdPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgcHJpdmF0ZSBhaUFzc2lzdGFudE9yaWdpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWlBc3Npc3RhbnRPcmlnaW4gPSBuZXcgVVJMKHRoaXMuYWlBc3Npc3RhbnRVcmwpLm9yaWdpbjtcbiAgICB0aGlzLnJlc3RvcmVBc3Npc3RhbnRTdGF0ZSgpO1xuICB9XG5cbiAgb3BlbkZyb21IZWFkZXIoKSB7XG4gICAgdGhpcy5pc0FpQXNzaXN0YW50SW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaXNBaUFzc2lzdGFudE1heGltaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNBaUFzc2lzdGFudFZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuc2V0QXNzaXN0YW50U3RhdGUoMSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bWVzc2FnZScsIFsnJGV2ZW50J10pXG4gIG9uV2luZG93TWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuYWlBc3Npc3RhbnRPcmlnaW4gJiYgZXZlbnQub3JpZ2luICE9PSB0aGlzLmFpQXNzaXN0YW50T3JpZ2luKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogYW55ID0gZXZlbnQuZGF0YSB8fCB7fTtcbiAgICBpZiAoIWRhdGEgfHwgIWRhdGEudHlwZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSBkYXRhLnR5cGUgYXMgc3RyaW5nO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhc3Npc3RhbnQudGhyZWFkJzoge1xuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IGRhdGEudGhyZWFkPy50aHJlYWRJZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aHJlYWRJZCkge1xuICAgICAgICAgIHRoaXMuc2V0VGhyZWFkSWQodGhyZWFkSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNBaUFzc2lzdGFudEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0FpQXNzaXN0YW50TWF4aW1pemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNBaUFzc2lzdGFudFZpc2libGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldEFzc2lzdGFudFN0YXRlKDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Fzc2lzdGFudC5tYXhpbWl6ZSc6XG4gICAgICAgIHRoaXMuaXNBaUFzc2lzdGFudEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0FpQXNzaXN0YW50TWF4aW1pemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0FpQXNzaXN0YW50VmlzaWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0QXNzaXN0YW50U3RhdGUoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXNzaXN0YW50Lm1pbmltaXplJzpcbiAgICAgICAgdGhpcy5pc0FpQXNzaXN0YW50SW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmlzQWlBc3Npc3RhbnRNYXhpbWl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0FpQXNzaXN0YW50VmlzaWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0QXNzaXN0YW50U3RhdGUoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXNzaXN0YW50LmNsb3NlJzpcbiAgICAgICAgdGhpcy5pc0FpQXNzaXN0YW50TWF4aW1pemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNBaUFzc2lzdGFudFZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRBc3Npc3RhbnRTdGF0ZSgwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEFzc2lzdGFudFN0YXRlKHN0YXRlOiAwIHwgMSkge1xuICAgIGNvbnN0IGNvbnRleHQgPVxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW08YW55PihBU1NJU1RBTlRfQ09OVEVYVF9LRVkpIHx8IHt9O1xuXG4gICAgY29udGV4dC5hc3Npc3RhbnRfc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShBU1NJU1RBTlRfQ09OVEVYVF9LRVksIGNvbnRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUaHJlYWRJZCh0aHJlYWRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29udGV4dCA9XG4gICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbTxhbnk+KEFTU0lTVEFOVF9DT05URVhUX0tFWSkgfHwge307XG5cbiAgICBjb250ZXh0LnRocmVhZElkID0gdGhyZWFkSWQ7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oQVNTSVNUQU5UX0NPTlRFWFRfS0VZLCBjb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUFzc2lzdGFudFN0YXRlKCkge1xuICAgIGNvbnN0IGNvbnRleHQgPVxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW08YW55PihBU1NJU1RBTlRfQ09OVEVYVF9LRVkpO1xuXG4gICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5hc3Npc3RhbnRfc3RhdGUgPT09IDEpIHtcbiAgICAgIHRoaXMuaXNBaUFzc2lzdGFudEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNBaUFzc2lzdGFudFZpc2libGUgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG4iLCI8ZGl2XG4gIFtuZ0NsYXNzXT1cIntcbiAgICAnYWktYXNzaXN0YW50LWNvbnRhaW5lcic6ICFpc0FpQXNzaXN0YW50TWF4aW1pemVkLFxuICAgICdhaS1hc3Npc3RhbnQtbWF4aW1pemVkJzogaXNBaUFzc2lzdGFudE1heGltaXplZCxcbiAgICAnYWktYXNzaXN0YW50LWhpZGRlbic6ICFpc0FpQXNzaXN0YW50VmlzaWJsZVxuICB9XCJcbj5cbiAgICA8aWZyYW1lXG4gICAgICAgICpuZ0lmPVwiaXNBaUFzc2lzdGFudEluaXRpYWxpemVkXCJcbiAgICAgICAgI2lmcmFtZUVsZW1lbnRcbiAgICAgICAgY2xhc3M9XCJhaS1hc3Npc3RhbnQtaWZyYW1lXCJcbiAgICAgICAgW3NyY109XCJhaUFzc2lzdGFudFVybCB8IFNhZmVVcmxcIlxuICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICByZWZlcnJlcnBvbGljeT1cInN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW5cIlxuICAgICAgICBsb2FkaW5nPVwibGF6eVwiXG4gICAgPjwvaWZyYW1lPlxuPC9kaXY+XG5cbiJdfQ==