valtech-components 4.0.228 → 4.0.229
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/molecules/chat-composer/chat-composer.component.mjs +410 -0
- package/esm2022/lib/components/molecules/chat-input/chat-input.component.mjs +1 -9
- package/esm2022/lib/components/molecules/conversation-list-item/conversation-list-item.component.mjs +108 -0
- package/esm2022/lib/components/molecules/message-bubble/message-bubble.component.mjs +274 -191
- package/esm2022/lib/components/molecules/typing-indicator/typing-indicator.component.mjs +11 -12
- package/esm2022/lib/components/organisms/chat-window/chat-window.component.mjs +216 -203
- package/esm2022/lib/components/organisms/thread-panel/thread-panel.component.mjs +10 -10
- package/esm2022/lib/services/chat/conversation.service.mjs +37 -14
- package/esm2022/lib/services/chat/types.mjs +1 -1
- package/esm2022/lib/services/i18n/default-content.mjs +5 -1
- package/esm2022/lib/shared/utils/datetime.mjs +54 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +4 -2
- package/fesm2022/valtech-components.mjs +1099 -428
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/chat-composer/chat-composer.component.d.ts +69 -0
- package/lib/components/molecules/conversation-list-item/conversation-list-item.component.d.ts +30 -0
- package/lib/components/molecules/message-bubble/message-bubble.component.d.ts +34 -32
- package/lib/components/molecules/typing-indicator/typing-indicator.component.d.ts +5 -4
- package/lib/components/organisms/chat-window/chat-window.component.d.ts +52 -56
- package/lib/services/chat/conversation.service.d.ts +12 -5
- package/lib/services/chat/types.d.ts +86 -52
- package/lib/shared/utils/datetime.d.ts +19 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +3 -1
- package/src/lib/services/firebase/firebase-messaging-sw.js +70 -125
|
@@ -1,271 +1,284 @@
|
|
|
1
|
-
import { Component,
|
|
1
|
+
import { Component, computed, effect, inject, input, output, signal, viewChild } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { IonIcon
|
|
3
|
+
import { IonIcon } from '@ionic/angular/standalone';
|
|
4
4
|
import { addIcons } from 'ionicons';
|
|
5
|
-
import { chatbubblesOutline } from 'ionicons/icons';
|
|
5
|
+
import { arrowDownOutline, chatbubblesOutline } from 'ionicons/icons';
|
|
6
6
|
import { I18nService } from '../../../services/i18n';
|
|
7
|
+
import { formatDateSeparator } from '../../../shared/utils/datetime';
|
|
7
8
|
import { MessageBubbleComponent } from '../../molecules/message-bubble/message-bubble.component';
|
|
8
|
-
import {
|
|
9
|
+
import { ChatComposerComponent } from '../../molecules/chat-composer/chat-composer.component';
|
|
9
10
|
import { TypingIndicatorComponent } from '../../molecules/typing-indicator/typing-indicator.component';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
|
-
addIcons({ chatbubblesOutline });
|
|
12
|
+
addIcons({ arrowDownOutline, chatbubblesOutline });
|
|
12
13
|
const CHAT_WINDOW_I18N = {
|
|
13
14
|
es: {
|
|
14
15
|
conversationClosed: 'Esta conversacion esta cerrada',
|
|
15
16
|
loading: 'Cargando mensajes...',
|
|
16
|
-
noMessages: '
|
|
17
|
+
noMessages: 'Aun no hay mensajes. Escribe el primero.',
|
|
18
|
+
newMessages: 'Mensajes nuevos',
|
|
17
19
|
},
|
|
18
20
|
en: {
|
|
19
21
|
conversationClosed: 'This conversation is closed',
|
|
20
22
|
loading: 'Loading messages...',
|
|
21
|
-
noMessages: 'No messages yet',
|
|
23
|
+
noMessages: 'No messages yet. Send the first one.',
|
|
24
|
+
newMessages: 'New messages',
|
|
22
25
|
},
|
|
23
26
|
};
|
|
24
27
|
/**
|
|
25
|
-
* val-chat-window
|
|
28
|
+
* val-chat-window — ventana de chat completa (signal inputs).
|
|
26
29
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
30
|
+
* Agrupa mensajes consecutivos del mismo emisor y por día (separadores sticky),
|
|
31
|
+
* muestra avatar/nombre solo en los bordes del grupo, scroll-to-bottom inteligente
|
|
32
|
+
* (auto-scroll si estás abajo, pill "mensajes nuevos" si estás leyendo arriba),
|
|
33
|
+
* composer moderno con contexto de respuesta, y typing indicator.
|
|
31
34
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* [messages]="messages()"
|
|
36
|
-
* [currentUserId]="userId"
|
|
37
|
-
* [isOpen]="conv.status === 'open'"
|
|
38
|
-
* [typingUsers]="typingUsers()"
|
|
39
|
-
* (sendMessage)="onSend($event)"
|
|
40
|
-
* (reactionClick)="onReaction($event)"
|
|
41
|
-
* />
|
|
35
|
+
* API pública estable (consumida por thread-panel y showcase): inputs convId,
|
|
36
|
+
* messages, currentUserId, isOpen, typingUsers, isLoading; outputs sendMessage,
|
|
37
|
+
* loadMore, reactionClick, deleteMessage, replyTo (+ editMessage/attach/voice nuevos).
|
|
42
38
|
*/
|
|
43
39
|
export class ChatWindowComponent {
|
|
44
40
|
constructor() {
|
|
45
41
|
this.i18n = inject(I18nService);
|
|
46
|
-
this.convId = '';
|
|
47
|
-
this.messages = [];
|
|
48
|
-
this.
|
|
49
|
-
this.
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
52
|
-
this.
|
|
53
|
-
this.
|
|
54
|
-
this.
|
|
55
|
-
this.
|
|
56
|
-
this.
|
|
57
|
-
this.
|
|
58
|
-
this.
|
|
59
|
-
this.
|
|
60
|
-
this.
|
|
61
|
-
|
|
42
|
+
this.convId = input('');
|
|
43
|
+
this.messages = input([]);
|
|
44
|
+
this.currentUserId = input('');
|
|
45
|
+
this.isOpen = input(true);
|
|
46
|
+
this.typingUsers = input([]);
|
|
47
|
+
this.isLoading = input(false);
|
|
48
|
+
this.sendMessage = output();
|
|
49
|
+
this.loadMore = output();
|
|
50
|
+
this.reactionClick = output();
|
|
51
|
+
this.deleteMessage = output();
|
|
52
|
+
this.replyTo = output();
|
|
53
|
+
this.editMessage = output();
|
|
54
|
+
this.typing = output();
|
|
55
|
+
this.attach = output();
|
|
56
|
+
this.voice = output();
|
|
57
|
+
this.msgsEl = viewChild('msgs');
|
|
58
|
+
this.replyingTo = signal(null);
|
|
59
|
+
this.atBottom = signal(true);
|
|
60
|
+
this.hasNew = signal(false);
|
|
61
|
+
this.locale = computed(() => (this.i18n.lang() === 'en' ? 'en-US' : 'es-CL'));
|
|
62
|
+
this.rows = computed(() => {
|
|
63
|
+
const msgs = this.messages();
|
|
62
64
|
if (msgs.length === 0)
|
|
63
65
|
return [];
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
66
|
+
const labels = {
|
|
67
|
+
today: this.i18n.t('today', '_global'),
|
|
68
|
+
yesterday: this.i18n.t('yesterday', '_global'),
|
|
69
|
+
};
|
|
70
|
+
const out = [];
|
|
71
|
+
let prevDay = '';
|
|
72
|
+
for (let i = 0; i < msgs.length; i++) {
|
|
73
|
+
const m = msgs[i];
|
|
74
|
+
const d = m.createdAt instanceof Date ? m.createdAt : new Date(m.createdAt);
|
|
75
|
+
const day = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
|
|
76
|
+
const newDay = day !== prevDay;
|
|
77
|
+
if (newDay) {
|
|
78
|
+
out.push({ kind: 'date', id: 'date-' + day, label: formatDateSeparator(d, this.locale(), labels) });
|
|
79
|
+
prevDay = day;
|
|
75
80
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
const prev = msgs[i - 1];
|
|
82
|
+
const next = msgs[i + 1];
|
|
83
|
+
const firstInGroup = newDay || !prev || prev.senderId !== m.senderId;
|
|
84
|
+
const nextDay = next
|
|
85
|
+
? `${new Date(next.createdAt).getFullYear()}-${new Date(next.createdAt).getMonth()}-${new Date(next.createdAt).getDate()}`
|
|
86
|
+
: '';
|
|
87
|
+
const lastInGroup = !next || next.senderId !== m.senderId || nextDay !== day;
|
|
88
|
+
out.push({
|
|
89
|
+
kind: 'msg',
|
|
90
|
+
id: m.msgId,
|
|
91
|
+
msg: m,
|
|
92
|
+
showName: firstInGroup && !m.isMine,
|
|
93
|
+
showAvatar: lastInGroup && !m.isMine,
|
|
94
|
+
tail: lastInGroup,
|
|
95
|
+
});
|
|
82
96
|
}
|
|
83
|
-
return
|
|
84
|
-
});
|
|
85
|
-
this.closedText = computed(() => {
|
|
86
|
-
this.i18n.lang();
|
|
87
|
-
return this.i18n.t('conversationClosed', 'ChatWindow');
|
|
88
|
-
});
|
|
89
|
-
this.loadingText = computed(() => {
|
|
90
|
-
this.i18n.lang();
|
|
91
|
-
return this.i18n.t('loading', 'ChatWindow');
|
|
97
|
+
return out;
|
|
92
98
|
});
|
|
93
99
|
this.i18n.registerDefaults('ChatWindow', CHAT_WINDOW_I18N);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (changes['messages']) {
|
|
109
|
-
const current = changes['messages'].currentValue ?? [];
|
|
110
|
-
if (current.length !== this.prevMessageCount) {
|
|
111
|
-
this.prevMessageCount = current.length;
|
|
112
|
-
this.shouldScrollToBottom = true;
|
|
100
|
+
// Auto-scroll al fondo cuando llegan mensajes y el usuario ya estaba abajo
|
|
101
|
+
// (o el último mensaje es propio). Si está leyendo arriba, marca "nuevos".
|
|
102
|
+
let prevCount = 0;
|
|
103
|
+
effect(() => {
|
|
104
|
+
const rows = this.rows();
|
|
105
|
+
const count = rows.length;
|
|
106
|
+
if (count === prevCount)
|
|
107
|
+
return;
|
|
108
|
+
const grew = count > prevCount;
|
|
109
|
+
prevCount = count;
|
|
110
|
+
const last = this.messages()[this.messages().length - 1];
|
|
111
|
+
const mine = last?.isMine ?? false;
|
|
112
|
+
if (this.atBottom() || mine) {
|
|
113
|
+
setTimeout(() => this.scrollToBottom(false), 0);
|
|
113
114
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
this.scrollToBottom();
|
|
119
|
-
this.shouldScrollToBottom = false;
|
|
120
|
-
}
|
|
115
|
+
else if (grew) {
|
|
116
|
+
this.hasNew.set(true);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
121
119
|
}
|
|
122
|
-
|
|
123
|
-
const el = this.
|
|
124
|
-
if (!el
|
|
120
|
+
onScroll() {
|
|
121
|
+
const el = this.msgsEl()?.nativeElement;
|
|
122
|
+
if (!el)
|
|
125
123
|
return;
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
if (
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
onReactionClick(event) {
|
|
133
|
-
this.reactionClick.emit({ msgId: event.msgId, token: event.token });
|
|
124
|
+
const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
|
|
125
|
+
this.atBottom.set(nearBottom);
|
|
126
|
+
if (nearBottom)
|
|
127
|
+
this.hasNew.set(false);
|
|
128
|
+
if (el.scrollTop < 40)
|
|
129
|
+
this.loadMore.emit();
|
|
134
130
|
}
|
|
135
|
-
|
|
136
|
-
|
|
131
|
+
scrollToBottom(smooth) {
|
|
132
|
+
const el = this.msgsEl()?.nativeElement;
|
|
133
|
+
if (!el)
|
|
134
|
+
return;
|
|
135
|
+
el.scrollTo({ top: el.scrollHeight, behavior: smooth ? 'smooth' : 'auto' });
|
|
136
|
+
this.atBottom.set(true);
|
|
137
|
+
this.hasNew.set(false);
|
|
137
138
|
}
|
|
138
|
-
|
|
139
|
-
|
|
139
|
+
onSend(body) {
|
|
140
|
+
this.sendMessage.emit(body);
|
|
141
|
+
this.replyingTo.set(null);
|
|
140
142
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
143
|
+
onAction(event) {
|
|
144
|
+
switch (event.type) {
|
|
145
|
+
case 'reply': {
|
|
146
|
+
const m = this.messages().find(x => x.msgId === event.msgId);
|
|
147
|
+
if (m) {
|
|
148
|
+
this.replyingTo.set({ msgId: m.msgId, senderName: m.senderName, body: m.body });
|
|
149
|
+
}
|
|
150
|
+
this.replyTo.emit(event.msgId);
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case 'edit':
|
|
154
|
+
this.editMessage.emit(event.msgId);
|
|
155
|
+
break;
|
|
156
|
+
case 'delete':
|
|
157
|
+
this.deleteMessage.emit(event.msgId);
|
|
158
|
+
break;
|
|
159
|
+
case 'react':
|
|
160
|
+
this.reactionClick.emit({ msgId: event.msgId, token: event.token ?? '👍' });
|
|
161
|
+
break;
|
|
145
162
|
}
|
|
146
163
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return '';
|
|
150
|
-
const d = date instanceof Date ? date : new Date(date);
|
|
151
|
-
const now = new Date();
|
|
152
|
-
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
153
|
-
const msgDay = new Date(d.getFullYear(), d.getMonth(), d.getDate());
|
|
154
|
-
const diffMs = today.getTime() - msgDay.getTime();
|
|
155
|
-
const diffDays = Math.round(diffMs / 86400000);
|
|
156
|
-
if (diffDays === 0)
|
|
157
|
-
return this.i18n.t('today', '_global') || 'Hoy';
|
|
158
|
-
if (diffDays === 1)
|
|
159
|
-
return this.i18n.t('yesterday', '_global') || 'Ayer';
|
|
160
|
-
return d.toLocaleDateString([], { day: '2-digit', month: 'short', year: 'numeric' });
|
|
164
|
+
t(key) {
|
|
165
|
+
return this.i18n.t(key, 'ChatWindow');
|
|
161
166
|
}
|
|
162
167
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
163
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatWindowComponent, isStandalone: true, selector: "val-chat-window", inputs: { convId: "convId", messages: "messages",
|
|
164
|
-
<div class="chat
|
|
165
|
-
<div class="messages
|
|
166
|
-
@if (isLoading) {
|
|
167
|
-
<div class="
|
|
168
|
-
<
|
|
169
|
-
|
|
168
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatWindowComponent, isStandalone: true, selector: "val-chat-window", inputs: { convId: { classPropertyName: "convId", publicName: "convId", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, currentUserId: { classPropertyName: "currentUserId", publicName: "currentUserId", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, typingUsers: { classPropertyName: "typingUsers", publicName: "typingUsers", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sendMessage: "sendMessage", loadMore: "loadMore", reactionClick: "reactionClick", deleteMessage: "deleteMessage", replyTo: "replyTo", editMessage: "editMessage", typing: "typing", attach: "attach", voice: "voice" }, viewQueries: [{ propertyName: "msgsEl", first: true, predicate: ["msgs"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
169
|
+
<div class="chat">
|
|
170
|
+
<div #msgs class="messages" (scroll)="onScroll()">
|
|
171
|
+
@if (isLoading()) {
|
|
172
|
+
<div class="state">
|
|
173
|
+
<span>{{ t('loading') }}</span>
|
|
174
|
+
</div>
|
|
175
|
+
} @else if (rows().length === 0) {
|
|
176
|
+
<div class="state empty">
|
|
177
|
+
<ion-icon name="chatbubbles-outline" aria-hidden="true" />
|
|
178
|
+
<span>{{ t('noMessages') }}</span>
|
|
170
179
|
</div>
|
|
171
180
|
} @else {
|
|
172
|
-
@for (
|
|
173
|
-
|
|
174
|
-
<div class="date-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
@for (msg of group.messages; track msg.msgId) {
|
|
181
|
+
@for (row of rows(); track row.id) {
|
|
182
|
+
@if (row.kind === 'date') {
|
|
183
|
+
<div class="date-sep">
|
|
184
|
+
<span>{{ row.label }}</span>
|
|
185
|
+
</div>
|
|
186
|
+
} @else {
|
|
179
187
|
<val-message-bubble
|
|
180
|
-
[
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
188
|
+
[msg]="row.msg"
|
|
189
|
+
[showName]="row.showName"
|
|
190
|
+
[showAvatar]="row.showAvatar"
|
|
191
|
+
[tail]="row.tail"
|
|
192
|
+
[locale]="locale()"
|
|
193
|
+
(action)="onAction($event)"
|
|
185
194
|
/>
|
|
186
195
|
}
|
|
187
196
|
}
|
|
188
197
|
}
|
|
198
|
+
<val-typing-indicator [typingUsers]="typingUsers()" />
|
|
189
199
|
</div>
|
|
190
200
|
|
|
191
|
-
|
|
201
|
+
@if (!atBottom()) {
|
|
202
|
+
<button class="scroll-down" (click)="scrollToBottom(true)" aria-label="scroll">
|
|
203
|
+
<ion-icon name="arrow-down-outline" aria-hidden="true" />
|
|
204
|
+
@if (hasNew()) {
|
|
205
|
+
<span class="dot"></span>
|
|
206
|
+
}
|
|
207
|
+
</button>
|
|
208
|
+
}
|
|
192
209
|
|
|
193
|
-
@if (
|
|
194
|
-
<
|
|
210
|
+
@if (isOpen()) {
|
|
211
|
+
<val-chat-composer
|
|
212
|
+
[replyingTo]="replyingTo()"
|
|
213
|
+
(send)="onSend($event)"
|
|
214
|
+
(typing)="typing.emit()"
|
|
215
|
+
(attach)="attach.emit($event)"
|
|
216
|
+
(voice)="voice.emit()"
|
|
217
|
+
(cancelReply)="replyingTo.set(null)"
|
|
218
|
+
/>
|
|
195
219
|
} @else {
|
|
196
|
-
<
|
|
220
|
+
<div class="closed-banner">{{ t('conversationClosed') }}</div>
|
|
197
221
|
}
|
|
198
222
|
</div>
|
|
199
|
-
`, isInline: true, styles: [".chat
|
|
223
|
+
`, isInline: true, styles: [":host{display:block;height:100%}.chat{position:relative;display:flex;flex-direction:column;height:100%;min-height:0}.messages{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:0}.state{margin:auto;display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--ion-color-medium, #92949c);font-size:.9375rem;text-align:center;padding:24px}.state.empty ion-icon{font-size:2.5rem;opacity:.5}.date-sep{position:sticky;top:4px;z-index:1;display:flex;justify-content:center;margin:8px 0}.date-sep span{font-size:.75rem;color:var(--ion-color-medium, #92949c);background:var(--ion-color-step-100, rgba(127, 127, 127, .14));padding:3px 12px;border-radius:999px;backdrop-filter:blur(4px)}.scroll-down{position:absolute;right:14px;bottom:84px;width:40px;height:40px;border-radius:50%;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium, #92949c);box-shadow:0 2px 10px #00000026;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1.25rem;z-index:3}.scroll-down .dot{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background:var(--ion-color-primary);border:2px solid var(--ion-card-background, #fff)}.closed-banner{text-align:center;padding:14px;color:var(--ion-color-medium, #92949c);font-size:.875rem;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: MessageBubbleComponent, selector: "val-message-bubble", inputs: ["msg", "showAvatar", "showName", "tail", "locale"], outputs: ["action"] }, { kind: "component", type: ChatComposerComponent, selector: "val-chat-composer", inputs: ["placeholder", "disabled", "maxLength", "replyingTo", "showAttach", "showMic"], outputs: ["send", "typing", "attach", "voice", "cancelReply"] }, { kind: "component", type: TypingIndicatorComponent, selector: "val-typing-indicator", inputs: ["typingUsers"] }] }); }
|
|
200
224
|
}
|
|
201
225
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatWindowComponent, decorators: [{
|
|
202
226
|
type: Component,
|
|
203
|
-
args: [{ selector: 'val-chat-window', standalone: true, imports: [CommonModule, IonIcon,
|
|
204
|
-
<div class="chat
|
|
205
|
-
<div class="messages
|
|
206
|
-
@if (isLoading) {
|
|
207
|
-
<div class="
|
|
208
|
-
<
|
|
209
|
-
|
|
227
|
+
args: [{ selector: 'val-chat-window', standalone: true, imports: [CommonModule, IonIcon, MessageBubbleComponent, ChatComposerComponent, TypingIndicatorComponent], template: `
|
|
228
|
+
<div class="chat">
|
|
229
|
+
<div #msgs class="messages" (scroll)="onScroll()">
|
|
230
|
+
@if (isLoading()) {
|
|
231
|
+
<div class="state">
|
|
232
|
+
<span>{{ t('loading') }}</span>
|
|
233
|
+
</div>
|
|
234
|
+
} @else if (rows().length === 0) {
|
|
235
|
+
<div class="state empty">
|
|
236
|
+
<ion-icon name="chatbubbles-outline" aria-hidden="true" />
|
|
237
|
+
<span>{{ t('noMessages') }}</span>
|
|
210
238
|
</div>
|
|
211
239
|
} @else {
|
|
212
|
-
@for (
|
|
213
|
-
|
|
214
|
-
<div class="date-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
@for (msg of group.messages; track msg.msgId) {
|
|
240
|
+
@for (row of rows(); track row.id) {
|
|
241
|
+
@if (row.kind === 'date') {
|
|
242
|
+
<div class="date-sep">
|
|
243
|
+
<span>{{ row.label }}</span>
|
|
244
|
+
</div>
|
|
245
|
+
} @else {
|
|
219
246
|
<val-message-bubble
|
|
220
|
-
[
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
247
|
+
[msg]="row.msg"
|
|
248
|
+
[showName]="row.showName"
|
|
249
|
+
[showAvatar]="row.showAvatar"
|
|
250
|
+
[tail]="row.tail"
|
|
251
|
+
[locale]="locale()"
|
|
252
|
+
(action)="onAction($event)"
|
|
225
253
|
/>
|
|
226
254
|
}
|
|
227
255
|
}
|
|
228
256
|
}
|
|
257
|
+
<val-typing-indicator [typingUsers]="typingUsers()" />
|
|
229
258
|
</div>
|
|
230
259
|
|
|
231
|
-
|
|
260
|
+
@if (!atBottom()) {
|
|
261
|
+
<button class="scroll-down" (click)="scrollToBottom(true)" aria-label="scroll">
|
|
262
|
+
<ion-icon name="arrow-down-outline" aria-hidden="true" />
|
|
263
|
+
@if (hasNew()) {
|
|
264
|
+
<span class="dot"></span>
|
|
265
|
+
}
|
|
266
|
+
</button>
|
|
267
|
+
}
|
|
232
268
|
|
|
233
|
-
@if (
|
|
234
|
-
<
|
|
269
|
+
@if (isOpen()) {
|
|
270
|
+
<val-chat-composer
|
|
271
|
+
[replyingTo]="replyingTo()"
|
|
272
|
+
(send)="onSend($event)"
|
|
273
|
+
(typing)="typing.emit()"
|
|
274
|
+
(attach)="attach.emit($event)"
|
|
275
|
+
(voice)="voice.emit()"
|
|
276
|
+
(cancelReply)="replyingTo.set(null)"
|
|
277
|
+
/>
|
|
235
278
|
} @else {
|
|
236
|
-
<
|
|
279
|
+
<div class="closed-banner">{{ t('conversationClosed') }}</div>
|
|
237
280
|
}
|
|
238
281
|
</div>
|
|
239
|
-
`, styles: [".chat
|
|
240
|
-
}], ctorParameters: () => []
|
|
241
|
-
type: Input
|
|
242
|
-
}], messages: [{
|
|
243
|
-
type: Input
|
|
244
|
-
}], participants: [{
|
|
245
|
-
type: Input
|
|
246
|
-
}], currentUserId: [{
|
|
247
|
-
type: Input
|
|
248
|
-
}], isOpen: [{
|
|
249
|
-
type: Input
|
|
250
|
-
}], typingUsers: [{
|
|
251
|
-
type: Input
|
|
252
|
-
}], isLoading: [{
|
|
253
|
-
type: Input
|
|
254
|
-
}], sendMessage: [{
|
|
255
|
-
type: Output
|
|
256
|
-
}], loadMore: [{
|
|
257
|
-
type: Output
|
|
258
|
-
}], reactionClick: [{
|
|
259
|
-
type: Output
|
|
260
|
-
}], deleteMessage: [{
|
|
261
|
-
type: Output
|
|
262
|
-
}], replyTo: [{
|
|
263
|
-
type: Output
|
|
264
|
-
}], messagesListRef: [{
|
|
265
|
-
type: ViewChild,
|
|
266
|
-
args: ['messagesList']
|
|
267
|
-
}], chatWindowElRef: [{
|
|
268
|
-
type: ViewChild,
|
|
269
|
-
args: ['chatWindowEl']
|
|
270
|
-
}] } });
|
|
271
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9jaGF0LXdpbmRvdy9jaGF0LXdpbmRvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUtSLFNBQVMsR0FJVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUNqRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQzs7QUFHdkcsUUFBUSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDdkIsRUFBRSxFQUFFO1FBQ0Ysa0JBQWtCLEVBQUUsZ0NBQWdDO1FBQ3BELE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsVUFBVSxFQUFFLHFCQUFxQjtLQUNsQztJQUNELEVBQUUsRUFBRTtRQUNGLGtCQUFrQixFQUFFLDZCQUE2QjtRQUNqRCxPQUFPLEVBQUUscUJBQXFCO1FBQzlCLFVBQVUsRUFBRSxpQkFBaUI7S0FDOUI7Q0FD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Y0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsQ0FBQyxZQUN4Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NUO3dEQU1RLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFFNEIsZUFBZTtzQkFBakQsU0FBUzt1QkFBQyxjQUFjO2dCQUNVLGVBQWU7c0JBQWpELFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIGNvbXB1dGVkLFxuICBzaWduYWwsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IElvbkljb24sIElvblNwaW5uZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgY2hhdGJ1YmJsZXNPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IE1lc3NhZ2VCdWJibGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvbWVzc2FnZS1idWJibGUvbWVzc2FnZS1idWJibGUuY29tcG9uZW50JztcbmltcG9ydCB7IENoYXRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9jaGF0LWlucHV0L2NoYXQtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFR5cGluZ0luZGljYXRvckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy90eXBpbmctaW5kaWNhdG9yL3R5cGluZy1pbmRpY2F0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IE1lc3NhZ2VCdWJibGVNZXRhZGF0YSwgTWVzc2FnZVJlYWN0aW9uQ2xpY2tFdmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9tZXNzYWdlLWJ1YmJsZS90eXBlcyc7XG5cbmFkZEljb25zKHsgY2hhdGJ1YmJsZXNPdXRsaW5lIH0pO1xuXG5jb25zdCBDSEFUX1dJTkRPV19JMThOID0ge1xuICBlczoge1xuICAgIGNvbnZlcnNhdGlvbkNsb3NlZDogJ0VzdGEgY29udmVyc2FjaW9uIGVzdGEgY2VycmFkYScsXG4gICAgbG9hZGluZzogJ0NhcmdhbmRvIG1lbnNhamVzLi4uJyxcbiAgICBub01lc3NhZ2VzOiAnTm8gaGF5IG1lbnNhamVzIGF1bicsXG4gIH0sXG4gIGVuOiB7XG4gICAgY29udmVyc2F0aW9uQ2xvc2VkOiAnVGhpcyBjb252ZXJzYXRpb24gaXMgY2xvc2VkJyxcbiAgICBsb2FkaW5nOiAnTG9hZGluZyBtZXNzYWdlcy4uLicsXG4gICAgbm9NZXNzYWdlczogJ05vIG1lc3NhZ2VzIHlldCcsXG4gIH0sXG59O1xuXG4vKiogRXN0cnVjdHVyYSBpbnRlcm5hIHBhcmEgYWdydXBhciBtZW5zYWplcyBwb3IgZmVjaGEuICovXG5pbnRlcmZhY2UgTWVzc2FnZUdyb3VwIHtcbiAgZGF0ZUxhYmVsOiBzdHJpbmc7XG4gIG1lc3NhZ2VzOiBNZXNzYWdlQnViYmxlTWV0YWRhdGFbXTtcbn1cblxuLyoqXG4gKiB2YWwtY2hhdC13aW5kb3dcbiAqXG4gKiBWZW50YW5hIGRlIGNoYXQgY29tcGxldGEuIE11ZXN0cmEgbGEgbGlzdGEgZGUgbWVuc2FqZXMgYWdydXBhZG9zIHBvciBmZWNoYSxcbiAqIGVsIGluZGljYWRvciBkZSBlc2NyaXR1cmEsIGVsIGlucHV0IGRlIG1lbnNhamUgKHNvbG8gc2kgaXNPcGVuKSB5IHVuIGJhbm5lclxuICogY3VhbmRvIGxhIGNvbnZlcnNhY2lvbiBlc3RhIGNlcnJhZGEuIEF1dG8tc2Nyb2xsIGFsIHVsdGltbyBtZW5zYWplIGN1YW5kb1xuICogbGxlZ2FuIG1lbnNhamVzIG51ZXZvcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHZhbC1jaGF0LXdpbmRvd1xuICogICBbY29udklkXT1cImNvbnYuaWRcIlxuICogICBbbWVzc2FnZXNdPVwibWVzc2FnZXMoKVwiXG4gKiAgIFtjdXJyZW50VXNlcklkXT1cInVzZXJJZFwiXG4gKiAgIFtpc09wZW5dPVwiY29udi5zdGF0dXMgPT09ICdvcGVuJ1wiXG4gKiAgIFt0eXBpbmdVc2Vyc109XCJ0eXBpbmdVc2VycygpXCJcbiAqICAgKHNlbmRNZXNzYWdlKT1cIm9uU2VuZCgkZXZlbnQpXCJcbiAqICAgKHJlYWN0aW9uQ2xpY2spPVwib25SZWFjdGlvbigkZXZlbnQpXCJcbiAqIC8+XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1jaGF0LXdpbmRvdycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElvbkljb24sIElvblNwaW5uZXIsIE1lc3NhZ2VCdWJibGVDb21wb25lbnQsIENoYXRJbnB1dENvbXBvbmVudCwgVHlwaW5nSW5kaWNhdG9yQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY2hhdC13aW5kb3dcIiAjY2hhdFdpbmRvd0VsPlxuICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VzLWxpc3RcIiAjbWVzc2FnZXNMaXN0PlxuICAgICAgICBAaWYgKGlzTG9hZGluZykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXN0YXRlXCI+XG4gICAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImRvdHNcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgICAgPHNwYW4+e3sgbG9hZGluZ1RleHQoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgQGZvciAoZ3JvdXAgb2YgbWVzc2FnZUdyb3VwcygpOyB0cmFjayBncm91cC5kYXRlTGFiZWwpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXNlcGFyYXRvclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1sYWJlbFwiPnt7IGdyb3VwLmRhdGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtbGluZVwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAZm9yIChtc2cgb2YgZ3JvdXAubWVzc2FnZXM7IHRyYWNrIG1zZy5tc2dJZCkge1xuICAgICAgICAgICAgICA8dmFsLW1lc3NhZ2UtYnViYmxlXG4gICAgICAgICAgICAgICAgW3Byb3BzXT1cIm1zZ1wiXG4gICAgICAgICAgICAgICAgKHJlYWN0aW9uQ2xpY2spPVwib25SZWFjdGlvbkNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChyZXBseUNsaWNrKT1cInJlcGx5VG8uZW1pdCgkZXZlbnQubXNnSWQpXCJcbiAgICAgICAgICAgICAgICAoZGVsZXRlQ2xpY2spPVwiZGVsZXRlTWVzc2FnZS5lbWl0KCRldmVudC5tc2dJZClcIlxuICAgICAgICAgICAgICAgIChlZGl0Q2xpY2spPVwib25FZGl0Q2xpY2soJGV2ZW50Lm1zZ0lkKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHZhbC10eXBpbmctaW5kaWNhdG9yIFt0eXBpbmdVc2Vyc109XCJ0eXBpbmdVc2Vyc1wiIC8+XG5cbiAgICAgIEBpZiAoIWlzT3Blbikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xvc2VkLWJhbm5lclwiPnt7IGNsb3NlZFRleHQoKSB9fTwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx2YWwtY2hhdC1pbnB1dCBbcHJvcHNdPVwieyBkaXNhYmxlZDogaXNMb2FkaW5nIH1cIiAoc2VuZCk9XCJzZW5kTWVzc2FnZS5lbWl0KCRldmVudClcIiAodHlwaW5nKT1cIm9uVHlwaW5nKClcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LXdpbmRvdy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDaGF0V2luZG93Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG5cbiAgQElucHV0KCkgY29udklkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbWVzc2FnZXM6IE1lc3NhZ2VCdWJibGVNZXRhZGF0YVtdID0gW107XG4gIEBJbnB1dCgpIHBhcnRpY2lwYW50czogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgY3VycmVudFVzZXJJZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHR5cGluZ1VzZXJzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgc2VuZE1lc3NhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVhY3Rpb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtc2dJZDogc3RyaW5nOyB0b2tlbjogc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVNZXNzYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSByZXBseVRvID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWVzc2FnZXNMaXN0JykgcHJpdmF0ZSBtZXNzYWdlc0xpc3RSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY2hhdFdpbmRvd0VsJykgcHJpdmF0ZSBjaGF0V2luZG93RWxSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBwcml2YXRlIHByZXZNZXNzYWdlQ291bnQgPSAwO1xuICBwcml2YXRlIHNob3VsZFNjcm9sbFRvQm90dG9tID0gZmFsc2U7XG4gIHByaXZhdGUgdnZMaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMoJ0NoYXRXaW5kb3cnLCBDSEFUX1dJTkRPV19JMThOKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnZpc3VhbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZ2TGlzdGVuZXIgPSAoKSA9PiB0aGlzLmFkanVzdFRvS2V5Ym9hcmQoKTtcbiAgICAgIHdpbmRvdy52aXN1YWxWaWV3cG9ydCEuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy52dkxpc3RlbmVyKTtcbiAgICAgIHRoaXMuYWRqdXN0VG9LZXlib2FyZCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZ2TGlzdGVuZXIgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnZpc3VhbFZpZXdwb3J0KSB7XG4gICAgICB3aW5kb3cudmlzdWFsVmlld3BvcnQhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMudnZMaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydtZXNzYWdlcyddKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gKGNoYW5nZXNbJ21lc3NhZ2VzJ10uY3VycmVudFZhbHVlIGFzIE1lc3NhZ2VCdWJibGVNZXRhZGF0YVtdKSA/PyBbXTtcbiAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCAhPT0gdGhpcy5wcmV2TWVzc2FnZUNvdW50KSB7XG4gICAgICAgIHRoaXMucHJldk1lc3NhZ2VDb3VudCA9IGN1cnJlbnQubGVuZ3RoO1xuICAgICAgICB0aGlzLnNob3VsZFNjcm9sbFRvQm90dG9tID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvdWxkU2Nyb2xsVG9Cb3R0b20pIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgIHRoaXMuc2hvdWxkU2Nyb2xsVG9Cb3R0b20gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkanVzdFRvS2V5Ym9hcmQoKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSB0aGlzLmNoYXRXaW5kb3dFbFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVsIHx8ICF3aW5kb3cudmlzdWFsVmlld3BvcnQpIHJldHVybjtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gd2luZG93LnZpc3VhbFZpZXdwb3J0IS5oZWlnaHQgLSByZWN0LnRvcDtcbiAgICBpZiAoYXZhaWxhYmxlID4gNTApIHtcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGAke2F2YWlsYWJsZX1weGA7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG1lc3NhZ2VHcm91cHMgPSBjb21wdXRlZCgoKTogTWVzc2FnZUdyb3VwW10gPT4ge1xuICAgIGNvbnN0IG1zZ3MgPSB0aGlzLm1lc3NhZ2VzID8/IFtdO1xuICAgIGlmIChtc2dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgZ3JvdXBzOiBNZXNzYWdlR3JvdXBbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50TGFiZWwgPSAnJztcbiAgICBsZXQgY3VycmVudEdyb3VwOiBNZXNzYWdlQnViYmxlTWV0YWRhdGFbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBtc2cgb2YgbXNncykge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmZvcm1hdERhdGVMYWJlbChtc2cuY3JlYXRlZEF0KTtcbiAgICAgIGlmIChsYWJlbCAhPT0gY3VycmVudExhYmVsKSB7XG4gICAgICAgIGlmIChjdXJyZW50R3JvdXAubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGdyb3Vwcy5wdXNoKHsgZGF0ZUxhYmVsOiBjdXJyZW50TGFiZWwsIG1lc3NhZ2VzOiBjdXJyZW50R3JvdXAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudExhYmVsID0gbGFiZWw7XG4gICAgICAgIGN1cnJlbnRHcm91cCA9IFttc2ddO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEdyb3VwLnB1c2gobXNnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEdyb3VwLmxlbmd0aCA+IDApIHtcbiAgICAgIGdyb3Vwcy5wdXNoKHsgZGF0ZUxhYmVsOiBjdXJyZW50TGFiZWwsIG1lc3NhZ2VzOiBjdXJyZW50R3JvdXAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwcztcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIGNsb3NlZFRleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoJ2NvbnZlcnNhdGlvbkNsb3NlZCcsICdDaGF0V2luZG93Jyk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBsb2FkaW5nVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB0aGlzLmkxOG4udCgnbG9hZGluZycsICdDaGF0V2luZG93Jyk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBvblJlYWN0aW9uQ2xpY2soZXZlbnQ6IE1lc3NhZ2VSZWFjdGlvbkNsaWNrRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWN0aW9uQ2xpY2suZW1pdCh7IG1zZ0lkOiBldmVudC5tc2dJZCwgdG9rZW46IGV2ZW50LnRva2VuIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRWRpdENsaWNrKF9tc2dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gSW1wbGVtZW50YWNpb24gZnV0dXJhOiBlbWl0aXIgZXZlbnRvIGRlIGVkaWNpb25cbiAgfVxuXG4gIHByb3RlY3RlZCBvblR5cGluZygpOiB2b2lkIHtcbiAgICAvLyBFbCBwYWRyZSBwdWVkZSBzdXNjcmliaXJzZSBhbCBvdXRwdXQgdHlwaW5nIHNpIG5lY2VzaXRhIHByb3BhZ2FyIGEgRmlyZXN0b3JlXG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvQm90dG9tKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5tZXNzYWdlc0xpc3RSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREYXRlTGFiZWwoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZCA9IGRhdGUgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZSA6IG5ldyBEYXRlKGRhdGUpO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIG5vdy5nZXREYXRlKCkpO1xuICAgIGNvbnN0IG1zZ0RheSA9IG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCBkLmdldERhdGUoKSk7XG4gICAgY29uc3QgZGlmZk1zID0gdG9kYXkuZ2V0VGltZSgpIC0gbXNnRGF5LmdldFRpbWUoKTtcbiAgICBjb25zdCBkaWZmRGF5cyA9IE1hdGgucm91bmQoZGlmZk1zIC8gODY0MDAwMDApO1xuXG4gICAgaWYgKGRpZmZEYXlzID09PSAwKSByZXR1cm4gdGhpcy5pMThuLnQoJ3RvZGF5JywgJ19nbG9iYWwnKSB8fCAnSG95JztcbiAgICBpZiAoZGlmZkRheXMgPT09IDEpIHJldHVybiB0aGlzLmkxOG4udCgneWVzdGVyZGF5JywgJ19nbG9iYWwnKSB8fCAnQXllcic7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKFtdLCB7IGRheTogJzItZGlnaXQnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pO1xuICB9XG59XG4iXX0=
|
|
282
|
+
`, styles: [":host{display:block;height:100%}.chat{position:relative;display:flex;flex-direction:column;height:100%;min-height:0}.messages{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:0}.state{margin:auto;display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--ion-color-medium, #92949c);font-size:.9375rem;text-align:center;padding:24px}.state.empty ion-icon{font-size:2.5rem;opacity:.5}.date-sep{position:sticky;top:4px;z-index:1;display:flex;justify-content:center;margin:8px 0}.date-sep span{font-size:.75rem;color:var(--ion-color-medium, #92949c);background:var(--ion-color-step-100, rgba(127, 127, 127, .14));padding:3px 12px;border-radius:999px;backdrop-filter:blur(4px)}.scroll-down{position:absolute;right:14px;bottom:84px;width:40px;height:40px;border-radius:50%;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium, #92949c);box-shadow:0 2px 10px #00000026;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1.25rem;z-index:3}.scroll-down .dot{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background:var(--ion-color-primary);border:2px solid var(--ion-card-background, #fff)}.closed-banner{text-align:center;padding:14px;color:var(--ion-color-medium, #92949c);font-size:.875rem;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}\n"] }]
|
|
283
|
+
}], ctorParameters: () => [] });
|
|
284
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9jaGF0LXdpbmRvdy9jaGF0LXdpbmRvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0seURBQXlELENBQUM7QUFFdEgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDOUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkRBQTZELENBQUM7O0FBRXZHLFFBQVEsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztBQUVuRCxNQUFNLGdCQUFnQixHQUFHO0lBQ3ZCLEVBQUUsRUFBRTtRQUNGLGtCQUFrQixFQUFFLGdDQUFnQztRQUNwRCxPQUFPLEVBQUUsc0JBQXNCO1FBQy9CLFVBQVUsRUFBRSwwQ0FBMEM7UUFDdEQsV0FBVyxFQUFFLGlCQUFpQjtLQUMvQjtJ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Q0FBQztJQUN4QyxDQUFDOytHQXJJVSxtQkFBbUI7bUdBQW5CLG1CQUFtQiwrckNBbkpwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVEVCw4Z0RBeERTLFlBQVksK0JBQUUsT0FBTywySkFBRSxzQkFBc0IsaUpBQUUscUJBQXFCLHNOQUFFLHdCQUF3Qjs7NEZBb0o3RixtQkFBbUI7a0JBdkovQixTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLENBQUMsWUFDL0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RFQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGFycm93RG93bk91dGxpbmUsIGNoYXRidWJibGVzT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IGZvcm1hdERhdGVTZXBhcmF0b3IgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvZGF0ZXRpbWUnO1xuaW1wb3J0IHsgTWVzc2FnZVJlcGx5VG8gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGF0L3R5cGVzJztcbmltcG9ydCB7IE1lc3NhZ2VCdWJibGVDb21wb25lbnQsIE1lc3NhZ2VCdWJibGVBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvbWVzc2FnZS1idWJibGUvbWVzc2FnZS1idWJibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE1lc3NhZ2VCdWJibGVNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9tZXNzYWdlLWJ1YmJsZS90eXBlcyc7XG5pbXBvcnQgeyBDaGF0Q29tcG9zZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvY2hhdC1jb21wb3Nlci9jaGF0LWNvbXBvc2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUeXBpbmdJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvdHlwaW5nLWluZGljYXRvci90eXBpbmctaW5kaWNhdG9yLmNvbXBvbmVudCc7XG5cbmFkZEljb25zKHsgYXJyb3dEb3duT3V0bGluZSwgY2hhdGJ1YmJsZXNPdXRsaW5lIH0pO1xuXG5jb25zdCBDSEFUX1dJTkRPV19JMThOID0ge1xuICBlczoge1xuICAgIGNvbnZlcnNhdGlvbkNsb3NlZDogJ0VzdGEgY29udmVyc2FjaW9uIGVzdGEgY2VycmFkYScsXG4gICAgbG9hZGluZzogJ0NhcmdhbmRvIG1lbnNhamVzLi4uJyxcbiAgICBub01lc3NhZ2VzOiAnQXVuIG5vIGhheSBtZW5zYWplcy4gRXNjcmliZSBlbCBwcmltZXJvLicsXG4gICAgbmV3TWVzc2FnZXM6ICdNZW5zYWplcyBudWV2b3MnLFxuICB9LFxuICBlbjoge1xuICAgIGNvbnZlcnNhdGlvbkNsb3NlZDogJ1RoaXMgY29udmVyc2F0aW9uIGlzIGNsb3NlZCcsXG4gICAgbG9hZGluZzogJ0xvYWRpbmcgbWVzc2FnZXMuLi4nLFxuICAgIG5vTWVzc2FnZXM6ICdObyBtZXNzYWdlcyB5ZXQuIFNlbmQgdGhlIGZpcnN0IG9uZS4nLFxuICAgIG5ld01lc3NhZ2VzOiAnTmV3IG1lc3NhZ2VzJyxcbiAgfSxcbn07XG5cbnR5cGUgQ2hhdFJvdyA9XG4gIHwgeyBraW5kOiAnZGF0ZSc7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVxuICB8IHtcbiAgICAgIGtpbmQ6ICdtc2cnO1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIG1zZzogTWVzc2FnZUJ1YmJsZU1ldGFkYXRhO1xuICAgICAgc2hvd05hbWU6IGJvb2xlYW47XG4gICAgICBzaG93QXZhdGFyOiBib29sZWFuO1xuICAgICAgdGFpbDogYm9vbGVhbjtcbiAgICB9O1xuXG4vKipcbiAqIHZhbC1jaGF0LXdpbmRvdyDigJQgdmVudGFuYSBkZSBjaGF0IGNvbXBsZXRhIChzaWduYWwgaW5wdXRzKS5cbiAqXG4gKiBBZ3J1cGEgbWVuc2FqZXMgY29uc2VjdXRpdm9zIGRlbCBtaXNtbyBlbWlzb3IgeSBwb3IgZMOtYSAoc2VwYXJhZG9yZXMgc3RpY2t5KSxcbiAqIG11ZXN0cmEgYXZhdGFyL25vbWJyZSBzb2xvIGVuIGxvcyBib3JkZXMgZGVsIGdydXBvLCBzY3JvbGwtdG8tYm90dG9tIGludGVsaWdlbnRlXG4gKiAoYXV0by1zY3JvbGwgc2kgZXN0w6FzIGFiYWpvLCBwaWxsIFwibWVuc2FqZXMgbnVldm9zXCIgc2kgZXN0w6FzIGxleWVuZG8gYXJyaWJhKSxcbiAqIGNvbXBvc2VyIG1vZGVybm8gY29uIGNvbnRleHRvIGRlIHJlc3B1ZXN0YSwgeSB0eXBpbmcgaW5kaWNhdG9yLlxuICpcbiAqIEFQSSBww7pibGljYSBlc3RhYmxlIChjb25zdW1pZGEgcG9yIHRocmVhZC1wYW5lbCB5IHNob3djYXNlKTogaW5wdXRzIGNvbnZJZCxcbiAqIG1lc3NhZ2VzLCBjdXJyZW50VXNlcklkLCBpc09wZW4sIHR5cGluZ1VzZXJzLCBpc0xvYWRpbmc7IG91dHB1dHMgc2VuZE1lc3NhZ2UsXG4gKiBsb2FkTW9yZSwgcmVhY3Rpb25DbGljaywgZGVsZXRlTWVzc2FnZSwgcmVwbHlUbyAoKyBlZGl0TWVzc2FnZS9hdHRhY2gvdm9pY2UgbnVldm9zKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWNoYXQtd2luZG93JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uSWNvbiwgTWVzc2FnZUJ1YmJsZUNvbXBvbmVudCwgQ2hhdENvbXBvc2VyQ29tcG9uZW50LCBUeXBpbmdJbmRpY2F0b3JDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJjaGF0XCI+XG4gICAgICA8ZGl2ICNtc2dzIGNsYXNzPVwibWVzc2FnZXNcIiAoc2Nyb2xsKT1cIm9uU2Nyb2xsKClcIj5cbiAgICAgICAgQGlmIChpc0xvYWRpbmcoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0ZVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgdCgnbG9hZGluZycpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIGlmIChyb3dzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRlIGVtcHR5XCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoYXRidWJibGVzLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgPHNwYW4+e3sgdCgnbm9NZXNzYWdlcycpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBAZm9yIChyb3cgb2Ygcm93cygpOyB0cmFjayByb3cuaWQpIHtcbiAgICAgICAgICAgIEBpZiAocm93LmtpbmQgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1zZXBcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyByb3cubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDx2YWwtbWVzc2FnZS1idWJibGVcbiAgICAgICAgICAgICAgICBbbXNnXT1cInJvdy5tc2dcIlxuICAgICAgICAgICAgICAgIFtzaG93TmFtZV09XCJyb3cuc2hvd05hbWVcIlxuICAgICAgICAgICAgICAgIFtzaG93QXZhdGFyXT1cInJvdy5zaG93QXZhdGFyXCJcbiAgICAgICAgICAgICAgICBbdGFpbF09XCJyb3cudGFpbFwiXG4gICAgICAgICAgICAgICAgW2xvY2FsZV09XCJsb2NhbGUoKVwiXG4gICAgICAgICAgICAgICAgKGFjdGlvbik9XCJvbkFjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPHZhbC10eXBpbmctaW5kaWNhdG9yIFt0eXBpbmdVc2Vyc109XCJ0eXBpbmdVc2VycygpXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKCFhdEJvdHRvbSgpKSB7XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzY3JvbGwtZG93blwiIChjbGljayk9XCJzY3JvbGxUb0JvdHRvbSh0cnVlKVwiIGFyaWEtbGFiZWw9XCJzY3JvbGxcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFycm93LWRvd24tb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgQGlmIChoYXNOZXcoKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RcIj48L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cblxuICAgICAgQGlmIChpc09wZW4oKSkge1xuICAgICAgICA8dmFsLWNoYXQtY29tcG9zZXJcbiAgICAgICAgICBbcmVwbHlpbmdUb109XCJyZXBseWluZ1RvKClcIlxuICAgICAgICAgIChzZW5kKT1cIm9uU2VuZCgkZXZlbnQpXCJcbiAgICAgICAgICAodHlwaW5nKT1cInR5cGluZy5lbWl0KClcIlxuICAgICAgICAgIChhdHRhY2gpPVwiYXR0YWNoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKHZvaWNlKT1cInZvaWNlLmVtaXQoKVwiXG4gICAgICAgICAgKGNhbmNlbFJlcGx5KT1cInJlcGx5aW5nVG8uc2V0KG51bGwpXCJcbiAgICAgICAgLz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xvc2VkLWJhbm5lclwiPnt7IHQoJ2NvbnZlcnNhdGlvbkNsb3NlZCcpIH19PC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH1cbiAgICAgIC5jaGF0IHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICB9XG4gICAgICAubWVzc2FnZXMge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgICBwYWRkaW5nOiAxMnB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDA7XG4gICAgICB9XG4gICAgICAuc3RhdGUge1xuICAgICAgICBtYXJnaW46IGF1dG87XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45Mzc1cmVtO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgICB9XG4gICAgICAuc3RhdGUuZW1wdHkgaW9uLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDIuNXJlbTtcbiAgICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgfVxuICAgICAgLmRhdGUtc2VwIHtcbiAgICAgICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAgICAgdG9wOiA0cHg7XG4gICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBtYXJnaW46IDhweCAwO1xuICAgICAgfVxuICAgICAgLmRhdGUtc2VwIHNwYW4ge1xuICAgICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXN0ZXAtMTAwLCByZ2JhKDEyNywgMTI3LCAxMjcsIDAuMTQpKTtcbiAgICAgICAgcGFkZGluZzogM3B4IDEycHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgICAgIH1cbiAgICAgIC5zY3JvbGwtZG93biB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDE0cHg7XG4gICAgICAgIGJvdHRvbTogODRweDtcbiAgICAgICAgd2lkdGg6IDQwcHg7XG4gICAgICAgIGhlaWdodDogNDBweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMSkpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1pb24tYmFja2dyb3VuZC1jb2xvciwgI2ZmZikpO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICAgICAgei1pbmRleDogMztcbiAgICAgIH1cbiAgICAgIC5zY3JvbGwtZG93biAuZG90IHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB3aWR0aDogMTJweDtcbiAgICAgICAgaGVpZ2h0OiAxMnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5KTtcbiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0taW9uLWNhcmQtYmFja2dyb3VuZCwgI2ZmZik7XG4gICAgICB9XG4gICAgICAuY2xvc2VkLWJhbm5lciB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogMTRweDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhdFdpbmRvd0NvbXBvbmVudCB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgY29udklkID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IG1lc3NhZ2VzID0gaW5wdXQ8TWVzc2FnZUJ1YmJsZU1ldGFkYXRhW10+KFtdKTtcbiAgcmVhZG9ubHkgY3VycmVudFVzZXJJZCA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc09wZW4gPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgdHlwaW5nVXNlcnMgPSBpbnB1dDxzdHJpbmdbXT4oW10pO1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgcmVhZG9ubHkgc2VuZE1lc3NhZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsb2FkTW9yZSA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSByZWFjdGlvbkNsaWNrID0gb3V0cHV0PHsgbXNnSWQ6IHN0cmluZzsgdG9rZW46IHN0cmluZyB9PigpO1xuICByZWFkb25seSBkZWxldGVNZXNzYWdlID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgcmVwbHlUbyA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGVkaXRNZXNzYWdlID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdHlwaW5nID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IGF0dGFjaCA9IG91dHB1dDxGaWxlPigpO1xuICByZWFkb25seSB2b2ljZSA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbXNnc0VsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignbXNncycpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSByZXBseWluZ1RvID0gc2lnbmFsPE1lc3NhZ2VSZXBseVRvIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhdEJvdHRvbSA9IHNpZ25hbCh0cnVlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhc05ldyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvY2FsZSA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmkxOG4ubGFuZygpID09PSAnZW4nID8gJ2VuLVVTJyA6ICdlcy1DTCcpKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnQ2hhdFdpbmRvdycsIENIQVRfV0lORE9XX0kxOE4pO1xuXG4gICAgLy8gQXV0by1zY3JvbGwgYWwgZm9uZG8gY3VhbmRvIGxsZWdhbiBtZW5zYWplcyB5IGVsIHVzdWFyaW8geWEgZXN0YWJhIGFiYWpvXG4gICAgLy8gKG8gZWwgw7psdGltbyBtZW5zYWplIGVzIHByb3BpbykuIFNpIGVzdMOhIGxleWVuZG8gYXJyaWJhLCBtYXJjYSBcIm51ZXZvc1wiLlxuICAgIGxldCBwcmV2Q291bnQgPSAwO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gdGhpcy5yb3dzKCk7XG4gICAgICBjb25zdCBjb3VudCA9IHJvd3MubGVuZ3RoO1xuICAgICAgaWYgKGNvdW50ID09PSBwcmV2Q291bnQpIHJldHVybjtcbiAgICAgIGNvbnN0IGdyZXcgPSBjb3VudCA+IHByZXZDb3VudDtcbiAgICAgIHByZXZDb3VudCA9IGNvdW50O1xuICAgICAgY29uc3QgbGFzdCA9IHRoaXMubWVzc2FnZXMoKVt0aGlzLm1lc3NhZ2VzKCkubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCBtaW5lID0gbGFzdD8uaXNNaW5lID8/IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuYXRCb3R0b20oKSB8fCBtaW5lKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0JvdHRvbShmYWxzZSksIDApO1xuICAgICAgfSBlbHNlIGlmIChncmV3KSB7XG4gICAgICAgIHRoaXMuaGFzTmV3LnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSByb3dzID0gY29tcHV0ZWQ8Q2hhdFJvd1tdPigoKSA9PiB7XG4gICAgY29uc3QgbXNncyA9IHRoaXMubWVzc2FnZXMoKTtcbiAgICBpZiAobXNncy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICB0b2RheTogdGhpcy5pMThuLnQoJ3RvZGF5JywgJ19nbG9iYWwnKSxcbiAgICAgIHllc3RlcmRheTogdGhpcy5pMThuLnQoJ3llc3RlcmRheScsICdfZ2xvYmFsJyksXG4gICAgfTtcbiAgICBjb25zdCBvdXQ6IENoYXRSb3dbXSA9IFtdO1xuICAgIGxldCBwcmV2RGF5ID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBtID0gbXNnc1tpXTtcbiAgICAgIGNvbnN0IGQgPSBtLmNyZWF0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBtLmNyZWF0ZWRBdCA6IG5ldyBEYXRlKG0uY3JlYXRlZEF0KTtcbiAgICAgIGNvbnN0IGRheSA9IGAke2QuZ2V0RnVsbFllYXIoKX0tJHtkLmdldE1vbnRoKCl9LSR7ZC5nZXREYXRlKCl9YDtcbiAgICAgIGNvbnN0IG5ld0RheSA9IGRheSAhPT0gcHJldkRheTtcbiAgICAgIGlmIChuZXdEYXkpIHtcbiAgICAgICAgb3V0LnB1c2goeyBraW5kOiAnZGF0ZScsIGlkOiAnZGF0ZS0nICsgZGF5LCBsYWJlbDogZm9ybWF0RGF0ZVNlcGFyYXRvcihkLCB0aGlzLmxvY2FsZSgpLCBsYWJlbHMpIH0pO1xuICAgICAgICBwcmV2RGF5ID0gZGF5O1xuICAgICAgfVxuICAgICAgY29uc3QgcHJldiA9IG1zZ3NbaSAtIDFdO1xuICAgICAgY29uc3QgbmV4dCA9IG1zZ3NbaSArIDFdO1xuICAgICAgY29uc3QgZmlyc3RJbkdyb3VwID0gbmV3RGF5IHx8ICFwcmV2IHx8IHByZXYuc2VuZGVySWQgIT09IG0uc2VuZGVySWQ7XG4gICAgICBjb25zdCBuZXh0RGF5ID0gbmV4dFxuICAgICAgICA/IGAke25ldyBEYXRlKG5leHQuY3JlYXRlZEF0KS5nZXRGdWxsWWVhcigpfS0ke25ldyBEYXRlKG5leHQuY3JlYXRlZEF0KS5nZXRNb250aCgpfS0ke25ldyBEYXRlKG5leHQuY3JlYXRlZEF0KS5nZXREYXRlKCl9YFxuICAgICAgICA6ICcnO1xuICAgICAgY29uc3QgbGFzdEluR3JvdXAgPSAhbmV4dCB8fCBuZXh0LnNlbmRlcklkICE9PSBtLnNlbmRlcklkIHx8IG5leHREYXkgIT09IGRheTtcbiAgICAgIG91dC5wdXNoKHtcbiAgICAgICAga2luZDogJ21zZycsXG4gICAgICAgIGlkOiBtLm1zZ0lkLFxuICAgICAgICBtc2c6IG0sXG4gICAgICAgIHNob3dOYW1lOiBmaXJzdEluR3JvdXAgJiYgIW0uaXNNaW5lLFxuICAgICAgICBzaG93QXZhdGFyOiBsYXN0SW5Hcm91cCAmJiAhbS5pc01pbmUsXG4gICAgICAgIHRhaWw6IGxhc3RJbkdyb3VwLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBvblNjcm9sbCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMubXNnc0VsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IG5lYXJCb3R0b20gPSBlbC5zY3JvbGxIZWlnaHQgLSBlbC5zY3JvbGxUb3AgLSBlbC5jbGllbnRIZWlnaHQgPCA4MDtcbiAgICB0aGlzLmF0Qm90dG9tLnNldChuZWFyQm90dG9tKTtcbiAgICBpZiAobmVhckJvdHRvbSkgdGhpcy5oYXNOZXcuc2V0KGZhbHNlKTtcbiAgICBpZiAoZWwuc2Nyb2xsVG9wIDwgNDApIHRoaXMubG9hZE1vcmUuZW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFRvQm90dG9tKHNtb290aDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5tc2dzRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwuc2Nyb2xsVG8oeyB0b3A6IGVsLnNjcm9sbEhlaWdodCwgYmVoYXZpb3I6IHNtb290aCA/ICdzbW9vdGgnIDogJ2F1dG8nIH0pO1xuICAgIHRoaXMuYXRCb3R0b20uc2V0KHRydWUpO1xuICAgIHRoaXMuaGFzTmV3LnNldChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZW5kKGJvZHk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VuZE1lc3NhZ2UuZW1pdChib2R5KTtcbiAgICB0aGlzLnJlcGx5aW5nVG8uc2V0KG51bGwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQWN0aW9uKGV2ZW50OiBNZXNzYWdlQnViYmxlQWN0aW9uKTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdyZXBseSc6IHtcbiAgICAgICAgY29uc3QgbSA9IHRoaXMubWVzc2FnZXMoKS5maW5kKHggPT4geC5tc2dJZCA9PT0gZXZlbnQubXNnSWQpO1xuICAgICAgICBpZiAobSkge1xuICAgICAgICAgIHRoaXMucmVwbHlpbmdUby5zZXQoeyBtc2dJZDogbS5tc2dJZCwgc2VuZGVyTmFtZTogbS5zZW5kZXJOYW1lLCBib2R5OiBtLmJvZHkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXBseVRvLmVtaXQoZXZlbnQubXNnSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2VkaXQnOlxuICAgICAgICB0aGlzLmVkaXRNZXNzYWdlLmVtaXQoZXZlbnQubXNnSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHRoaXMuZGVsZXRlTWVzc2FnZS5lbWl0KGV2ZW50Lm1zZ0lkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWFjdCc6XG4gICAgICAgIHRoaXMucmVhY3Rpb25DbGljay5lbWl0KHsgbXNnSWQ6IGV2ZW50Lm1zZ0lkLCB0b2tlbjogZXZlbnQudG9rZW4gPz8gJ/CfkY0nIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnQ2hhdFdpbmRvdycpO1xuICB9XG59XG4iXX0=
|