@datarailsshared/datarailsshared 1.6.25 → 1.6.29

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.
@@ -39,5 +39,5 @@ export declare class DrChatComponent implements AfterViewInit, OnDestroy {
39
39
  clearHiddenSuggestions(): void;
40
40
  hideSuggestions(): void;
41
41
  static ɵfac: i0.ɵɵFactoryDeclaration<DrChatComponent, never>;
42
- static ɵcmp: i0.ɵɵComponentDeclaration<DrChatComponent, "dr-chat", never, { "fullScreen": { "alias": "fullScreen"; "required": false; }; "noMessagesPlaceholder": { "alias": "noMessagesPlaceholder"; "required": false; }; "contentUpdateSubject": { "alias": "contentUpdateSubject"; "required": false; }; "scrollBottom": { "alias": "scrollBottom"; "required": false; }; "suggestions": { "alias": "suggestions"; "required": false; }; "reopen": { "alias": "reopen"; "required": false; }; "waitForReply": { "alias": "waitForReply"; "required": false; }; }, { "suggestionSelect": "suggestionSelect"; }, ["chatForm", "chatHeader", "messages"], ["dr-chat-alert", "dr-chat-message", "dr-chat-form", "dr-chat-form-with-history"], false, never>;
42
+ static ɵcmp: i0.ɵɵComponentDeclaration<DrChatComponent, "dr-chat", never, { "fullScreen": { "alias": "fullScreen"; "required": false; }; "noMessagesPlaceholder": { "alias": "noMessagesPlaceholder"; "required": false; }; "contentUpdateSubject": { "alias": "contentUpdateSubject"; "required": false; }; "scrollBottom": { "alias": "scrollBottom"; "required": false; }; "suggestions": { "alias": "suggestions"; "required": false; }; "reopen": { "alias": "reopen"; "required": false; }; "waitForReply": { "alias": "waitForReply"; "required": false; }; }, { "suggestionSelect": "suggestionSelect"; }, ["chatForm", "chatHeader", "messages"], ["dr-chat-alert", "dr-chat-message", "dr-chat-form", "dr-ai-search-input"], false, never>;
43
43
  }
@@ -2,7 +2,7 @@ import * as i0 from "@angular/core";
2
2
  import * as i1 from "./chat.component";
3
3
  import * as i2 from "./dr-chat-message/chat-message.component";
4
4
  import * as i3 from "./dr-chat-form/chat-form.component";
5
- import * as i4 from "./dr-chat-form-with-history/chat-form-with-history.component";
5
+ import * as i4 from "./dr-chat-form-dropdown/dr-chat-form-dropdown.component";
6
6
  import * as i5 from "./dr-chat-message/dr-chat-message-text/chat-message-text.component";
7
7
  import * as i6 from "./dr-chat-message/dr-chat-message-file/chat-message-file.component";
8
8
  import * as i7 from "./dr-chat-suggestions/chat-suggestions.component";
@@ -19,6 +19,6 @@ import * as i17 from "../dr-tooltip/dr-tooltip.module";
19
19
  import * as i18 from "../directives/click-outside/click-outside.module";
20
20
  export declare class DrChatModule {
21
21
  static ɵfac: i0.ɵɵFactoryDeclaration<DrChatModule, never>;
22
- static ɵmod: i0.ɵɵNgModuleDeclaration<DrChatModule, [typeof i1.DrChatComponent, typeof i2.DrChatMessageComponent, typeof i3.DrChatFormComponent, typeof i4.DrChatFormWithHistoryComponent, typeof i5.DrChatMessageTextComponent, typeof i6.DrChatMessageFileComponent, typeof i7.DrChatSuggestionsComponent, typeof i8.DrDotFlashingComponent, typeof i9.DrChatAlertComponent, typeof i10.DrChatDroppedFilesComponent, typeof i11.DrChatCustomMessageDirective, typeof i12.ShorterNamingPipe], [typeof i13.FormsModule, typeof i13.ReactiveFormsModule, typeof i14.CommonModule, typeof i15.DrAvatarModule, typeof i16.DrInputsModule, typeof i17.DrTooltipModule, typeof i18.ClickOutsideModule], [typeof i1.DrChatComponent, typeof i2.DrChatMessageComponent, typeof i3.DrChatFormComponent, typeof i4.DrChatFormWithHistoryComponent, typeof i5.DrChatMessageTextComponent, typeof i6.DrChatMessageFileComponent, typeof i7.DrChatSuggestionsComponent, typeof i8.DrDotFlashingComponent, typeof i9.DrChatAlertComponent, typeof i10.DrChatDroppedFilesComponent, typeof i11.DrChatCustomMessageDirective]>;
22
+ static ɵmod: i0.ɵɵNgModuleDeclaration<DrChatModule, [typeof i1.DrChatComponent, typeof i2.DrChatMessageComponent, typeof i3.DrChatFormComponent, typeof i4.DrChatFormDropdownComponent, typeof i5.DrChatMessageTextComponent, typeof i6.DrChatMessageFileComponent, typeof i7.DrChatSuggestionsComponent, typeof i8.DrDotFlashingComponent, typeof i9.DrChatAlertComponent, typeof i10.DrChatDroppedFilesComponent, typeof i11.DrChatCustomMessageDirective, typeof i12.ShorterNamingPipe], [typeof i13.FormsModule, typeof i13.ReactiveFormsModule, typeof i14.CommonModule, typeof i15.DrAvatarModule, typeof i16.DrInputsModule, typeof i17.DrTooltipModule, typeof i18.ClickOutsideModule], [typeof i1.DrChatComponent, typeof i2.DrChatMessageComponent, typeof i3.DrChatFormComponent, typeof i4.DrChatFormDropdownComponent, typeof i5.DrChatMessageTextComponent, typeof i6.DrChatMessageFileComponent, typeof i7.DrChatSuggestionsComponent, typeof i8.DrDotFlashingComponent, typeof i9.DrChatAlertComponent, typeof i10.DrChatDroppedFilesComponent, typeof i11.DrChatCustomMessageDirective]>;
23
23
  static ɵinj: i0.ɵɵInjectorDeclaration<DrChatModule>;
24
24
  }
@@ -3,7 +3,7 @@ import { DomSanitizer } from '@angular/platform-browser';
3
3
  import { IFIle } from '../../models/chat';
4
4
  import { BehaviorSubject } from 'rxjs';
5
5
  import * as i0 from "@angular/core";
