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.
- package/esm2022/lib/components/ai-assistant/ai-assistant-container.component.mjs +107 -0
- package/esm2022/lib/components/ai-assistant/assistant-state.config.mjs +21 -0
- package/esm2022/lib/components/header/ai-assistant/ai-assistant.component.mjs +14 -8
- package/esm2022/lib/components/header/header-container/header-container.component.mjs +5 -5
- package/esm2022/lib/components/header/header.module.mjs +4 -4
- package/esm2022/lib/shared/services/local-storage.service.mjs +11 -8
- package/esm2022/public-api.mjs +1 -2
- package/fesm2022/vc-layout.mjs +99 -63
- package/fesm2022/vc-layout.mjs.map +1 -1
- package/lib/components/ai-assistant/{ai-assistant.component.d.ts → ai-assistant-container.component.d.ts} +11 -7
- package/lib/components/ai-assistant/assistant-state.config.d.ts +11 -0
- package/lib/components/header/ai-assistant/ai-assistant.component.d.ts +4 -3
- package/lib/components/header/header-container/header-container.component.d.ts +2 -2
- package/lib/components/header/header.module.d.ts +2 -2
- package/lib/shared/services/local-storage.service.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +0 -1
- package/esm2022/lib/components/ai-assistant/ai-assistant.component.mjs +0 -100
|
@@ -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
|
-
|
|
11
|
-
|
|
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
|
|
17
|
-
|
|
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; }; }, { "
|
|
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
|
-
|
|
6
|
-
openAiAssistant: EventEmitter<
|
|
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, { "
|
|
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<
|
|
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
|
-
|
|
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
|
|
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
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==
|