6
- export declare class DrChatFormWithHistoryComponent {
6
+ export declare class DrChatFormDropdownComponent {
7
7
  protected cdr: ChangeDetectorRef;
8
8
  protected domSanitizer: DomSanitizer;
9
9
  textAreaElementRef: ElementRef;
@@ -12,8 +12,6 @@ export declare class DrChatFormWithHistoryComponent {
12
12
  inputFocus: boolean;
13
13
  inputHover: boolean;
14
14
  droppedFiles$: BehaviorSubject<IFIle[]>;
15
- isShowedHistory: boolean;
16
- isChatMode: boolean;
17
15
  isLoading: boolean;
18
16
  /**
19
17
  * Predefined message text
@@ -60,7 +58,7 @@ export declare class DrChatFormWithHistoryComponent {
60
58
  files: IFIle[];
61
59
  }>;
62
60
  uploadFiles: EventEmitter<IFIle[]>;
63
- abort: EventEmitter<any>;
61
+ abort: EventEmitter<void>;
64
62
  /**
65
63
  * Emits when message input value has been changed
66
64
  *
@@ -70,19 +68,16 @@ export declare class DrChatFormWithHistoryComponent {
70
68
  fileOver: boolean;
71
69
  constructor(cdr: ChangeDetectorRef, domSanitizer: DomSanitizer);
72
70
  onDrop(event: any): void;
73
- removeFile(file: any): void;
71
+ removeFile(file: IFIle): void;
74
72
  onDragOver(event: DragEvent): void;
75
73
  onDragLeave(event: DragEvent): void;
76
- sendMessage($event: any): void;
74
+ sendMessage($event: Event | KeyboardEvent): void;
77
75
  abortMessage(): void;
78
76
  onModelChange(value: string): void;
79
77
  getTextAreaHeight(textAreaElement: HTMLTextAreaElement): string;
80
- getSendButtonPosition(textAreaElement: HTMLTextAreaElement): string;
81
- showHistory(): void;
82
- closeHistory(): void;
83
78
  onFileSelected(event: Event): void;
84
79
  private saveFiles;
85
80
  private base64Convert;
86
- static ɵfac: i0.ɵɵFactoryDeclaration<DrChatFormWithHistoryComponent, never>;
87
- static ɵcmp: i0.ɵɵComponentDeclaration<DrChatFormWithHistoryComponent, "dr-chat-form-with-history", never, { "isChatMode": { "alias": "isChatMode"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; "message": { "alias": "message"; "required": false; }; "messagePlaceholder": { "alias": "messagePlaceholder"; "required": false; }; "dropFiles": { "alias": "dropFiles"; "required": false; }; "dropFilePlaceholder": { "alias": "dropFilePlaceholder"; "required": false; }; "waitForReply": { "alias": "waitForReply"; "required": false; }; "showDotFlashing": { "alias": "showDotFlashing"; "required": false; }; }, { "send": "send"; "uploadFiles": "uploadFiles"; "abort": "abort"; "inputChange": "inputChange"; }, never, ["*"], false, never>;
81
+ static ɵfac: i0.ɵɵFactoryDeclaration<DrChatFormDropdownComponent, never>;
82
+ static ɵcmp: i0.ɵɵComponentDeclaration<DrChatFormDropdownComponent, "dr-chat-form-dropdown", never, { "isLoading": { "alias": "isLoading"; "required": false; }; "message": { "alias": "message"; "required": false; }; "messagePlaceholder": { "alias": "messagePlaceholder"; "required": false; }; "dropFiles": { "alias": "dropFiles"; "required": false; }; "dropFilePlaceholder": { "alias": "dropFilePlaceholder"; "required": false; }; "waitForReply": { "alias": "waitForReply"; "required": false; }; "showDotFlashing": { "alias": "showDotFlashing"; "required": false; }; }, { "send": "send"; "uploadFiles": "uploadFiles"; "abort": "abort"; "inputChange": "inputChange"; }, never, ["*"], false, never>;
88
83
  }
@@ -11,6 +11,8 @@ export declare class DrDropdownDirective<T> implements OnDestroy {
11
11
  drDropdownClass: string;
12
12
  drDropdownInHover: boolean;
13
13
  dataAnalytics: string;
14
+ drDropdownPositionOffsetX: number;
15
+ drDropdownPositionOffsetY: number;
14
16
  drDropdownAction: EventEmitter<IDropdownAction<T>>;
15
17
  dropdownClosed: EventEmitter<void>;
16
18
  dropdownOpened: EventEmitter<void>;
@@ -24,7 +26,7 @@ export declare class DrDropdownDirective<T> implements OnDestroy {
24
26
  private close;
25
27
  ngOnDestroy(): void;
26
28
  static ɵfac: i0.ɵɵFactoryDeclaration<DrDropdownDirective<any>, never>;
27
- static ɵdir: i0.ɵɵDirectiveDeclaration<DrDropdownDirective<any>, "[drDropdown]", never, { "drDropdown": { "alias": "drDropdown"; "required": true; }; "drDropdownPosition": { "alias": "drDropdownPosition"; "required": false; }; "drDropdownClass": { "alias": "drDropdownClass"; "required": false; }; "drDropdownInHover": { "alias": "drDropdownInHover"; "required": false; }; "dataAnalytics": { "alias": "data-analytics"; "required": false; }; }, { "drDropdownAction": "drDropdownAction"; "dropdownClosed": "drDropdownClose"; "dropdownOpened": "drDropdownOpened"; }, never, never, false, never>;
29
+ static ɵdir: i0.ɵɵDirectiveDeclaration<DrDropdownDirective<any>, "[drDropdown]", never, { "drDropdown": { "alias": "drDropdown"; "required": true; }; "drDropdownPosition": { "alias": "drDropdownPosition"; "required": false; }; "drDropdownClass": { "alias": "drDropdownClass"; "required": false; }; "drDropdownInHover": { "alias": "drDropdownInHover"; "required": false; }; "dataAnalytics": { "alias": "data-analytics"; "required": false; }; "drDropdownPositionOffsetX": { "alias": "drDropdownPositionOffsetX"; "required": false; }; "drDropdownPositionOffsetY": { "alias": "drDropdownPositionOffsetY"; "required": false; }; }, { "drDropdownAction": "drDropdownAction"; "dropdownClosed": "drDropdownClose"; "dropdownOpened": "drDropdownOpened"; }, never, never, false, never>;
28
30
  }
29
31
  export declare class DrDropdownChildDirective {
30
32
  static ɵfac: i0.ɵɵFactoryDeclaration<DrDropdownChildDirective, never>;
@@ -5,11 +5,13 @@ import { IDrPopoverComponentModel } from '../models/popover';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class DrDropdownService {
7
7
  private readonly popoverService;
8
- open({ hostRef, options, position, asChild, providers, action$, }: Pick<IDrPopoverComponentModel, 'hostRef' | 'position'> & {
8
+ open({ hostRef, options, position, asChild, providers, action$, positionOffsetX, positionOffsetY, }: Pick<IDrPopoverComponentModel, 'hostRef' | 'position'> & {
9
9
  options: IDropdown<IDropdownItem<unknown>>;
10
10
  asChild?: boolean;
11
11
  providers?: StaticProvider[];
12
12
  action$?: EventEmitter<IDropdownAction<unknown>>;
13
+ positionOffsetX?: number;
14
+ positionOffsetY?: number;
13
15
  }): import("../dr-popover/dr-popover-ref").DrPopoverRef<DrDropdownComponent>;
14
16
  static ɵfac: i0.ɵɵFactoryDeclaration<DrDropdownService, never>;
15
17
  static ɵprov: i0.ɵɵInjectableDeclaration<DrDropdownService>;
@@ -19,6 +19,8 @@ export interface IDrPopoverComponentModel<C = any> {
19
19
  targetElement?: HTMLElement;
20
20
  alignment?: DrPopoverAlignment;
21
21
  freezeToContainerSelector?: string;
22
+ positionOffsetX?: number;
23
+ positionOffsetY?: number;
22
24
  }
23
25
  export interface DrPopoverConfig extends OverlayConfig {
24
26
  closeOnBackdropClick?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datarailsshared/datarailsshared",
3
- "version": "1.6.25",
3
+ "version": "1.6.29",
4
4
  "description": "DataRails shared components",
5
5
  "keywords": [
6
6
  "angular",
package/public-api.d.ts CHANGED
@@ -29,7 +29,7 @@ export * from './lib/dr-tooltip/components/tooltip-info/tooltip-info.component';
29
29
  export * from './lib/stepper/stepper.component';
30
30
  export * from './lib/dr-chat/chat.component';
31
31
  export * from './lib/dr-chat/dr-chat-form/chat-form.component';
32
- export * from './lib/dr-chat/dr-chat-form-with-history/chat-form-with-history.component';
32
+ export * from './lib/dr-chat/dr-chat-form-dropdown/dr-chat-form-dropdown.component';
33
33
  export * from './lib/dr-chat/dr-chat-dropped-files/dr-chat-dropped-files.component';
34
34
  export * from './lib/dr-chat/dr-chat-suggestions/chat-suggestions.component';
35
35
  export * from './lib/dr-chat/dr-chat-message/chat-message.component';
@@ -1,392 +0,0 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core';
2
- import { DomSanitizer } from '@angular/platform-browser';
3
- import { trigger, state, style, transition, animate, query, animateChild } from '@angular/animations';
4
- import { BehaviorSubject } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/platform-browser";
7
- import * as i2 from "@angular/forms";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "../../directives/click-outside/click-outside.directive";
10
- import * as i5 from "../dr-dot-flashing/dr-dot-flashing.component";
11
- import * as i6 from "../dr-chat-dropped-files/dr-chat-dropped-files.component";
12
- const _c0 = ["textAreaElement"];
13
- const _c1 = ["fileInput"];
14
- function DrChatFormWithHistoryComponent_dr_chat_dropped_files_2_Template(rf, ctx) { if (rf & 1) {
15
- const _r8 = i0.ɵɵgetCurrentView();
16
- i0.ɵɵelementStart(0, "dr-chat-dropped-files", 15);
17
- i0.ɵɵlistener("removeFileEvent", function DrChatFormWithHistoryComponent_dr_chat_dropped_files_2_Template_dr_chat_dropped_files_removeFileEvent_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r7.removeFile($event)); });
18
- i0.ɵɵpipe(1, "async");
19
- i0.ɵɵelementEnd();
20
- } if (rf & 2) {
21
- const ctx_r0 = i0.ɵɵnextContext();
22
- i0.ɵɵproperty("files", i0.ɵɵpipeBind1(1, 3, ctx_r0.droppedFiles$))("isRemovable", true)("maxLengthText", 15);
23
- } }
24
- function DrChatFormWithHistoryComponent_i_14_Template(rf, ctx) { if (rf & 1) {
25
- const _r10 = i0.ɵɵgetCurrentView();
26
- i0.ɵɵelementStart(0, "i", 16);
27
- i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_i_14_Template_i_click_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r9 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r9.sendMessage($event)); });
28
- i0.ɵɵelementEnd();
29
- } if (rf & 2) {
30
- const ctx_r3 = i0.ɵɵnextContext();
31
- const _r1 = i0.ɵɵreference(6);
32
- i0.ɵɵstyleMap(ctx_r3.getSendButtonPosition(_r1));
33
- } }
34
- function DrChatFormWithHistoryComponent_i_15_Template(rf, ctx) { if (rf & 1) {
35
- const _r12 = i0.ɵɵgetCurrentView();
36
- i0.ɵɵelementStart(0, "i", 17);
37
- i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_i_15_Template_i_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.abortMessage()); });
38
- i0.ɵɵelementEnd();
39
- } if (rf & 2) {
40
- const ctx_r4 = i0.ɵɵnextContext();
41
- const _r1 = i0.ɵɵreference(6);
42
- i0.ɵɵstyleMap(ctx_r4.getSendButtonPosition(_r1));
43
- } }
44
- function DrChatFormWithHistoryComponent_dr_dot_flashing_16_Template(rf, ctx) { if (rf & 1) {
45
- i0.ɵɵelement(0, "dr-dot-flashing", 18);
46
- } }
47
- function DrChatFormWithHistoryComponent_ng_container_17_Template(rf, ctx) { if (rf & 1) {
48
- const _r14 = i0.ɵɵgetCurrentView();
49
- i0.ɵɵelementContainerStart(0);
50
- i0.ɵɵelementStart(1, "div", 19);
51
- i0.ɵɵlistener("clickOutside", function DrChatFormWithHistoryComponent_ng_container_17_Template_div_clickOutside_1_listener() { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r13.closeHistory()); });
52
- i0.ɵɵprojection(2);
53
- i0.ɵɵelementEnd();
54
- i0.ɵɵelementContainerEnd();
55
- } if (rf & 2) {
56
- const ctx_r6 = i0.ɵɵnextContext();
57
- i0.ɵɵadvance(1);
58
- i0.ɵɵproperty("@dropdownAnimation", ctx_r6.isShowedHistory ? "visible" : "hidden")("exclude", ".dr-icon-history");
59
- } }
60
- const _c2 = function (a0) { return { "message-row_loading": a0 }; };
61
- const _c3 = function (a0) { return { height: a0 }; };
62
- const _c4 = function (a0, a1) { return { value: a0, params: a1 }; };
63
- const _c5 = function (a0, a1, a2) { return { "message-row__input--focused": a0, "message-row__input--filled": a1, "showed-dropdown": a2 }; };
64
- const _c6 = ["*"];
65
- export class DrChatFormWithHistoryComponent {
66
- constructor(cdr, domSanitizer) {
67
- this.cdr = cdr;
68
- this.domSanitizer = domSanitizer;
69
- this._textareaInitialHeight = true;
70
- this.inputFocus = false;
71
- this.inputHover = false;
72
- this.droppedFiles$ = new BehaviorSubject([]);
73
- this.isShowedHistory = false;
74
- this.isChatMode = false;
75
- this.isLoading = false;
76
- /**
77
- * Predefined message text
78
- *
79
- * @type {string}
80
- */
81
- this.message = '';
82
- /**
83
- * Message placeholder text
84
- *
85
- * @type {string}
86
- */
87
- this.messagePlaceholder = 'Type a message';
88
- /**
89
- * Show send button
90
- *
91
- * @type {boolean}
92
- */
93
- this.dropFiles = false;
94
- /**
95
- * File drop placeholder text
96
- *
97
- * @type {string}
98
- */
99
- this.dropFilePlaceholder = 'Drop file to send';
100
- /**
101
- * Parameter to check is send message function available
102
- *
103
- * @type {boolean}
104
- */
105
- this.waitForReply = false;
106
- /**
107
- * Parameter to check is send message function available
108
- *
109
- * @type {boolean}
110
- */
111
- this.showDotFlashing = false;
112
- /**
113
- *
114
- * @type {EventEmitter<{ message: string, files: IFile[] }>}
115
- */
116
- this.send = new EventEmitter();
117
- this.uploadFiles = new EventEmitter();
118
- this.abort = new EventEmitter();
119
- /**
120
- * Emits when message input value has been changed
121
- *
122
- * @type {EventEmitter<string>}
123
- */
124
- this.inputChange = new EventEmitter();
125
- this.fileOver = false;
126
- }
127
- onDrop(event) {
128
- if (this.dropFiles) {
129
- event.preventDefault();
130
- event.stopPropagation();
131
- this.fileOver = false;
132
- const files = event.dataTransfer?.files;
133
- if (files) {
134
- this.saveFiles(files);
135
- }
136
- }
137
- }
138
- removeFile(file) {
139
- const droppedFiles = this.droppedFiles$.value;
140
- const index = droppedFiles.indexOf(file);
141
- if (index >= 0) {
142
- droppedFiles.splice(index, 1);
143
- this.droppedFiles$.next(droppedFiles);
144
- }
145
- }
146
- onDragOver(event) {
147
- event.preventDefault();
148
- event.stopPropagation();
149
- if (this.dropFiles) {
150
- this.fileOver = true;
151
- }
152
- }
153
- onDragLeave(event) {
154
- event.preventDefault();
155
- event.stopPropagation();
156
- if (this.dropFiles) {
157
- this.fileOver = false;
158
- }
159
- }
160
- sendMessage($event) {
161
- if (!$event || !$event.shiftKey) {
162
- $event?.preventDefault();
163
- $event?.stopPropagation();
164
- if (this.waitForReply) {
165
- return;
166
- }
167
- else if (this.droppedFiles$.value.length || String(this.message).trim().length) {
168
- this._textareaInitialHeight = true;
169
- this.send.emit({ message: this.message, files: this.droppedFiles$.value });
170
- this.message = '';
171
- this.droppedFiles$.next([]);
172
- this.cdr.markForCheck();
173
- }
174
- }
175
- }
176
- abortMessage() {
177
- this.abort.emit();
178
- }
179
- onModelChange(value) {
180
- this._textareaInitialHeight = false;
181
- this.inputChange.emit(value);
182
- }
183
- getTextAreaHeight(textAreaElement) {
184
- if (this._textareaInitialHeight) {
185
- textAreaElement.style.height = '48px';
186
- }
187
- else {
188
- textAreaElement.style.height = 'auto';
189
- textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
190
- }
191
- return `${textAreaElement.style.height}`;
192
- }
193
- getSendButtonPosition(textAreaElement) {
194
- return `top: calc(${this.getTextAreaHeight(textAreaElement)} - var(--send-button-offset));`;
195
- }
196
- showHistory() {
197
- this.isShowedHistory = !this.isShowedHistory;
198
- }
199
- closeHistory() {
200
- this.isShowedHistory = false;
201
- this.cdr.markForCheck();
202
- }
203
- onFileSelected(event) {
204
- const input = event.target;
205
- this.fileOver = false;
206
- if (input.files.length) {
207
- this.saveFiles(Array.from(input.files));
208
- }
209
- this.fileInput.nativeElement.value = '';
210
- }
211
- async saveFiles(files) {
212
- const uploadedFiles = [];
213
- for (const file of files) {
214
- let res = file;
215
- res.data = (await this.base64Convert(res));
216
- this.droppedFiles$.next([...this.droppedFiles$.value, res]);
217
- uploadedFiles.push(res);
218
- this.cdr.markForCheck();
219
- this.cdr.detectChanges();
220
- }
221
- this.uploadFiles.emit(uploadedFiles.map((item) => ({ data: item.data, name: item.name })));
222
- }
223
- base64Convert(file) {
224
- return new Promise((resolve, reject) => {
225
- const reader = new FileReader();
226
- reader.onload = () => resolve(reader.result);
227
- reader.onerror = (error) => reject(error);
228
- reader.readAsDataURL(file);
229
- });
230
- }
231
- /** @nocollapse */ static { this.ɵfac = function DrChatFormWithHistoryComponent_Factory(t) { return new (t || DrChatFormWithHistoryComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.DomSanitizer)); }; }
232
- /** @nocollapse */ static { this.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DrChatFormWithHistoryComponent, selectors: [["dr-chat-form-with-history"]], viewQuery: function DrChatFormWithHistoryComponent_Query(rf, ctx) { if (rf & 1) {
233
- i0.ɵɵviewQuery(_c0, 5);
234
- i0.ɵɵviewQuery(_c1, 5);
235
- } if (rf & 2) {
236
- let _t;
237
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.textAreaElementRef = _t.first);
238
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fileInput = _t.first);
239
- } }, hostVars: 2, hostBindings: function DrChatFormWithHistoryComponent_HostBindings(rf, ctx) { if (rf & 1) {
240
- i0.ɵɵlistener("drop", function DrChatFormWithHistoryComponent_drop_HostBindingHandler($event) { return ctx.onDrop($event); })("dragover", function DrChatFormWithHistoryComponent_dragover_HostBindingHandler($event) { return ctx.onDragOver($event); })("dragleave", function DrChatFormWithHistoryComponent_dragleave_HostBindingHandler($event) { return ctx.onDragLeave($event); });
241
- } if (rf & 2) {
242
- i0.ɵɵclassProp("file-over", ctx.fileOver);
243
- } }, inputs: { isChatMode: "isChatMode", isLoading: "isLoading", message: "message", messagePlaceholder: "messagePlaceholder", dropFiles: "dropFiles", dropFilePlaceholder: "dropFilePlaceholder", waitForReply: "waitForReply", showDotFlashing: "showDotFlashing" }, outputs: { send: "send", uploadFiles: "uploadFiles", abort: "abort", inputChange: "inputChange" }, ngContentSelectors: _c6, decls: 18, vars: 27, consts: [[1, "message-row", 3, "ngClass"], [1, "message-row__input", 3, "ngClass"], [3, "files", "isRemovable", "maxLengthText", "removeFileEvent", 4, "ngIf"], [1, "message-row__input-textarea-wrap"], ["type", "text", 3, "ngModel", "rows", "placeholder", "focus", "blur", "mouseenter", "mouseleave", "ngModelChange", "keydown.enter"], ["textAreaElement", ""], [1, "message-input-tmp"], ["type", "file", "hidden", "", "multiple", "", 3, "change"], ["fileInput", ""], [1, "dr-icon-history", 3, "click"], [1, "dr-icon-attachment", 3, "click"], ["class", "dr-icon-send-arrow-up send-button", 3, "style", "click", 4, "ngIf"], ["class", "dr-icon-stop abort-button", 3, "style", "click", 4, "ngIf"], ["class", "wait-reply-dot-flashing", 4, "ngIf"], [4, "ngIf"], [3, "files", "isRemovable", "maxLengthText", "removeFileEvent"], [1, "dr-icon-send-arrow-up", "send-button", 3, "click"], [1, "dr-icon-stop", "abort-button", 3, "click"], [1, "wait-reply-dot-flashing"], [1, "history-dropdown", 3, "exclude", "clickOutside"]], template: function DrChatFormWithHistoryComponent_Template(rf, ctx) { if (rf & 1) {
244
- const _r15 = i0.ɵɵgetCurrentView();
245
- i0.ɵɵprojectionDef();
246
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
247
- i0.ɵɵtemplate(2, DrChatFormWithHistoryComponent_dr_chat_dropped_files_2_Template, 2, 5, "dr-chat-dropped-files", 2);
248
- i0.ɵɵpipe(3, "async");
249
- i0.ɵɵelementStart(4, "div", 3)(5, "textarea", 4, 5);
250
- i0.ɵɵlistener("focus", function DrChatFormWithHistoryComponent_Template_textarea_focus_5_listener() { return ctx.inputFocus = true; })("blur", function DrChatFormWithHistoryComponent_Template_textarea_blur_5_listener() { return ctx.inputFocus = false; })("mouseenter", function DrChatFormWithHistoryComponent_Template_textarea_mouseenter_5_listener() { return ctx.inputHover = true; })("mouseleave", function DrChatFormWithHistoryComponent_Template_textarea_mouseleave_5_listener() { return ctx.inputHover = false; })("ngModelChange", function DrChatFormWithHistoryComponent_Template_textarea_ngModelChange_5_listener($event) { return ctx.message = $event; })("ngModelChange", function DrChatFormWithHistoryComponent_Template_textarea_ngModelChange_5_listener($event) { return ctx.onModelChange($event); })("keydown.enter", function DrChatFormWithHistoryComponent_Template_textarea_keydown_enter_5_listener($event) { return ctx.sendMessage($event); });
251
- i0.ɵɵtext(7, " ");
252
- i0.ɵɵelementEnd();
253
- i0.ɵɵelementStart(8, "div", 6);
254
- i0.ɵɵtext(9);
255
- i0.ɵɵelementEnd();
256
- i0.ɵɵelementStart(10, "input", 7, 8);
257
- i0.ɵɵlistener("change", function DrChatFormWithHistoryComponent_Template_input_change_10_listener($event) { return ctx.onFileSelected($event); });
258
- i0.ɵɵelementEnd();
259
- i0.ɵɵelementStart(12, "i", 9);
260
- i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_Template_i_click_12_listener() { return ctx.showHistory(); });
261
- i0.ɵɵelementEnd();
262
- i0.ɵɵelementStart(13, "i", 10);
263
- i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_Template_i_click_13_listener() { i0.ɵɵrestoreView(_r15); const _r2 = i0.ɵɵreference(11); return i0.ɵɵresetView(_r2.click()); });
264
- i0.ɵɵelementEnd();
265
- i0.ɵɵtemplate(14, DrChatFormWithHistoryComponent_i_14_Template, 1, 2, "i", 11);
266
- i0.ɵɵtemplate(15, DrChatFormWithHistoryComponent_i_15_Template, 1, 2, "i", 12);
267
- i0.ɵɵtemplate(16, DrChatFormWithHistoryComponent_dr_dot_flashing_16_Template, 1, 0, "dr-dot-flashing", 13);
268
- i0.ɵɵelementEnd();
269
- i0.ɵɵtemplate(17, DrChatFormWithHistoryComponent_ng_container_17_Template, 3, 2, "ng-container", 14);
270
- i0.ɵɵelementEnd()();
271
- } if (rf & 2) {
272
- const _r1 = i0.ɵɵreference(6);
273
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(16, _c2, ctx.isLoading));
274
- i0.ɵɵadvance(1);
275
- i0.ɵɵproperty("@containerHeightAnimation", i0.ɵɵpureFunction2(20, _c4, ctx.showHistory ? "expanded" : "collapsed", i0.ɵɵpureFunction1(18, _c3, ctx.getTextAreaHeight(_r1))))("ngClass", i0.ɵɵpureFunction3(23, _c5, ctx.inputFocus, !!(ctx.message == null ? null : ctx.message.length), ctx.isShowedHistory));
276
- i0.ɵɵadvance(1);
277
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(3, 14, ctx.droppedFiles$).length);
278
- i0.ɵɵadvance(3);
279
- i0.ɵɵstyleMap(ctx.getTextAreaHeight(_r1));
280
- i0.ɵɵpropertyInterpolate("placeholder", ctx.fileOver ? ctx.dropFilePlaceholder : ctx.messagePlaceholder);
281
- i0.ɵɵproperty("ngModel", ctx.message)("rows", 1);
282
- i0.ɵɵadvance(4);
283
- i0.ɵɵtextInterpolate(_r1.value);
284
- i0.ɵɵadvance(5);
285
- i0.ɵɵproperty("ngIf", !ctx.waitForReply);
286
- i0.ɵɵadvance(1);
287
- i0.ɵɵproperty("ngIf", ctx.waitForReply && !ctx.showDotFlashing);
288
- i0.ɵɵadvance(1);
289
- i0.ɵɵproperty("ngIf", ctx.waitForReply && ctx.showDotFlashing);
290
- i0.ɵɵadvance(1);
291
- i0.ɵɵproperty("ngIf", !ctx.isChatMode);
292
- } }, dependencies: [i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.NgClass, i3.NgIf, i4.ClickOutsideDirective, i5.DrDotFlashingComponent, i6.DrChatDroppedFilesComponent, i3.AsyncPipe], styles: ["[_nghost-%COMP%] {--send-button-offset: 42px;display:flex;flex-direction:column;align-items:center;padding:0 16px}[_nghost-%COMP%] .message-row{display:flex;justify-content:center;width:100%;padding:0 0 21px;max-width:956px}[_nghost-%COMP%] .message-row__input{flex-direction:column;background-color:#fff;position:relative;display:flex;align-items:center;flex-grow:1;height:auto;overflow:visible;min-width:265px;border-radius:24px;border:1.5px solid transparent;box-shadow:0 2px 16px -10px #603cff29;transition:.35s ease}[_nghost-%COMP%] .message-row__input .abort-button, [_nghost-%COMP%] .message-row__input .send-button{width:32px;height:32px;display:flex;align-items:center;justify-content:center;position:absolute;top:2.5px;right:8px;cursor:pointer;font-size:24px;border-radius:100px;color:#fff;transition:.15s ease-in-out;background:linear-gradient(266deg,#6969ff 25.2%,#4eb7df 90.24%) border-box}[_nghost-%COMP%] .message-row__input .dr-icon-history, [_nghost-%COMP%] .message-row__input .dr-icon-attachment{display:flex;align-items:center;position:absolute;cursor:pointer;width:32px;height:48px;left:16px;top:-1px}[_nghost-%COMP%] .message-row__input .dr-icon-attachment{left:52px}[_nghost-%COMP%] .message-row__input .send-button{opacity:.5;pointer-events:none}[_nghost-%COMP%] .message-row__input--focused{box-shadow:8px 8px 16px #6969ff40,-4px -4px 8px #40b6e340,8px 8px 60px #00000040;height:auto!important;background:#fff}[_nghost-%COMP%] .message-row__input--filled{box-shadow:8px 8px 16px #6969ff40,-4px -4px 8px #40b6e340,8px 8px 60px #00000040;background:#fff}[_nghost-%COMP%] .message-row__input--filled .send-button{opacity:1;pointer-events:all}[_nghost-%COMP%] .message-row__input .message-input-tmp{display:none}[_nghost-%COMP%] .message-row__input.showed-dropdown .send-button{opacity:.5}[_nghost-%COMP%] .message-row__input .wait-reply-dot-flashing{display:flex;position:absolute;align-items:center;width:32px;height:48px;right:25px}[_nghost-%COMP%] .message-row__input:before{content:\"\";position:absolute;inset:-3px;background:linear-gradient(266deg,#6969ff 25.2%,#4eb7df 90.24%);border-radius:25px;z-index:-1}[_nghost-%COMP%] .message-row__input textarea, [_nghost-%COMP%] .message-row__input .message-input-tmp{font-size:14px;color:#333;width:100%;outline:none;min-height:48px;line-height:19px;flex-grow:1;resize:none;padding:13px 55px 13px 88px;margin:auto;border:none;border-radius:22.5px}[_nghost-%COMP%] .message-row__input textarea:focus, [_nghost-%COMP%] .message-row__input .message-input-tmp:focus{border:none}[_nghost-%COMP%] .message-row__input textarea::placeholder, [_nghost-%COMP%] .message-row__input .message-input-tmp::placeholder{color:#9ea1aa}[_nghost-%COMP%] .message-row__input-textarea-wrap{display:flex;width:100%;position:relative}[_nghost-%COMP%] .history-dropdown{width:100%;max-height:220px;overflow-y:auto;padding:12px 16px 0}[_nghost-%COMP%] .showed-dropdown textarea{visibility:hidden;position:absolute}[_nghost-%COMP%] .showed-dropdown .message-input-tmp{display:block;margin-left:inherit;white-space:nowrap;font-family:monospace;overflow:hidden;text-overflow:ellipsis}[_nghost-%COMP%] .showed-dropdown .send-button{top:2.5px!important}[_nghost-%COMP%] dr-chat-dropped-files{margin-right:auto}[_nghost-%COMP%] .message-row_loading .send-button, [_nghost-%COMP%] .message-row_loading .dropped-files__item{opacity:.5;pointer-events:none}"], data: { animation: [
293
- trigger('containerHeightAnimation', [
294
- state('collapsed', style({ height: '{{height}}' }), { params: { height: '48px' } }),
295
- state('expanded', style({
296
- height: '*',
297
- })),
298
- transition('collapsed => expanded', [animate('300ms ease-in-out')]),
299
- transition('expanded => collapsed', [query('@dropdownAnimation', animateChild()), animate('300ms ease-in-out')]),
300
- ]),
301
- trigger('dropdownAnimation', [
302
- state('hidden', style({
303
- opacity: 0,
304
- transform: 'translateY(-30px)',
305
- display: 'none',
306
- })),
307
- state('visible', style({
308
- opacity: 1,
309
- transform: 'translateY(0)',
310
- display: 'block',
311
- })),
312
- transition('hidden => visible', [style({ display: 'block' }), animate('300ms ease-in-out')]),
313
- transition('visible => hidden', [
314
- animate('300ms ease-in-out', style({ opacity: 0, transform: 'translateY(-30px)' })),
315
- style({ display: 'none' }),
316
- ]),
317
- ]),
318
- ] }, changeDetection: 0 }); }
319
- }
320
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DrChatFormWithHistoryComponent, [{
321
- type: Component,
322
- args: [{ selector: 'dr-chat-form-with-history', changeDetection: ChangeDetectionStrategy.OnPush, animations: [
323
- trigger('containerHeightAnimation', [
324
- state('collapsed', style({ height: '{{height}}' }), { params: { height: '48px' } }),
325
- state('expanded', style({
326
- height: '*',
327
- })),
328
- transition('collapsed => expanded', [animate('300ms ease-in-out')]),
329
- transition('expanded => collapsed', [query('@dropdownAnimation', animateChild()), animate('300ms ease-in-out')]),
330
- ]),
331
- trigger('dropdownAnimation', [
332
- state('hidden', style({
333
- opacity: 0,
334
- transform: 'translateY(-30px)',
335
- display: 'none',
336
- })),
337
- state('visible', style({
338
- opacity: 1,
339
- transform: 'translateY(0)',
340
- display: 'block',
341
- })),
342
- transition('hidden => visible', [style({ display: 'block' }), animate('300ms ease-in-out')]),
343
- transition('visible => hidden', [
344
- animate('300ms ease-in-out', style({ opacity: 0, transform: 'translateY(-30px)' })),
345
- style({ display: 'none' }),
346
- ]),
347
- ]),
348
- ], template: "<div class=\"message-row\" [ngClass]=\"{ 'message-row_loading': isLoading }\">\n <div\n [@containerHeightAnimation]=\"{\n value: showHistory ? 'expanded' : 'collapsed',\n params: { height: getTextAreaHeight(textAreaElement) },\n }\"\n class=\"message-row__input\"\n [ngClass]=\"{\n 'message-row__input--focused': inputFocus,\n 'message-row__input--filled': !!message?.length,\n 'showed-dropdown': isShowedHistory,\n }\">\n <dr-chat-dropped-files\n *ngIf=\"(droppedFiles$ | async).length\"\n [files]=\"droppedFiles$ | async\"\n [isRemovable]=\"true\"\n [maxLengthText]=\"15\"\n (removeFileEvent)=\"removeFile($event)\"></dr-chat-dropped-files>\n\n <div class=\"message-row__input-textarea-wrap\">\n <textarea\n #textAreaElement\n (focus)=\"inputFocus = true\"\n (blur)=\"inputFocus = false\"\n (mouseenter)=\"inputHover = true\"\n (mouseleave)=\"inputHover = false\"\n [(ngModel)]=\"message\"\n [rows]=\"1\"\n [style]=\"getTextAreaHeight(textAreaElement)\"\n (ngModelChange)=\"onModelChange($event)\"\n type=\"text\"\n placeholder=\"{{ fileOver ? dropFilePlaceholder : messagePlaceholder }}\"\n (keydown.enter)=\"sendMessage($event)\">\n </textarea>\n\n <div class=\"message-input-tmp\">{{ textAreaElement.value }}</div>\n\n <input #fileInput type=\"file\" hidden multiple (change)=\"onFileSelected($event)\" />\n <i (click)=\"showHistory()\" class=\"dr-icon-history\"></i>\n <i (click)=\"fileInput.click()\" class=\"dr-icon-attachment\"></i>\n\n <i\n *ngIf=\"!waitForReply\"\n [style]=\"getSendButtonPosition(textAreaElement)\"\n (click)=\"sendMessage($event)\"\n class=\"dr-icon-send-arrow-up send-button\"></i>\n\n <i\n *ngIf=\"waitForReply && !showDotFlashing\"\n [style]=\"getSendButtonPosition(textAreaElement)\"\n class=\"dr-icon-stop abort-button\"\n (click)=\"abortMessage()\"></i>\n <dr-dot-flashing *ngIf=\"waitForReply && showDotFlashing\" class=\"wait-reply-dot-flashing\"></dr-dot-flashing>\n </div>\n\n <ng-container *ngIf=\"!isChatMode\">\n <div\n [@dropdownAnimation]=\"isShowedHistory ? 'visible' : 'hidden'\"\n class=\"history-dropdown\"\n [exclude]=\"'.dr-icon-history'\"\n (clickOutside)=\"closeHistory()\">\n <ng-content></ng-content>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [":host::ng-deep{--send-button-offset: 42px;display:flex;flex-direction:column;align-items:center;padding:0 16px}:host::ng-deep .message-row{display:flex;justify-content:center;width:100%;padding:0 0 21px;max-width:956px}:host::ng-deep .message-row__input{flex-direction:column;background-color:#fff;position:relative;display:flex;align-items:center;flex-grow:1;height:auto;overflow:visible;min-width:265px;border-radius:24px;border:1.5px solid transparent;box-shadow:0 2px 16px -10px #603cff29;transition:.35s ease}:host::ng-deep .message-row__input .abort-button,:host::ng-deep .message-row__input .send-button{width:32px;height:32px;display:flex;align-items:center;justify-content:center;position:absolute;top:2.5px;right:8px;cursor:pointer;font-size:24px;border-radius:100px;color:#fff;transition:.15s ease-in-out;background:linear-gradient(266deg,#6969ff 25.2%,#4eb7df 90.24%) border-box}:host::ng-deep .message-row__input .dr-icon-history,:host::ng-deep .message-row__input .dr-icon-attachment{display:flex;align-items:center;position:absolute;cursor:pointer;width:32px;height:48px;left:16px;top:-1px}:host::ng-deep .message-row__input .dr-icon-attachment{left:52px}:host::ng-deep .message-row__input .send-button{opacity:.5;pointer-events:none}:host::ng-deep .message-row__input--focused{box-shadow:8px 8px 16px #6969ff40,-4px -4px 8px #40b6e340,8px 8px 60px #00000040;height:auto!important;background:#fff}:host::ng-deep .message-row__input--filled{box-shadow:8px 8px 16px #6969ff40,-4px -4px 8px #40b6e340,8px 8px 60px #00000040;background:#fff}:host::ng-deep .message-row__input--filled .send-button{opacity:1;pointer-events:all}:host::ng-deep .message-row__input .message-input-tmp{display:none}:host::ng-deep .message-row__input.showed-dropdown .send-button{opacity:.5}:host::ng-deep .message-row__input .wait-reply-dot-flashing{display:flex;position:absolute;align-items:center;width:32px;height:48px;right:25px}:host::ng-deep .message-row__input:before{content:\"\";position:absolute;inset:-3px;background:linear-gradient(266deg,#6969ff 25.2%,#4eb7df 90.24%);border-radius:25px;z-index:-1}:host::ng-deep .message-row__input textarea,:host::ng-deep .message-row__input .message-input-tmp{font-size:14px;color:#333;width:100%;outline:none;min-height:48px;line-height:19px;flex-grow:1;resize:none;padding:13px 55px 13px 88px;margin:auto;border:none;border-radius:22.5px}:host::ng-deep .message-row__input textarea:focus,:host::ng-deep .message-row__input .message-input-tmp:focus{border:none}:host::ng-deep .message-row__input textarea::placeholder,:host::ng-deep .message-row__input .message-input-tmp::placeholder{color:#9ea1aa}:host::ng-deep .message-row__input-textarea-wrap{display:flex;width:100%;position:relative}:host::ng-deep .history-dropdown{width:100%;max-height:220px;overflow-y:auto;padding:12px 16px 0}:host::ng-deep .showed-dropdown textarea{visibility:hidden;position:absolute}:host::ng-deep .showed-dropdown .message-input-tmp{display:block;margin-left:inherit;white-space:nowrap;font-family:monospace;overflow:hidden;text-overflow:ellipsis}:host::ng-deep .showed-dropdown .send-button{top:2.5px!important}:host::ng-deep dr-chat-dropped-files{margin-right:auto}:host::ng-deep .message-row_loading .send-button,:host::ng-deep .message-row_loading .dropped-files__item{opacity:.5;pointer-events:none}\n"] }]
349
- }], function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }]; }, { textAreaElementRef: [{
350
- type: ViewChild,
351
- args: ['textAreaElement']
352
- }], fileInput: [{
353
- type: ViewChild,
354
- args: ['fileInput']
355
- }], isChatMode: [{
356
- type: Input
357
- }], isLoading: [{
358
- type: Input
359
- }], message: [{
360
- type: Input
361
- }], messagePlaceholder: [{
362
- type: Input
363
- }], dropFiles: [{
364
- type: Input
365
- }], dropFilePlaceholder: [{
366
- type: Input
367
- }], waitForReply: [{
368
- type: Input
369
- }], showDotFlashing: [{
370
- type: Input
371
- }], send: [{
372
- type: Output
373
- }], uploadFiles: [{
374
- type: Output
375
- }], abort: [{
376
- type: Output
377
- }], inputChange: [{
378
- type: Output
379
- }], fileOver: [{
380
- type: HostBinding,
381
- args: ['class.file-over']
382
- }], onDrop: [{
383
- type: HostListener,
384
- args: ['drop', ['$event']]
385
- }], onDragOver: [{
386
- type: HostListener,
387
- args: ['dragover', ['$event']]
388
- }], onDragLeave: [{
389
- type: HostListener,
390
- args: ['dragleave', ['$event']]
391
- }] }); })();
392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1mb3JtLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1jaGF0L2RyLWNoYXQtZm9ybS13aXRoLWhpc3RvcnkvY2hhdC1mb3JtLXdpdGgtaGlzdG9yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1jaGF0L2RyLWNoYXQtZm9ybS13aXRoLWhpc3RvcnkvY2hhdC1mb3JtLXdpdGgtaGlzdG9yeS4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7OztJQ0gvQixpREFLMkM7SUFBdkMsc09BQW1CLGVBQUEseUJBQWtCLENBQUEsSUFBQzs7SUFBQyxpQkFBd0I7OztJQUgvRCxrRUFBK0IscUJBQUEscUJBQUE7Ozs7SUEyQi9CLDZCQUk4QztJQUQxQyw0S0FBUyxlQUFBLDBCQUFtQixDQUFBLElBQUM7SUFDYSxpQkFBSTs7OztJQUY5QyxnREFBZ0Q7Ozs7SUFJcEQsNkJBSTZCO0lBQXpCLHVLQUFTLGVBQUEsc0JBQWMsQ0FB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RUFBRSxNQUFNLEVBQUUsQ0FBQzt5QkFDN0IsQ0FBQztxQkFDTCxDQUFDO2lCQUNMOytGQUc2QixrQkFBa0I7a0JBQS9DLFNBQVM7bUJBQUMsaUJBQWlCO1lBQ0osU0FBUztrQkFBaEMsU0FBUzttQkFBQyxXQUFXO1lBUWIsVUFBVTtrQkFBbEIsS0FBSztZQUVHLFNBQVM7a0JBQWpCLEtBQUs7WUFPRyxPQUFPO2tCQUFmLEtBQUs7WUFPRyxrQkFBa0I7a0JBQTFCLEtBQUs7WUFPRyxTQUFTO2tCQUFqQixLQUFLO1lBT0csbUJBQW1CO2tCQUEzQixLQUFLO1lBT0csWUFBWTtrQkFBcEIsS0FBSztZQU9HLGVBQWU7a0JBQXZCLEtBQUs7WUFNSSxJQUFJO2tCQUFiLE1BQU07WUFDRyxXQUFXO2tCQUFwQixNQUFNO1lBQ0csS0FBSztrQkFBZCxNQUFNO1lBUUcsV0FBVztrQkFBcEIsTUFBTTtZQUV5QixRQUFRO2tCQUF2QyxXQUFXO21CQUFDLGlCQUFpQjtZQVE5QixNQUFNO2tCQURMLFlBQVk7bUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBd0JoQyxVQUFVO2tCQURULFlBQVk7bUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBVXBDLFdBQVc7a0JBRFYsWUFBWTttQkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IElGSWxlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NoYXQnO1xuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlLCBxdWVyeSwgYW5pbWF0ZUNoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdkci1jaGF0LWZvcm0td2l0aC1oaXN0b3J5JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1mb3JtLXdpdGgtaGlzdG9yeS4uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NoYXQtZm9ybS13aXRoLWhpc3RvcnkuLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCdjb250YWluZXJIZWlnaHRBbmltYXRpb24nLCBbXG4gICAgICAgICAgICBzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICd7e2hlaWdodH19JyB9KSwgeyBwYXJhbXM6IHsgaGVpZ2h0OiAnNDhweCcgfSB9KSxcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICdleHBhbmRlZCcsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcqJyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCdjb2xsYXBzZWQgPT4gZXhwYW5kZWQnLCBbYW5pbWF0ZSgnMzAwbXMgZWFzZS1pbi1vdXQnKV0pLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPT4gY29sbGFwc2VkJywgW3F1ZXJ5KCdAZHJvcGRvd25BbmltYXRpb24nLCBhbmltYXRlQ2hpbGQoKSksIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4tb3V0JyldKSxcbiAgICAgICAgXSksXG4gICAgICAgIHRyaWdnZXIoJ2Ryb3Bkb3duQW5pbWF0aW9uJywgW1xuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0zMHB4KScsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAndmlzaWJsZScsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJyxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIFtzdHlsZSh7IGRpc3BsYXk6ICdibG9jaycgfSksIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4tb3V0JyldKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgW1xuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4tb3V0Jywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0zMHB4KScgfSkpLFxuICAgICAgICAgICAgICAgIHN0eWxlKHsgZGlzcGxheTogJ25vbmUnIH0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIF0pLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIERyQ2hhdEZvcm1XaXRoSGlzdG9yeUNvbXBvbmVudCB7XG4gICAgQFZpZXdDaGlsZCgndGV4dEFyZWFFbGVtZW50JykgdGV4dEFyZWFFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dDogRWxlbWVudFJlZjtcbiAgICBfdGV4dGFyZWFJbml0aWFsSGVpZ2h0ID0gdHJ1ZTtcbiAgICBpbnB1dEZvY3VzID0gZmFsc2U7XG4gICAgaW5wdXRIb3ZlciA9IGZhbHNlO1xuXG4gICAgZHJvcHBlZEZpbGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUZJbGVbXT4oW10pO1xuICAgIGlzU2hvd2VkSGlzdG9yeSA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgaXNDaGF0TW9kZSA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBQcmVkZWZpbmVkIG1lc3NhZ2UgdGV4dFxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBASW5wdXQoKSBtZXNzYWdlID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBNZXNzYWdlIHBsYWNlaG9sZGVyIHRleHRcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgQElucHV0KCkgbWVzc2FnZVBsYWNlaG9sZGVyID0gJ1R5cGUgYSBtZXNzYWdlJztcblxuICAgIC8qKlxuICAgICAqIFNob3cgc2VuZCBidXR0b25cbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRyb3BGaWxlcyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRmlsZSBkcm9wIHBsYWNlaG9sZGVyIHRleHRcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgQElucHV0KCkgZHJvcEZpbGVQbGFjZWhvbGRlciA9ICdEcm9wIGZpbGUgdG8gc2VuZCc7XG5cbiAgICAvKipcbiAgICAgKiBQYXJhbWV0ZXIgdG8gY2hlY2sgaXMgc2VuZCBtZXNzYWdlIGZ1bmN0aW9uIGF2YWlsYWJsZVxuICAgICAqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgQElucHV0KCkgd2FpdEZvclJlcGx5ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBQYXJhbWV0ZXIgdG8gY2hlY2sgaXMgc2VuZCBtZXNzYWdlIGZ1bmN0aW9uIGF2YWlsYWJsZVxuICAgICAqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgQElucHV0KCkgc2hvd0RvdEZsYXNoaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBzdHJpbmcsIGZpbGVzOiBJRmlsZVtdIH0+fVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBzZW5kID0gbmV3IEV2ZW50RW1pdHRlcjx7IG1lc3NhZ2U6IHN0cmluZzsgZmlsZXM6IElGSWxlW10gfT4oKTtcbiAgICBAT3V0cHV0KCkgdXBsb2FkRmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPElGSWxlW10+KCk7XG4gICAgQE91dHB1dCgpIGFib3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIG1lc3NhZ2UgaW5wdXQgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZFxuICAgICAqXG4gICAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxzdHJpbmc+fVxuICAgICAqL1xuXG4gICAgQE91dHB1dCgpIGlucHV0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZpbGUtb3ZlcicpIGZpbGVPdmVyID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICApIHt9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkcm9wJywgWyckZXZlbnQnXSlcbiAgICBvbkRyb3AoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5kcm9wRmlsZXMpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgdGhpcy5maWxlT3ZlciA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xuICAgICAgICAgICAgaWYgKGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlRmlsZXMoZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlRmlsZShmaWxlKSB7XG4gICAgICAgIGNvbnN0IGRyb3BwZWRGaWxlcyA9IHRoaXMuZHJvcHBlZEZpbGVzJC52YWx1ZTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkcm9wcGVkRmlsZXMuaW5kZXhPZihmaWxlKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGRyb3BwZWRGaWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5kcm9wcGVkRmlsZXMkLm5leHQoZHJvcHBlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RyYWdvdmVyJywgWyckZXZlbnQnXSlcbiAgICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmRyb3BGaWxlcykge1xuICAgICAgICAgICAgdGhpcy5maWxlT3ZlciA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBbJyRldmVudCddKVxuICAgIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmRyb3BGaWxlcykge1xuICAgICAgICAgICAgdGhpcy5maWxlT3ZlciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VuZE1lc3NhZ2UoJGV2ZW50KSB7XG4gICAgICAgIGlmICghJGV2ZW50IHx8ICEkZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICRldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICRldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGhpcy53YWl0Rm9yUmVwbHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJvcHBlZEZpbGVzJC52YWx1ZS5sZW5ndGggfHwgU3RyaW5nKHRoaXMubWVzc2FnZSkudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRhcmVhSW5pdGlhbEhlaWdodCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kLmVtaXQoeyBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsIGZpbGVzOiB0aGlzLmRyb3BwZWRGaWxlcyQudmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wcGVkRmlsZXMkLm5leHQoW10pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJvcnRNZXNzYWdlKCkge1xuICAgICAgICB0aGlzLmFib3J0LmVtaXQoKTtcbiAgICB9XG5cbiAgICBvbk1vZGVsQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGV4dGFyZWFJbml0aWFsSGVpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0VGV4dEFyZWFIZWlnaHQodGV4dEFyZWFFbGVtZW50OiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXh0YXJlYUluaXRpYWxIZWlnaHQpIHtcbiAgICAgICAgICAgIHRleHRBcmVhRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnNDhweCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0QXJlYUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgICAgICAgdGV4dEFyZWFFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRleHRBcmVhRWxlbWVudC5zY3JvbGxIZWlnaHQgKyAncHgnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3RleHRBcmVhRWxlbWVudC5zdHlsZS5oZWlnaHR9YDtcbiAgICB9XG5cbiAgICBnZXRTZW5kQnV0dG9uUG9zaXRpb24odGV4dEFyZWFFbGVtZW50OiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBgdG9wOiBjYWxjKCR7dGhpcy5nZXRUZXh0QXJlYUhlaWdodCh0ZXh0QXJlYUVsZW1lbnQpfSAtIHZhcigtLXNlbmQtYnV0dG9uLW9mZnNldCkpO2A7XG4gICAgfVxuXG4gICAgc2hvd0hpc3RvcnkoKSB7XG4gICAgICAgIHRoaXMuaXNTaG93ZWRIaXN0b3J5ID0gIXRoaXMuaXNTaG93ZWRIaXN0b3J5O1xuICAgIH1cblxuICAgIGNsb3NlSGlzdG9yeSgpIHtcbiAgICAgICAgdGhpcy5pc1Nob3dlZEhpc3RvcnkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZmlsZU92ZXIgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlucHV0LmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlRmlsZXMoQXJyYXkuZnJvbShpbnB1dC5maWxlcykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNhdmVGaWxlcyhmaWxlczogQXJyYXk8RmlsZT4pIHtcbiAgICAgICAgY29uc3QgdXBsb2FkZWRGaWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGxldCByZXMgPSBmaWxlIGFzIElGSWxlO1xuICAgICAgICAgICAgcmVzLmRhdGEgPSAoYXdhaXQgdGhpcy5iYXNlNjRDb252ZXJ0KHJlcykpIGFzIHN0cmluZztcbiAgICAgICAgICAgIHRoaXMuZHJvcHBlZEZpbGVzJC5uZXh0KFsuLi50aGlzLmRyb3BwZWRGaWxlcyQudmFsdWUsIHJlc10pO1xuICAgICAgICAgICAgdXBsb2FkZWRGaWxlcy5wdXNoKHJlcyk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwbG9hZEZpbGVzLmVtaXQodXBsb2FkZWRGaWxlcy5tYXAoKGl0ZW0pID0+ICh7IGRhdGE6IGl0ZW0uZGF0YSwgbmFtZTogaXRlbS5uYW1lIH0pKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiYXNlNjRDb252ZXJ0KGZpbGU6IGFueSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXNzYWdlLXJvd1wiIFtuZ0NsYXNzXT1cInsgJ21lc3NhZ2Utcm93X2xvYWRpbmcnOiBpc0xvYWRpbmcgfVwiPlxuICAgIDxkaXZcbiAgICAgICAgW0Bjb250YWluZXJIZWlnaHRBbmltYXRpb25dPVwie1xuICAgICAgICAgICAgdmFsdWU6IHNob3dIaXN0b3J5ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnLFxuICAgICAgICAgICAgcGFyYW1zOiB7IGhlaWdodDogZ2V0VGV4dEFyZWFIZWlnaHQodGV4dEFyZWFFbGVtZW50KSB9LFxuICAgICAgICB9XCJcbiAgICAgICAgY2xhc3M9XCJtZXNzYWdlLXJvd19faW5wdXRcIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnbWVzc2FnZS1yb3dfX2lucHV0LS1mb2N1c2VkJzogaW5wdXRGb2N1cyxcbiAgICAgICAgICAgICdtZXNzYWdlLXJvd19faW5wdXQtLWZpbGxlZCc6ICEhbWVzc2FnZT8ubGVuZ3RoLFxuICAgICAgICAgICAgJ3Nob3dlZC1kcm9wZG93bic6IGlzU2hvd2VkSGlzdG9yeSxcbiAgICAgICAgfVwiPlxuICAgICAgICA8ZHItY2hhdC1kcm9wcGVkLWZpbGVzXG4gICAgICAgICAgICAqbmdJZj1cIihkcm9wcGVkRmlsZXMkIHwgYXN5bmMpLmxlbmd0aFwiXG4gICAgICAgICAgICBbZmlsZXNdPVwiZHJvcHBlZEZpbGVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtpc1JlbW92YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFttYXhMZW5ndGhUZXh0XT1cIjE1XCJcbiAgICAgICAgICAgIChyZW1vdmVGaWxlRXZlbnQpPVwicmVtb3ZlRmlsZSgkZXZlbnQpXCI+PC9kci1jaGF0LWRyb3BwZWQtZmlsZXM+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2Utcm93X19pbnB1dC10ZXh0YXJlYS13cmFwXCI+XG4gICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAjdGV4dEFyZWFFbGVtZW50XG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cImlucHV0Rm9jdXMgPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJpbnB1dEZvY3VzID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImlucHV0SG92ZXIgPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJpbnB1dEhvdmVyID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwiMVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlXT1cImdldFRleHRBcmVhSGVpZ2h0KHRleHRBcmVhRWxlbWVudClcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgZmlsZU92ZXIgPyBkcm9wRmlsZVBsYWNlaG9sZGVyIDogbWVzc2FnZVBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZW5kTWVzc2FnZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L3RleHRhcmVhPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1pbnB1dC10bXBcIj57eyB0ZXh0QXJlYUVsZW1lbnQudmFsdWUgfX08L2Rpdj5cblxuICAgICAgICAgICAgPGlucHV0ICNmaWxlSW5wdXQgdHlwZT1cImZpbGVcIiBoaWRkZW4gbXVsdGlwbGUgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgIDxpIChjbGljayk9XCJzaG93SGlzdG9yeSgpXCIgY2xhc3M9XCJkci1pY29uLWhpc3RvcnlcIj48L2k+XG4gICAgICAgICAgICA8aSAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIiBjbGFzcz1cImRyLWljb24tYXR0YWNobWVudFwiPjwvaT5cblxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiF3YWl0Rm9yUmVwbHlcIlxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJnZXRTZW5kQnV0dG9uUG9zaXRpb24odGV4dEFyZWFFbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbmRNZXNzYWdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHItaWNvbi1zZW5kLWFycm93LXVwIHNlbmQtYnV0dG9uXCI+PC9pPlxuXG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2FpdEZvclJlcGx5ICYmICFzaG93RG90Rmxhc2hpbmdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJnZXRTZW5kQnV0dG9uUG9zaXRpb24odGV4dEFyZWFFbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkci1pY29uLXN0b3AgYWJvcnQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWJvcnRNZXNzYWdlKClcIj48L2k+XG4gICAgICAgICAgICA8ZHItZG90LWZsYXNoaW5nICpuZ0lmPVwid2FpdEZvclJlcGx5ICYmIHNob3dEb3RGbGFzaGluZ1wiIGNsYXNzPVwid2FpdC1yZXBseS1kb3QtZmxhc2hpbmdcIj48L2RyLWRvdC1mbGFzaGluZz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0NoYXRNb2RlXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW0Bkcm9wZG93bkFuaW1hdGlvbl09XCJpc1Nob3dlZEhpc3RvcnkgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoaXN0b3J5LWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICBbZXhjbHVkZV09XCInLmRyLWljb24taGlzdG9yeSdcIlxuICAgICAgICAgICAgICAgIChjbGlja091dHNpZGUpPVwiY2xvc2VIaXN0b3J5KClcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==