valtech-components 4.0.236 → 4.0.238
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/organisms/profile-modal/profile-modal.component.mjs +6 -6
- package/esm2022/lib/components/organisms/profile-view/profile-content.component.mjs +610 -0
- package/esm2022/lib/components/organisms/profile-view/profile-view.component.mjs +22 -630
- package/esm2022/lib/services/header-actions.service.mjs +3 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/valtech-components.mjs +70 -72
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/profile-view/profile-content.component.d.ts +57 -0
- package/lib/components/organisms/profile-view/profile-view.component.d.ts +8 -74
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -1,657 +1,49 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Component, computed, effect, inject, Input, signal, viewChild } from '@angular/core';
|
|
3
|
-
import { ReactiveFormsModule, Validators } from '@angular/forms';
|
|
1
|
+
import { Component, Input, computed, inject } from '@angular/core';
|
|
4
2
|
import { ActivatedRoute } from '@angular/router';
|
|
5
|
-
import { firstValueFrom } from 'rxjs';
|
|
6
|
-
import { AvatarUploadComponent } from '../avatar-upload/avatar-upload.component';
|
|
7
|
-
import { FormComponent } from '../form/form.component';
|
|
8
|
-
import { ShareProfileModalComponent } from '../share-profile-modal/share-profile-modal.component';
|
|
9
|
-
import { CtaCardComponent } from '../../molecules/cta-card/cta-card.component';
|
|
10
|
-
import { SkeletonLayoutComponent } from '../skeleton-layout/skeleton-layout.component';
|
|
11
|
-
import { DisplayComponent } from '../../atoms/display/display.component';
|
|
12
|
-
import { TextComponent } from '../../atoms/text/text.component';
|
|
13
|
-
import { TitleComponent } from '../../atoms/title/title.component';
|
|
14
|
-
import { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';
|
|
15
|
-
import { createErrorStateProps } from '../../molecules/empty-state/factory';
|
|
16
|
-
import { ComponentStates, InputType } from '../../types';
|
|
17
|
-
import { AuthService } from '../../../services/auth/auth.service';
|
|
18
|
-
import { FirebaseService } from '../../../services/firebase/firebase.service';
|
|
19
|
-
import { FirestoreCollectionFactory } from '../../../services/firebase/firestore-collection';
|
|
20
3
|
import { I18nService } from '../../../services/i18n';
|
|
21
4
|
import { NavigationService } from '../../../services/navigation/navigation.service';
|
|
22
|
-
import {
|
|
23
|
-
import { ToastService } from '../../../services/toast.service';
|
|
24
|
-
import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
|
|
25
|
-
import { interpretError } from '../../../services/errors/interpret-error';
|
|
5
|
+
import { ProfileContentComponent } from './profile-content.component';
|
|
26
6
|
import { PROFILE_VIEW_I18N } from './profile-view.i18n';
|
|
27
7
|
import * as i0 from "@angular/core";
|
|
28
|
-
/** Patrón sincronizado con backend handleRegex: lowercase alfanum + underscore. */
|
|
29
|
-
const HANDLE_PATTERN = /^[a-z_][a-z0-9_]*$/;
|
|
30
|
-
const HANDLE_MIN = 3;
|
|
31
|
-
const HANDLE_MAX = 20;
|
|
32
8
|
const DEFAULT_NAMESPACE = 'Settings.Profile';
|
|
33
9
|
/**
|
|
34
|
-
* `val-profile-view` — vista Perfil
|
|
10
|
+
* `val-profile-view` — vista Perfil ruteada (organism). Wrapper delgado:
|
|
11
|
+
* configura el header del shell (`NavigationService.setBackHeader`) y delega TODO
|
|
12
|
+
* el contenido/lógica a `val-profile-content`.
|
|
35
13
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* - Avatar — val-avatar-upload (Firebase Storage + backend sync). Separado del
|
|
39
|
-
* form porque es upload sync independiente.
|
|
40
|
-
* - Handle (@usuario) — InputType.HANDLE (val-username-input con check de
|
|
41
|
-
* disponibilidad async resuelto vía AuthService inyectado).
|
|
42
|
-
* - Nombre — InputType.TEXT.
|
|
43
|
-
* - Teléfono — InputType.PHONE.
|
|
14
|
+
* El contenido vive en `val-profile-content` (sin cromática de página) para poder
|
|
15
|
+
* reutilizarse también desde `val-profile-modal` sin contaminar el header.
|
|
44
16
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* 2. Si name o phone cambió → updateProfile con ambos.
|
|
48
|
-
*
|
|
49
|
-
* Lectura del perfil: suscribe al doc Firestore /users/{uid} (mirror que mantiene
|
|
50
|
-
* el backend). Reactivo cross-tab + auto-refresca tras save. Fallback REST
|
|
51
|
-
* (auth.getProfile) si el doc no existe o el listener falla.
|
|
52
|
-
*
|
|
53
|
-
* NO renderiza ion-content — vive dentro de val-page-wrapper.
|
|
54
|
-
*
|
|
55
|
-
* Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no
|
|
56
|
-
* proveyó el namespace configurado (default `Settings.Profile`).
|
|
17
|
+
* Consumo: igual que antes (ruta vía `provideValtechProfileRoutes` o embebida con
|
|
18
|
+
* `[config]`). La config se pasa tal cual al contenido.
|
|
57
19
|
*/
|
|
58
20
|
export class ProfileViewComponent {
|
|
59
|
-
/** Namespace i18n resuelto (capturado una vez para llamadas no-reactivas). */
|
|
60
|
-
get ns() {
|
|
61
|
-
return this.resolvedConfig().i18nNamespace;
|
|
62
|
-
}
|
|
63
21
|
constructor() {
|
|
64
22
|
this.nav = inject(NavigationService);
|
|
65
|
-
this.auth = inject(AuthService);
|
|
66
23
|
this.i18n = inject(I18nService);
|
|
67
|
-
this.toast = inject(ToastService);
|
|
68
|
-
this.errors = inject(ValtechErrorService);
|
|
69
|
-
this.firebase = inject(FirebaseService);
|
|
70
|
-
this.collections = inject(FirestoreCollectionFactory);
|
|
71
24
|
this.route = inject(ActivatedRoute, { optional: true });
|
|
72
|
-
|
|
73
|
-
this.resolvedConfig = computed(() => {
|
|
25
|
+
this.ns = computed(() => {
|
|
74
26
|
const fromRoute = (this.route?.snapshot.data['profileConfig'] ?? {});
|
|
75
|
-
|
|
76
|
-
return {
|
|
77
|
-
showAvatar: merged.showAvatar ?? true,
|
|
78
|
-
showHandle: merged.showHandle ?? true,
|
|
79
|
-
showPhone: merged.showPhone ?? true,
|
|
80
|
-
showShareCta: merged.showShareCta ?? true,
|
|
81
|
-
profileBaseUrl: merged.profileBaseUrl ?? '',
|
|
82
|
-
i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE,
|
|
83
|
-
onSaved: merged.onSaved,
|
|
84
|
-
onAvatarUploaded: merged.onAvatarUploaded,
|
|
85
|
-
};
|
|
86
|
-
});
|
|
87
|
-
/**
|
|
88
|
-
* Colección global /users/{uid} (skipAppPrefix: true — el doc vive fuera de
|
|
89
|
-
* apps/{appId}/... porque es cross-app, ver firestore.rules).
|
|
90
|
-
*/
|
|
91
|
-
this.usersCol = this.collections.create('users', {
|
|
92
|
-
skipAppPrefix: true,
|
|
93
|
-
});
|
|
94
|
-
this.formCmp = viewChild('form');
|
|
95
|
-
this.profile = signal(null);
|
|
96
|
-
this.loading = signal(true);
|
|
97
|
-
this.saving = signal(false);
|
|
98
|
-
this.loadError = signal(null);
|
|
99
|
-
this.shareOpen = signal(false);
|
|
100
|
-
this.shareCta = computed(() => {
|
|
101
|
-
this.i18n.lang();
|
|
102
|
-
return {
|
|
103
|
-
title: this.t('shareCtaTitle'),
|
|
104
|
-
description: this.t('shareCtaDesc'),
|
|
105
|
-
bordered: true,
|
|
106
|
-
actions: {
|
|
107
|
-
position: 'left',
|
|
108
|
-
columned: false,
|
|
109
|
-
buttons: [
|
|
110
|
-
{
|
|
111
|
-
text: this.t('shareCtaBtn'),
|
|
112
|
-
color: 'dark',
|
|
113
|
-
shape: 'round',
|
|
114
|
-
type: 'button',
|
|
115
|
-
state: 'ENABLED',
|
|
116
|
-
token: 'share',
|
|
117
|
-
},
|
|
118
|
-
],
|
|
119
|
-
},
|
|
120
|
-
};
|
|
27
|
+
return this.config?.i18nNamespace ?? fromRoute.i18nNamespace ?? DEFAULT_NAMESPACE;
|
|
121
28
|
});
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const base = this.resolvedConfig().profileBaseUrl;
|
|
126
|
-
return {
|
|
127
|
-
name: p?.name ?? '',
|
|
128
|
-
handle: p?.handle,
|
|
129
|
-
avatarUrl: p?.avatarUrl,
|
|
130
|
-
email: p?.email,
|
|
131
|
-
url: base ? `${base}/u/${handle}` : `/u/${handle}`,
|
|
132
|
-
};
|
|
133
|
-
});
|
|
134
|
-
this._userId = computed(() => this.auth.user()?.userId ?? null);
|
|
135
|
-
this.errorState = computed(() => {
|
|
136
|
-
this.i18n.lang();
|
|
137
|
-
const err = this.loadError();
|
|
138
|
-
if (!err)
|
|
139
|
-
return null;
|
|
140
|
-
return createErrorStateProps(err, {
|
|
141
|
-
title: {
|
|
142
|
-
offline: this.t('offlineTitle'),
|
|
143
|
-
error: this.t('errorTitle'),
|
|
144
|
-
},
|
|
145
|
-
description: {
|
|
146
|
-
offline: this.t('offlineHint'),
|
|
147
|
-
error: interpretError(err).message,
|
|
148
|
-
},
|
|
149
|
-
retryLabel: this.t('retry'),
|
|
150
|
-
onRetry: () => this.loadFromApi(),
|
|
151
|
-
retrying: this.loading(),
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
this.avatarProps = computed(() => {
|
|
155
|
-
this.i18n.lang();
|
|
156
|
-
const p = this.profile();
|
|
157
|
-
return {
|
|
158
|
-
currentUrl: p?.avatarUrl,
|
|
159
|
-
initials: this.initialsFromName(p?.name),
|
|
160
|
-
size: 96,
|
|
161
|
-
editable: true,
|
|
162
|
-
showViewButton: true,
|
|
163
|
-
i18nNamespace: this.ns,
|
|
164
|
-
};
|
|
165
|
-
});
|
|
166
|
-
this.formMeta = this.buildFormMeta();
|
|
167
|
-
// Auto-registro i18n — respeta override del consumer. El namespace puede
|
|
168
|
-
// venir de @Input.config o del route data; lo resolvemos acá.
|
|
169
|
-
const ns = this.ns;
|
|
29
|
+
const ns = this.ns();
|
|
30
|
+
// El header usa la key 'pageTitle' del namespace; el contenido registra los
|
|
31
|
+
// defaults i18n, pero lo aseguramos también acá por si el header resuelve antes.
|
|
170
32
|
this.i18n.registerDefaults(ns, PROFILE_VIEW_I18N);
|
|
171
33
|
this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
|
|
172
|
-
connectPageRefresh(() => this.loadFromApi());
|
|
173
|
-
// Cargar perfil inmediatamente si el usuario ya está autenticado.
|
|
174
|
-
// Sin esto, si auth.user() ya estaba populado al montar el componente
|
|
175
|
-
// (sesión restaurada), el effect no dispara y la página queda vacía
|
|
176
|
-
// hasta que el usuario hace pull-to-refresh (Regla: no esperar a que
|
|
177
|
-
// una signal cambie si ya tiene valor inicial).
|
|
178
|
-
void this.firebase.whenFirebaseAuthReady().then(() => {
|
|
179
|
-
const uid = this._userId();
|
|
180
|
-
if (uid) {
|
|
181
|
-
void this.loadFromApi();
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
effect(onCleanup => {
|
|
185
|
-
const uid = this._userId();
|
|
186
|
-
if (!uid) {
|
|
187
|
-
this.profile.set(null);
|
|
188
|
-
this.loading.set(false);
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
this.loading.set(true);
|
|
192
|
-
let sub = null;
|
|
193
|
-
let cancelled = false;
|
|
194
|
-
let apiFallbackUsed = false;
|
|
195
|
-
void this.firebase.whenFirebaseAuthReady().then(() => {
|
|
196
|
-
if (cancelled)
|
|
197
|
-
return;
|
|
198
|
-
sub = this.usersCol.watch(uid).subscribe({
|
|
199
|
-
next: doc => {
|
|
200
|
-
if (doc) {
|
|
201
|
-
this.profile.set(this.mapMirrorToProfile(doc));
|
|
202
|
-
this.loadError.set(null);
|
|
203
|
-
this.loading.set(false);
|
|
204
|
-
}
|
|
205
|
-
else if (!apiFallbackUsed) {
|
|
206
|
-
apiFallbackUsed = true;
|
|
207
|
-
void this.loadFromApi();
|
|
208
|
-
}
|
|
209
|
-
},
|
|
210
|
-
error: () => {
|
|
211
|
-
if (!apiFallbackUsed) {
|
|
212
|
-
apiFallbackUsed = true;
|
|
213
|
-
void this.loadFromApi();
|
|
214
|
-
}
|
|
215
|
-
},
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
onCleanup(() => {
|
|
219
|
-
cancelled = true;
|
|
220
|
-
sub?.unsubscribe();
|
|
221
|
-
});
|
|
222
|
-
}, { allowSignalWrites: true });
|
|
223
|
-
// saving → mutar state (val-form.ngDoCheck lo detecta).
|
|
224
|
-
effect(() => {
|
|
225
|
-
const isSaving = this.saving();
|
|
226
|
-
const state = isSaving ? ComponentStates.WORKING : ComponentStates.ENABLED;
|
|
227
|
-
this.formMeta.state = state;
|
|
228
|
-
this.formMeta.actions.state = state;
|
|
229
|
-
this.formMeta.actions.text = isSaving ? this.t('saving') : this.t('save');
|
|
230
|
-
});
|
|
231
|
-
// profile loaded + form mounted → patchValue al FormGroup.
|
|
232
|
-
effect(() => {
|
|
233
|
-
const p = this.profile();
|
|
234
|
-
const form = this.formCmp()?.Form;
|
|
235
|
-
if (!p || !form)
|
|
236
|
-
return;
|
|
237
|
-
form.patchValue({
|
|
238
|
-
handle: p.handle || '',
|
|
239
|
-
name: p.name || '',
|
|
240
|
-
phone: p.phone || '',
|
|
241
|
-
}, { emitEvent: false });
|
|
242
|
-
});
|
|
243
|
-
// i18n.lang change → mutar labels (rare, no afecta typing).
|
|
244
|
-
effect(() => {
|
|
245
|
-
this.i18n.lang();
|
|
246
|
-
this.applyI18nLabels();
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
/** Construcción inicial — UNA vez. Gatea handle/phone según config. */
|
|
250
|
-
buildFormMeta() {
|
|
251
|
-
const cfg = this.resolvedConfig();
|
|
252
|
-
const handleField = {
|
|
253
|
-
token: 'profile-handle',
|
|
254
|
-
name: 'handle',
|
|
255
|
-
label: this.t('handle'),
|
|
256
|
-
hint: this.t('handleHint'),
|
|
257
|
-
placeholder: this.t('handlePlaceholder'),
|
|
258
|
-
type: InputType.HANDLE,
|
|
259
|
-
order: 1,
|
|
260
|
-
validators: [
|
|
261
|
-
Validators.required,
|
|
262
|
-
Validators.minLength(HANDLE_MIN),
|
|
263
|
-
Validators.maxLength(HANDLE_MAX),
|
|
264
|
-
Validators.pattern(HANDLE_PATTERN),
|
|
265
|
-
],
|
|
266
|
-
errors: {
|
|
267
|
-
required: this.t('usernameInvalid'),
|
|
268
|
-
minlength: this.t('usernameInvalid'),
|
|
269
|
-
maxlength: this.t('usernameInvalid'),
|
|
270
|
-
pattern: this.t('usernameInvalid'),
|
|
271
|
-
},
|
|
272
|
-
value: '',
|
|
273
|
-
range: { min: HANDLE_MIN, max: HANDLE_MAX },
|
|
274
|
-
state: ComponentStates.ENABLED,
|
|
275
|
-
};
|
|
276
|
-
const nameField = {
|
|
277
|
-
token: 'profile-name',
|
|
278
|
-
name: 'name',
|
|
279
|
-
label: this.t('name'),
|
|
280
|
-
hint: this.t('nameHint'),
|
|
281
|
-
placeholder: this.t('namePlaceholder'),
|
|
282
|
-
type: InputType.TEXT,
|
|
283
|
-
order: 2,
|
|
284
|
-
validators: [Validators.required, Validators.minLength(2), Validators.maxLength(100)],
|
|
285
|
-
errors: {},
|
|
286
|
-
value: '',
|
|
287
|
-
state: ComponentStates.ENABLED,
|
|
288
|
-
};
|
|
289
|
-
const phoneField = {
|
|
290
|
-
token: 'profile-phone',
|
|
291
|
-
name: 'phone',
|
|
292
|
-
label: this.t('phone'),
|
|
293
|
-
hint: this.t('phoneHint'),
|
|
294
|
-
placeholder: this.t('phonePlaceholder'),
|
|
295
|
-
type: InputType.PHONE,
|
|
296
|
-
order: 3,
|
|
297
|
-
validators: [],
|
|
298
|
-
errors: {},
|
|
299
|
-
value: '',
|
|
300
|
-
state: ComponentStates.ENABLED,
|
|
301
|
-
};
|
|
302
|
-
// Filtrado por config: el name siempre va; handle/phone son opt-out.
|
|
303
|
-
const fields = [];
|
|
304
|
-
if (cfg.showHandle)
|
|
305
|
-
fields.push(handleField);
|
|
306
|
-
fields.push(nameField);
|
|
307
|
-
if (cfg.showPhone)
|
|
308
|
-
fields.push(phoneField);
|
|
309
|
-
const submitButton = {
|
|
310
|
-
text: this.t('save'),
|
|
311
|
-
color: 'dark',
|
|
312
|
-
type: 'submit',
|
|
313
|
-
fill: 'solid',
|
|
314
|
-
size: 'default',
|
|
315
|
-
shape: 'round',
|
|
316
|
-
expand: 'block',
|
|
317
|
-
state: ComponentStates.ENABLED,
|
|
318
|
-
token: 'profile-save',
|
|
319
|
-
};
|
|
320
|
-
return {
|
|
321
|
-
name: '',
|
|
322
|
-
state: ComponentStates.ENABLED,
|
|
323
|
-
sections: [
|
|
324
|
-
{
|
|
325
|
-
name: '',
|
|
326
|
-
order: 1,
|
|
327
|
-
fields,
|
|
328
|
-
},
|
|
329
|
-
],
|
|
330
|
-
actions: submitButton,
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
/** Re-aplica labels/hints/placeholders en cambio de idioma. */
|
|
334
|
-
applyI18nLabels() {
|
|
335
|
-
const section = this.formMeta.sections[0];
|
|
336
|
-
for (const field of section.fields) {
|
|
337
|
-
switch (field.name) {
|
|
338
|
-
case 'handle':
|
|
339
|
-
field.label = this.t('handle');
|
|
340
|
-
field.hint = this.t('handleHint');
|
|
341
|
-
field.placeholder = this.t('handlePlaceholder');
|
|
342
|
-
field.errors = {
|
|
343
|
-
required: this.t('usernameInvalid'),
|
|
344
|
-
minlength: this.t('usernameInvalid'),
|
|
345
|
-
maxlength: this.t('usernameInvalid'),
|
|
346
|
-
pattern: this.t('usernameInvalid'),
|
|
347
|
-
};
|
|
348
|
-
break;
|
|
349
|
-
case 'name':
|
|
350
|
-
field.label = this.t('name');
|
|
351
|
-
field.hint = this.t('nameHint');
|
|
352
|
-
field.placeholder = this.t('namePlaceholder');
|
|
353
|
-
break;
|
|
354
|
-
case 'phone':
|
|
355
|
-
field.label = this.t('phone');
|
|
356
|
-
field.hint = this.t('phoneHint');
|
|
357
|
-
field.placeholder = this.t('phonePlaceholder');
|
|
358
|
-
break;
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
const button = this.formMeta.actions;
|
|
362
|
-
button.text = this.saving() ? this.t('saving') : this.t('save');
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Fallback REST. Capa 4 (UI declarativa): NO toasteamos acá — el
|
|
366
|
-
* val-empty-state ES la UI del error.
|
|
367
|
-
*/
|
|
368
|
-
async loadFromApi() {
|
|
369
|
-
this.loading.set(true);
|
|
370
|
-
try {
|
|
371
|
-
const p = await firstValueFrom(this.auth.getProfile());
|
|
372
|
-
this.profile.set(p);
|
|
373
|
-
this.loadError.set(null);
|
|
374
|
-
}
|
|
375
|
-
catch (err) {
|
|
376
|
-
this.loadError.set(err);
|
|
377
|
-
}
|
|
378
|
-
finally {
|
|
379
|
-
this.loading.set(false);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
mapMirrorToProfile(doc) {
|
|
383
|
-
return {
|
|
384
|
-
operationId: '',
|
|
385
|
-
userId: doc.userId,
|
|
386
|
-
email: doc.email,
|
|
387
|
-
name: doc.name ?? '',
|
|
388
|
-
handle: doc.handle,
|
|
389
|
-
phone: doc.phone,
|
|
390
|
-
avatarUrl: doc.avatarUrl,
|
|
391
|
-
emailVerified: false,
|
|
392
|
-
phoneVerified: false,
|
|
393
|
-
mfaEnabled: false,
|
|
394
|
-
createdAt: '',
|
|
395
|
-
updatedAt: '',
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
async onSubmit(event) {
|
|
399
|
-
if (this.saving())
|
|
400
|
-
return;
|
|
401
|
-
const current = this.profile();
|
|
402
|
-
if (!current)
|
|
403
|
-
return;
|
|
404
|
-
const cfg = this.resolvedConfig();
|
|
405
|
-
const fields = event.fields || {};
|
|
406
|
-
const nextHandle = String(fields['handle'] || '')
|
|
407
|
-
.trim()
|
|
408
|
-
.toLowerCase();
|
|
409
|
-
const nextName = String(fields['name'] || '').trim();
|
|
410
|
-
const nextPhone = String(fields['phone'] || '').trim();
|
|
411
|
-
const handleChanged = cfg.showHandle && !!nextHandle && nextHandle !== (current.handle || '').toLowerCase();
|
|
412
|
-
const nameChanged = !!nextName && nextName !== (current.name || '');
|
|
413
|
-
const phoneChanged = cfg.showPhone && nextPhone !== (current.phone || '');
|
|
414
|
-
if (!handleChanged && !nameChanged && !phoneChanged) {
|
|
415
|
-
this.toast.show({
|
|
416
|
-
message: this.t('saveSuccess'),
|
|
417
|
-
duration: 2000,
|
|
418
|
-
color: 'dark',
|
|
419
|
-
position: 'top',
|
|
420
|
-
});
|
|
421
|
-
return;
|
|
422
|
-
}
|
|
423
|
-
this.saving.set(true);
|
|
424
|
-
try {
|
|
425
|
-
if (handleChanged) {
|
|
426
|
-
try {
|
|
427
|
-
await firstValueFrom(this.auth.updateHandle(nextHandle));
|
|
428
|
-
}
|
|
429
|
-
catch (err) {
|
|
430
|
-
this.errors.handle(err, {
|
|
431
|
-
context: 'profile.updateHandle',
|
|
432
|
-
i18nMap: { AUTH_USERNAME_EXISTS: 'handleInUse' },
|
|
433
|
-
fallbackKey: 'handleError',
|
|
434
|
-
i18nNamespace: this.ns,
|
|
435
|
-
});
|
|
436
|
-
await this.loadFromApi();
|
|
437
|
-
return;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
if (nameChanged || phoneChanged) {
|
|
441
|
-
const payload = {};
|
|
442
|
-
if (nameChanged)
|
|
443
|
-
payload.name = nextName;
|
|
444
|
-
if (phoneChanged)
|
|
445
|
-
payload.phone = nextPhone;
|
|
446
|
-
try {
|
|
447
|
-
await firstValueFrom(this.auth.updateProfile(payload));
|
|
448
|
-
}
|
|
449
|
-
catch (err) {
|
|
450
|
-
this.errors.handle(err, {
|
|
451
|
-
context: 'profile.updateProfile',
|
|
452
|
-
i18nMap: {
|
|
453
|
-
AUTHV2_PHONE_EXISTS: 'phoneInUse',
|
|
454
|
-
AUTHV2_INVALID_PHONE: 'phoneInvalid',
|
|
455
|
-
},
|
|
456
|
-
fallbackKey: 'saveError',
|
|
457
|
-
i18nNamespace: this.ns,
|
|
458
|
-
});
|
|
459
|
-
await this.loadFromApi();
|
|
460
|
-
return;
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
this.toast.show({
|
|
464
|
-
message: this.t('saveSuccess'),
|
|
465
|
-
duration: 2500,
|
|
466
|
-
color: 'dark',
|
|
467
|
-
position: 'top',
|
|
468
|
-
});
|
|
469
|
-
cfg.onSaved?.(this.profile() ?? current);
|
|
470
|
-
}
|
|
471
|
-
finally {
|
|
472
|
-
this.saving.set(false);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
onAvatarUploaded(result) {
|
|
476
|
-
this.toast.show({
|
|
477
|
-
message: this.t('avatarSuccess'),
|
|
478
|
-
duration: 2500,
|
|
479
|
-
color: 'dark',
|
|
480
|
-
position: 'top',
|
|
481
|
-
});
|
|
482
|
-
this.resolvedConfig().onAvatarUploaded?.(result);
|
|
483
|
-
}
|
|
484
|
-
onAvatarError(_err) {
|
|
485
|
-
this.toast.show({
|
|
486
|
-
message: this.t('avatarError'),
|
|
487
|
-
duration: 3000,
|
|
488
|
-
color: 'dark',
|
|
489
|
-
position: 'top',
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
/** Lee del namespace configurado. */
|
|
493
|
-
t(key) {
|
|
494
|
-
return this.i18n.t(key, this.ns);
|
|
495
|
-
}
|
|
496
|
-
initialsFromName(name) {
|
|
497
|
-
if (!name)
|
|
498
|
-
return '?';
|
|
499
|
-
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
500
|
-
if (parts.length === 0)
|
|
501
|
-
return '?';
|
|
502
|
-
const first = parts[0]?.[0] ?? '';
|
|
503
|
-
const last = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? '') : '';
|
|
504
|
-
return (first + last).toUpperCase() || '?';
|
|
505
34
|
}
|
|
506
35
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProfileViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
507
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
508
|
-
<div class="page">
|
|
509
|
-
<header class="page-header">
|
|
510
|
-
<val-display [props]="{ size: 'small', color: 'dark', content: t('pageTitle') }" />
|
|
511
|
-
<val-title
|
|
512
|
-
[props]="{
|
|
513
|
-
size: 'large',
|
|
514
|
-
color: 'dark',
|
|
515
|
-
bold: false,
|
|
516
|
-
content: t('pageDescription'),
|
|
517
|
-
}"
|
|
518
|
-
/>
|
|
519
|
-
</header>
|
|
520
|
-
|
|
521
|
-
@if (loading()) {
|
|
522
|
-
<val-skeleton-layout [props]="{ preset: 'form', rows: 3, showAvatar: true }" />
|
|
523
|
-
} @else if (errorState()) {
|
|
524
|
-
<val-empty-state [props]="errorState()!" />
|
|
525
|
-
} @else {
|
|
526
|
-
@if (profile(); as p) {
|
|
527
|
-
@if (resolvedConfig().showAvatar) {
|
|
528
|
-
<section class="settings-section avatar-section">
|
|
529
|
-
<val-avatar-upload
|
|
530
|
-
[props]="avatarProps()"
|
|
531
|
-
(uploaded)="onAvatarUploaded($event)"
|
|
532
|
-
(error)="onAvatarError($event)"
|
|
533
|
-
/>
|
|
534
|
-
<div class="avatar-meta">
|
|
535
|
-
<val-title
|
|
536
|
-
[props]="{
|
|
537
|
-
size: 'medium',
|
|
538
|
-
color: 'dark',
|
|
539
|
-
bold: true,
|
|
540
|
-
content: p.name || '—',
|
|
541
|
-
}"
|
|
542
|
-
/>
|
|
543
|
-
<val-text
|
|
544
|
-
[props]="{
|
|
545
|
-
size: 'small',
|
|
546
|
-
color: 'dark',
|
|
547
|
-
bold: false,
|
|
548
|
-
content: p.email,
|
|
549
|
-
}"
|
|
550
|
-
/>
|
|
551
|
-
@if (p.handle) {
|
|
552
|
-
<val-text
|
|
553
|
-
[props]="{
|
|
554
|
-
size: 'small',
|
|
555
|
-
color: 'dark',
|
|
556
|
-
bold: true,
|
|
557
|
-
content: '@' + p.handle,
|
|
558
|
-
}"
|
|
559
|
-
/>
|
|
560
|
-
}
|
|
561
|
-
</div>
|
|
562
|
-
</section>
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
<val-form #form [props]="formMeta" (onSubmit)="onSubmit($event)" />
|
|
566
|
-
|
|
567
|
-
<!-- Card de compartir + modal QR removidos temporalmente (se retoman luego).
|
|
568
|
-
Wiring intacto: shareCta(), shareModal(), shareOpen, showShareCta. -->
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
</div>
|
|
572
|
-
`, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.page-header h1{font-size:22px;font-weight:700;margin:0 0 4px}.hint{font-size:13px;opacity:.7;margin:0 0 12px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.avatar-section{display:flex;align-items:center;gap:16px}.avatar-meta{display:flex;flex-direction:column;gap:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: AvatarUploadComponent, selector: "val-avatar-upload", inputs: ["props", "customPath", "customThumbPath", "skipBackendSync"], outputs: ["uploaded", "error", "uploadStart"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }] }); }
|
|
36
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProfileViewComponent, isStandalone: true, selector: "val-profile-view", inputs: { config: "config" }, ngImport: i0, template: ` <val-profile-content [config]="config" /> `, isInline: true, dependencies: [{ kind: "component", type: ProfileContentComponent, selector: "val-profile-content", inputs: ["config"] }] }); }
|
|
573
37
|
}
|
|
574
38
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProfileViewComponent, decorators: [{
|
|
575
39
|
type: Component,
|
|
576
|
-
args: [{
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
DisplayComponent,
|
|
583
|
-
TextComponent,
|
|
584
|
-
TitleComponent,
|
|
585
|
-
SkeletonLayoutComponent,
|
|
586
|
-
CtaCardComponent,
|
|
587
|
-
ShareProfileModalComponent,
|
|
588
|
-
], template: `
|
|
589
|
-
<div class="page">
|
|
590
|
-
<header class="page-header">
|
|
591
|
-
<val-display [props]="{ size: 'small', color: 'dark', content: t('pageTitle') }" />
|
|
592
|
-
<val-title
|
|
593
|
-
[props]="{
|
|
594
|
-
size: 'large',
|
|
595
|
-
color: 'dark',
|
|
596
|
-
bold: false,
|
|
597
|
-
content: t('pageDescription'),
|
|
598
|
-
}"
|
|
599
|
-
/>
|
|
600
|
-
</header>
|
|
601
|
-
|
|
602
|
-
@if (loading()) {
|
|
603
|
-
<val-skeleton-layout [props]="{ preset: 'form', rows: 3, showAvatar: true }" />
|
|
604
|
-
} @else if (errorState()) {
|
|
605
|
-
<val-empty-state [props]="errorState()!" />
|
|
606
|
-
} @else {
|
|
607
|
-
@if (profile(); as p) {
|
|
608
|
-
@if (resolvedConfig().showAvatar) {
|
|
609
|
-
<section class="settings-section avatar-section">
|
|
610
|
-
<val-avatar-upload
|
|
611
|
-
[props]="avatarProps()"
|
|
612
|
-
(uploaded)="onAvatarUploaded($event)"
|
|
613
|
-
(error)="onAvatarError($event)"
|
|
614
|
-
/>
|
|
615
|
-
<div class="avatar-meta">
|
|
616
|
-
<val-title
|
|
617
|
-
[props]="{
|
|
618
|
-
size: 'medium',
|
|
619
|
-
color: 'dark',
|
|
620
|
-
bold: true,
|
|
621
|
-
content: p.name || '—',
|
|
622
|
-
}"
|
|
623
|
-
/>
|
|
624
|
-
<val-text
|
|
625
|
-
[props]="{
|
|
626
|
-
size: 'small',
|
|
627
|
-
color: 'dark',
|
|
628
|
-
bold: false,
|
|
629
|
-
content: p.email,
|
|
630
|
-
}"
|
|
631
|
-
/>
|
|
632
|
-
@if (p.handle) {
|
|
633
|
-
<val-text
|
|
634
|
-
[props]="{
|
|
635
|
-
size: 'small',
|
|
636
|
-
color: 'dark',
|
|
637
|
-
bold: true,
|
|
638
|
-
content: '@' + p.handle,
|
|
639
|
-
}"
|
|
640
|
-
/>
|
|
641
|
-
}
|
|
642
|
-
</div>
|
|
643
|
-
</section>
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
<val-form #form [props]="formMeta" (onSubmit)="onSubmit($event)" />
|
|
647
|
-
|
|
648
|
-
<!-- Card de compartir + modal QR removidos temporalmente (se retoman luego).
|
|
649
|
-
Wiring intacto: shareCta(), shareModal(), shareOpen, showShareCta. -->
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
</div>
|
|
653
|
-
`, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.page-header h1{font-size:22px;font-weight:700;margin:0 0 4px}.hint{font-size:13px;opacity:.7;margin:0 0 12px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.avatar-section{display:flex;align-items:center;gap:16px}.avatar-meta{display:flex;flex-direction:column;gap:2px}\n"] }]
|
|
40
|
+
args: [{
|
|
41
|
+
selector: 'val-profile-view',
|
|
42
|
+
standalone: true,
|
|
43
|
+
imports: [ProfileContentComponent],
|
|
44
|
+
template: ` <val-profile-content [config]="config" /> `,
|
|
45
|
+
}]
|
|
654
46
|
}], ctorParameters: () => [], propDecorators: { config: [{
|
|
655
47
|
type: Input
|
|
656
48
|
}] } });
|
|
657
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvcHJvZmlsZS12aWV3L3Byb2ZpbGUtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUVwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFFbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUV4RixPQUFPLEVBQUUscUJBQXFCLEVBQUUs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QkFBMEI7cUJBQzNCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUVUO3dEQXVEUSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIElucHV0LCBzaWduYWwsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQXZhdGFyVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi4vYXZhdGFyLXVwbG9hZC9hdmF0YXItdXBsb2FkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdmF0YXJVcGxvYWRFcnJvciwgQXZhdGFyVXBsb2FkTWV0YWRhdGEsIEF2YXRhclVwbG9hZFJlc3VsdCB9IGZyb20gJy4uL2F2YXRhci11cGxvYWQvdHlwZXMnO1xuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2hhcmVQcm9maWxlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZS1wcm9maWxlLW1vZGFsL3NoYXJlLXByb2ZpbGUtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFNoYXJlUHJvZmlsZU1vZGFsTWV0YWRhdGEgfSBmcm9tICcuLi9zaGFyZS1wcm9maWxlLW1vZGFsL3R5cGVzJztcbmltcG9ydCB7IEN0YUNhcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvY3RhLWNhcmQvY3RhLWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IEN0YUNhcmRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9jdGEtY2FyZC90eXBlcyc7XG5pbXBvcnQgeyBTa2VsZXRvbkxheW91dENvbXBvbmVudCB9IGZyb20gJy4uL3NrZWxldG9uLWxheW91dC9za2VsZXRvbi1sYXlvdXQuY29tcG9uZW50JztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVFcnJvclN0YXRlUHJvcHMgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvZW1wdHktc3RhdGUvZmFjdG9yeSc7XG5pbXBvcnQgeyBCdXR0b25NZXRhZGF0YSwgQ29tcG9uZW50U3RhdGVzLCBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQsIElucHV0TWV0YWRhdGEsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBHZXRQcm9maWxlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcbmltcG9ydCB7IEZpcmViYXNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZpcmViYXNlL2ZpcmViYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlyZXN0b3JlQ29sbGVjdGlvbkZhY3RvcnksIFR5cGVkQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZpcmViYXNlL2ZpcmVzdG9yZS1jb2xsZWN0aW9uJztcbmltcG9ydCB7IEZpcmVzdG9yZURvY3VtZW50IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmlyZWJhc2UvdHlwZXMnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29ubmVjdFBhZ2VSZWZyZXNoIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFnZS1yZWZyZXNoL3BhZ2UtcmVmcmVzaC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVmFsdGVjaEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy92YWx0ZWNoLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgaW50ZXJwcmV0RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lcnJvcnMvaW50ZXJwcmV0LWVycm9yJztcblxuaW1wb3J0IHsgUHJvZmlsZVZpZXdDb25maWcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFBST0ZJTEVfVklFV19JMThOIH0gZnJvbSAnLi9wcm9maWxlLXZpZXcuaTE4bic7XG5cbi8qKlxuICogRm9ybWEgZGVsIGRvYyBGaXJlc3RvcmUgL3VzZXJzL3t1aWR9IHF1ZSBsYSB2aXN0YSBjb25zdW1lLiBTdWJzZXQgZGVsIHNjaGVtYVxuICogZXNjcml0byBwb3IgZWwgYmFja2VuZCAoU3luY1Byb2ZpbGVUb0ZpcmVzdG9yZSkg4oCUIHNvbG8gbG9zIGNhbXBvcyBxdWUgZXN0YVxuICogdmlzdGEgbmVjZXNpdGE7IGxvcyBkZW3DoXMgKHN0YXR1cywgbWZhRW5hYmxlZCwgcm9sZXMsIGV0Yy4pIHNlIGlnbm9yYW4uXG4gKi9cbmludGVyZmFjZSBVc2VyTWlycm9yRG9jIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQge1xuICB1c2VySWQ6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgaGFuZGxlPzogc3RyaW5nO1xuICBwaG9uZT86IHN0cmluZztcbiAgYXZhdGFyVXJsPzogc3RyaW5nO1xuICBhdmF0YXJUaHVtYm5haWw/OiBzdHJpbmc7XG59XG5cbi8qKiBQYXRyw7NuIHNpbmNyb25pemFkbyBjb24gYmFja2VuZCBoYW5kbGVSZWdleDogbG93ZXJjYXNlIGFsZmFudW0gKyB1bmRlcnNjb3JlLiAqL1xuY29uc3QgSEFORExFX1BBVFRFUk4gPSAvXlthLXpfXVthLXowLTlfXSokLztcbmNvbnN0IEhBTkRMRV9NSU4gPSAzO1xuY29uc3QgSEFORExFX01BWCA9IDIwO1xuXG5jb25zdCBERUZBVUxUX05BTUVTUEFDRSA9ICdTZXR0aW5ncy5Qcm9maWxlJztcblxuLyoqXG4gKiBgdmFsLXByb2ZpbGUtdmlld2Ag4oCUIHZpc3RhIFBlcmZpbCBmdWxsLWZlYXR1cmUgYXV0b2NvbnRlbmlkYSAob3JnYW5pc20pLlxuICpcbiAqIEVkaXRhIGxvcyBjYW1wb3MgcMO6YmxpY29zIGRlbCB1c3VhcmlvIGVuIFVOIHNvbG8gZm9ybXVsYXJpbyBjb24gVU4gc29sbyBib3TDs25cbiAqIFwiR3VhcmRhclwiLiBXaXJldXA6XG4gKiAgLSBBdmF0YXIg4oCUIHZhbC1hdmF0YXItdXBsb2FkIChGaXJlYmFzZSBTdG9yYWdlICsgYmFja2VuZCBzeW5jKS4gU2VwYXJhZG8gZGVsXG4gKiAgICBmb3JtIHBvcnF1ZSBlcyB1cGxvYWQgc3luYyBpbmRlcGVuZGllbnRlLlxuICogIC0gSGFuZGxlIChAdXN1YXJpbykg4oCUIElucHV0VHlwZS5IQU5ETEUgKHZhbC11c2VybmFtZS1pbnB1dCBjb24gY2hlY2sgZGVcbiAqICAgIGRpc3BvbmliaWxpZGFkIGFzeW5jIHJlc3VlbHRvIHbDrWEgQXV0aFNlcnZpY2UgaW55ZWN0YWRvKS5cbiAqICAtIE5vbWJyZSDigJQgSW5wdXRUeXBlLlRFWFQuXG4gKiAgLSBUZWzDqWZvbm8g4oCUIElucHV0VHlwZS5QSE9ORS5cbiAqXG4gKiBTdWJtaXQgaGFuZGxlciBkaXNwYXRjaGE6XG4gKiAgMS4gU2kgaGFuZGxlIGNhbWJpw7Mg4oaSIHVwZGF0ZUhhbmRsZSBQUklNRVJPICh1bmlxdWVuZXNzKS5cbiAqICAyLiBTaSBuYW1lIG8gcGhvbmUgY2FtYmnDsyDihpIgdXBkYXRlUHJvZmlsZSBjb24gYW1ib3MuXG4gKlxuICogTGVjdHVyYSBkZWwgcGVyZmlsOiBzdXNjcmliZSBhbCBkb2MgRmlyZXN0b3JlIC91c2Vycy97dWlkfSAobWlycm9yIHF1ZSBtYW50aWVuZVxuICogZWwgYmFja2VuZCkuIFJlYWN0aXZvIGNyb3NzLXRhYiArIGF1dG8tcmVmcmVzY2EgdHJhcyBzYXZlLiBGYWxsYmFjayBSRVNUXG4gKiAoYXV0aC5nZXRQcm9maWxlKSBzaSBlbCBkb2Mgbm8gZXhpc3RlIG8gZWwgbGlzdGVuZXIgZmFsbGEuXG4gKlxuICogTk8gcmVuZGVyaXphIGlvbi1jb250ZW50IOKAlCB2aXZlIGRlbnRybyBkZSB2YWwtcGFnZS13cmFwcGVyLlxuICpcbiAqIEF1dG8tcmVnaXN0cmEgc3VzIGRlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbiBlbCBjb25zdHJ1Y3RvciBzaSBlbCBjb25zdW1lciBub1xuICogcHJvdmV5w7MgZWwgbmFtZXNwYWNlIGNvbmZpZ3VyYWRvIChkZWZhdWx0IGBTZXR0aW5ncy5Qcm9maWxlYCkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1wcm9maWxlLXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgQXZhdGFyVXBsb2FkQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgRm9ybUNvbXBvbmVudCxcbiAgICBEaXNwbGF5Q29tcG9uZW50LFxuICAgIFRleHRDb21wb25lbnQsXG4gICAgVGl0bGVDb21wb25lbnQsXG4gICAgU2tlbGV0b25MYXlvdXRDb21wb25lbnQsXG4gICAgQ3RhQ2FyZENvbXBvbmVudCxcbiAgICBTaGFyZVByb2ZpbGVNb2RhbENvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicGFnZVwiPlxuICAgICAgPGhlYWRlciBjbGFzcz1cInBhZ2UtaGVhZGVyXCI+XG4gICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwieyBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnLCBjb250ZW50OiB0KCdwYWdlVGl0bGUnKSB9XCIgLz5cbiAgICAgICAgPHZhbC10aXRsZVxuICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICBzaXplOiAnbGFyZ2UnLFxuICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgY29udGVudDogdCgncGFnZURlc2NyaXB0aW9uJyksXG4gICAgICAgICAgfVwiXG4gICAgICAgIC8+XG4gICAgICA8L2hlYWRlcj5cblxuICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgPHZhbC1za2VsZXRvbi1sYXlvdXQgW3Byb3BzXT1cInsgcHJlc2V0OiAnZm9ybScsIHJvd3M6IDMsIHNob3dBdmF0YXI6IHRydWUgfVwiIC8+XG4gICAgICB9IEBlbHNlIGlmIChlcnJvclN0YXRlKCkpIHtcbiAgICAgICAgPHZhbC1lbXB0eS1zdGF0ZSBbcHJvcHNdPVwiZXJyb3JTdGF0ZSgpIVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgQGlmIChwcm9maWxlKCk7IGFzIHApIHtcbiAgICAgICAgICBAaWYgKHJlc29sdmVkQ29uZmlnKCkuc2hvd0F2YXRhcikge1xuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZXR0aW5ncy1zZWN0aW9uIGF2YXRhci1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDx2YWwtYXZhdGFyLXVwbG9hZFxuICAgICAgICAgICAgICAgIFtwcm9wc109XCJhdmF0YXJQcm9wcygpXCJcbiAgICAgICAgICAgICAgICAodXBsb2FkZWQpPVwib25BdmF0YXJVcGxvYWRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZXJyb3IpPVwib25BdmF0YXJFcnJvcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1tZXRhXCI+XG4gICAgICAgICAgICAgICAgPHZhbC10aXRsZVxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHAubmFtZSB8fCAn4oCUJyxcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogcC5lbWFpbCxcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgQGlmIChwLmhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJ0AnICsgcC5oYW5kbGUsXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDx2YWwtZm9ybSAjZm9ybSBbcHJvcHNdPVwiZm9ybU1ldGFcIiAob25TdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiIC8+XG5cbiAgICAgICAgICA8IS0tIENhcmQgZGUgY29tcGFydGlyICsgbW9kYWwgUVIgcmVtb3ZpZG9zIHRlbXBvcmFsbWVudGUgKHNlIHJldG9tYW4gbHVlZ28pLlxuICAgICAgICAgICAgICAgV2lyaW5nIGludGFjdG86IHNoYXJlQ3RhKCksIHNoYXJlTW9kYWwoKSwgc2hhcmVPcGVuLCBzaG93U2hhcmVDdGEuIC0tPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5wYWdlIHtcbiAgICAgICAgcGFkZGluZzogMTZweCAwO1xuICAgICAgICBtYXgtd2lkdGg6IDcyMHB4O1xuICAgICAgICBtYXJnaW46IDAgYXV0bztcbiAgICAgIH1cbiAgICAgIC5wYWdlLWhlYWRlciB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICB9XG4gICAgICAucGFnZS1oZWFkZXIgaDEge1xuICAgICAgICBmb250LXNpemU6IDIycHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIG1hcmdpbjogMCAwIDRweDtcbiAgICAgIH1cbiAgICAgIC5oaW50IHtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBvcGFjaXR5OiAwLjc7XG4gICAgICAgIG1hcmdpbjogMCAwIDEycHg7XG4gICAgICB9XG4gICAgICAuc2V0dGluZ3Mtc2VjdGlvbiB7XG4gICAgICAgIHBhZGRpbmc6IDE2cHggMDtcbiAgICAgIH1cbiAgICAgIC5zZXR0aW5ncy1zZWN0aW9uICsgLnNldHRpbmdzLXNlY3Rpb24ge1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tdmFsLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICB9XG4gICAgICAuYXZhdGFyLXNlY3Rpb24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICB9XG4gICAgICAuYXZhdGFyLW1ldGEge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDJweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9maWxlVmlld0NvbXBvbmVudCB7XG4gIHByaXZhdGUgbmF2ID0gaW5qZWN0KE5hdmlnYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBwcml2YXRlIGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmaXJlYmFzZSA9IGluamVjdChGaXJlYmFzZVNlcnZpY2UpO1xuICBwcml2YXRlIGNvbGxlY3Rpb25zID0gaW5qZWN0KEZpcmVzdG9yZUNvbGxlY3Rpb25GYWN0b3J5KTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKipcbiAgICogQ29uZmlnIHbDrWEgQElucHV0IChvYmplY3QtZmlyc3QpLiBTaSBubyBzZSBwYXNhLCBzZSBjYWUgYWwgcm91dGUgZGF0YVxuICAgKiBgcHJvZmlsZUNvbmZpZ2AgKHBvYmxhZG8gcG9yIGBwcm92aWRlVmFsdGVjaFByb2ZpbGVSb3V0ZXNgKS4gYHJlc29sdmVkQ29uZmlnYFxuICAgKiBtZXJnZWEgY29uIGxvcyBkZWZhdWx0cy5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZz86IFByb2ZpbGVWaWV3Q29uZmlnO1xuXG4gIC8qKiBDb25maWcgbWVyZ2VhZGEgY29uIGRlZmF1bHRzLiBASW5wdXQgZ2FuYSBzb2JyZSByb3V0ZSBkYXRhLiAqL1xuICByZWFkb25seSByZXNvbHZlZENvbmZpZyA9IGNvbXB1dGVkPFxuICAgIFJlcXVpcmVkPE9taXQ8UHJvZmlsZVZpZXdDb25maWcsICdvblNhdmVkJyB8ICdvbkF2YXRhclVwbG9hZGVkJyB8ICdwcm9maWxlQmFzZVVybCc+PiAmXG4gICAgICBQaWNrPFByb2ZpbGVWaWV3Q29uZmlnLCAnb25TYXZlZCcgfCAnb25BdmF0YXJVcGxvYWRlZCcgfCAncHJvZmlsZUJhc2VVcmwnPlxuICA+KCgpID0+IHtcbiAgICBjb25zdCBmcm9tUm91dGUgPSAodGhpcy5yb3V0ZT8uc25hcHNob3QuZGF0YVsncHJvZmlsZUNvbmZpZyddID8/IHt9KSBhcyBQcm9maWxlVmlld0NvbmZpZztcbiAgICBjb25zdCBtZXJnZWQ6IFByb2ZpbGVWaWV3Q29uZmlnID0geyAuLi5mcm9tUm91dGUsIC4uLih0aGlzLmNvbmZpZyA/PyB7fSkgfTtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd0F2YXRhcjogbWVyZ2VkLnNob3dBdmF0YXIgPz8gdHJ1ZSxcbiAgICAgIHNob3dIYW5kbGU6IG1lcmdlZC5zaG93SGFuZGxlID8/IHRydWUsXG4gICAgICBzaG93UGhvbmU6IG1lcmdlZC5zaG93UGhvbmUgPz8gdHJ1ZSxcbiAgICAgIHNob3dTaGFyZUN0YTogbWVyZ2VkLnNob3dTaGFyZUN0YSA/PyB0cnVlLFxuICAgICAgcHJvZmlsZUJhc2VVcmw6IG1lcmdlZC5wcm9maWxlQmFzZVVybCA/PyAnJyxcbiAgICAgIGkxOG5OYW1lc3BhY2U6IG1lcmdlZC5pMThuTmFtZXNwYWNlID8/IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICAgb25TYXZlZDogbWVyZ2VkLm9uU2F2ZWQsXG4gICAgICBvbkF2YXRhclVwbG9hZGVkOiBtZXJnZWQub25BdmF0YXJVcGxvYWRlZCxcbiAgICB9O1xuICB9KTtcblxuICAvKiogTmFtZXNwYWNlIGkxOG4gcmVzdWVsdG8gKGNhcHR1cmFkbyB1bmEgdmV6IHBhcmEgbGxhbWFkYXMgbm8tcmVhY3RpdmFzKS4gKi9cbiAgcHJpdmF0ZSBnZXQgbnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZygpLmkxOG5OYW1lc3BhY2U7XG4gIH1cblxuICAvKipcbiAgICogQ29sZWNjacOzbiBnbG9iYWwgL3VzZXJzL3t1aWR9IChza2lwQXBwUHJlZml4OiB0cnVlIOKAlCBlbCBkb2Mgdml2ZSBmdWVyYSBkZVxuICAgKiBhcHBzL3thcHBJZH0vLi4uIHBvcnF1ZSBlcyBjcm9zcy1hcHAsIHZlciBmaXJlc3RvcmUucnVsZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSB1c2Vyc0NvbDogVHlwZWRDb2xsZWN0aW9uPFVzZXJNaXJyb3JEb2M+ID0gdGhpcy5jb2xsZWN0aW9ucy5jcmVhdGU8VXNlck1pcnJvckRvYz4oJ3VzZXJzJywge1xuICAgIHNraXBBcHBQcmVmaXg6IHRydWUsXG4gIH0pO1xuXG4gIHByaXZhdGUgZm9ybUNtcCA9IHZpZXdDaGlsZDxGb3JtQ29tcG9uZW50PignZm9ybScpO1xuXG4gIHJlYWRvbmx5IHByb2ZpbGUgPSBzaWduYWw8R2V0UHJvZmlsZVJlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGxvYWRpbmcgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IHNhdmluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRFcnJvciA9IHNpZ25hbDx1bmtub3duIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgc2hhcmVPcGVuID0gc2lnbmFsKGZhbHNlKTtcblxuICByZWFkb25seSBzaGFyZUN0YSA9IGNvbXB1dGVkPEN0YUNhcmRNZXRhZGF0YT4oKCkgPT4ge1xuICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiB0aGlzLnQoJ3NoYXJlQ3RhVGl0bGUnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnQoJ3NoYXJlQ3RhRGVzYycpLFxuICAgICAgYm9yZGVyZWQ6IHRydWUsXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnbGVmdCcsXG4gICAgICAgIGNvbHVtbmVkOiBmYWxzZSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMudCgnc2hhcmVDdGFCdG4nKSxcbiAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgc3RhdGU6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgIHRva2VuOiAnc2hhcmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNoYXJlTW9kYWwgPSBjb21wdXRlZDxTaGFyZVByb2ZpbGVNb2RhbE1ldGFkYXRhPigoKSA9PiB7XG4gICAgY29uc3QgcCA9IHRoaXMucHJvZmlsZSgpO1xuICAgIGNvbnN0IGhhbmRsZSA9IHA/LmhhbmRsZSA/PyAnbWUnO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLnJlc29sdmVkQ29uZmlnKCkucHJvZmlsZUJhc2VVcmw7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHA/Lm5hbWUgPz8gJycsXG4gICAgICBoYW5kbGU6IHA/LmhhbmRsZSxcbiAgICAgIGF2YXRhclVybDogcD8uYXZhdGFyVXJsLFxuICAgICAgZW1haWw6IHA/LmVtYWlsLFxuICAgICAgdXJsOiBiYXNlID8gYCR7YmFzZX0vdS8ke2hhbmRsZX1gIDogYC91LyR7aGFuZGxlfWAsXG4gICAgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdXNlcklkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hdXRoLnVzZXIoKT8udXNlcklkID8/IG51bGwpO1xuXG4gIHJlYWRvbmx5IGVycm9yU3RhdGUgPSBjb21wdXRlZDxFbXB0eVN0YXRlTWV0YWRhdGEgfCBudWxsPigoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCBlcnIgPSB0aGlzLmxvYWRFcnJvcigpO1xuICAgIGlmICghZXJyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3JTdGF0ZVByb3BzKGVyciwge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgb2ZmbGluZTogdGhpcy50KCdvZmZsaW5lVGl0bGUnKSxcbiAgICAgICAgZXJyb3I6IHRoaXMudCgnZXJyb3JUaXRsZScpLFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgIG9mZmxpbmU6IHRoaXMudCgnb2ZmbGluZUhpbnQnKSxcbiAgICAgICAgZXJyb3I6IGludGVycHJldEVycm9yKGVycikubWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICByZXRyeUxhYmVsOiB0aGlzLnQoJ3JldHJ5JyksXG4gICAgICBvblJldHJ5OiAoKSA9PiB0aGlzLmxvYWRGcm9tQXBpKCksXG4gICAgICByZXRyeWluZzogdGhpcy5sb2FkaW5nKCksXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGF2YXRhclByb3BzID0gY29tcHV0ZWQ8QXZhdGFyVXBsb2FkTWV0YWRhdGE+KCgpID0+IHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIGNvbnN0IHAgPSB0aGlzLnByb2ZpbGUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFVybDogcD8uYXZhdGFyVXJsLFxuICAgICAgaW5pdGlhbHM6IHRoaXMuaW5pdGlhbHNGcm9tTmFtZShwPy5uYW1lKSxcbiAgICAgIHNpemU6IDk2LFxuICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICBzaG93Vmlld0J1dHRvbjogdHJ1ZSxcbiAgICAgIGkxOG5OYW1lc3BhY2U6IHRoaXMubnMsXG4gICAgfTtcbiAgfSk7XG5cbiAgZm9ybU1ldGE6IEZvcm1NZXRhZGF0YSA9IHRoaXMuYnVpbGRGb3JtTWV0YSgpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEF1dG8tcmVnaXN0cm8gaTE4biDigJQgcmVzcGV0YSBvdmVycmlkZSBkZWwgY29uc3VtZXIuIEVsIG5hbWVzcGFjZSBwdWVkZVxuICAgIC8vIHZlbmlyIGRlIEBJbnB1dC5jb25maWcgbyBkZWwgcm91dGUgZGF0YTsgbG8gcmVzb2x2ZW1vcyBhY8OhLlxuICAgIGNvbnN0IG5zID0gdGhpcy5ucztcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cyhucywgUFJPRklMRV9WSUVXX0kxOE4pO1xuXG4gICAgdGhpcy5uYXYuc2V0QmFja0hlYWRlcigncGFnZVRpdGxlJywgbnMsIHsgd2l0aE1lbnU6IHRydWUgfSk7XG5cbiAgICBjb25uZWN0UGFnZVJlZnJlc2goKCkgPT4gdGhpcy5sb2FkRnJvbUFwaSgpKTtcblxuICAgIC8vIENhcmdhciBwZXJmaWwgaW5tZWRpYXRhbWVudGUgc2kgZWwgdXN1YXJpbyB5YSBlc3TDoSBhdXRlbnRpY2Fkby5cbiAgICAvLyBTaW4gZXN0bywgc2kgYXV0aC51c2VyKCkgeWEgZXN0YWJhIHBvcHVsYWRvIGFsIG1vbnRhciBlbCBjb21wb25lbnRlXG4gICAgLy8gKHNlc2nDs24gcmVzdGF1cmFkYSksIGVsIGVmZmVjdCBubyBkaXNwYXJhIHkgbGEgcMOhZ2luYSBxdWVkYSB2YWPDrWFcbiAgICAvLyBoYXN0YSBxdWUgZWwgdXN1YXJpbyBoYWNlIHB1bGwtdG8tcmVmcmVzaCAoUmVnbGE6IG5vIGVzcGVyYXIgYSBxdWVcbiAgICAvLyB1bmEgc2lnbmFsIGNhbWJpZSBzaSB5YSB0aWVuZSB2YWxvciBpbmljaWFsKS5cbiAgICB2b2lkIHRoaXMuZmlyZWJhc2Uud2hlbkZpcmViYXNlQXV0aFJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCB1aWQgPSB0aGlzLl91c2VySWQoKTtcbiAgICAgIGlmICh1aWQpIHtcbiAgICAgICAgdm9pZCB0aGlzLmxvYWRGcm9tQXBpKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoXG4gICAgICBvbkNsZWFudXAgPT4ge1xuICAgICAgICBjb25zdCB1aWQgPSB0aGlzLl91c2VySWQoKTtcbiAgICAgICAgaWYgKCF1aWQpIHtcbiAgICAgICAgICB0aGlzLnByb2ZpbGUuc2V0KG51bGwpO1xuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgICAgIGxldCBzdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBhcGlGYWxsYmFja1VzZWQgPSBmYWxzZTtcblxuICAgICAgICB2b2lkIHRoaXMuZmlyZWJhc2Uud2hlbkZpcmViYXNlQXV0aFJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHN1YiA9IHRoaXMudXNlcnNDb2wud2F0Y2godWlkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogZG9jID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZmlsZS5zZXQodGhpcy5tYXBNaXJyb3JUb1Byb2ZpbGUoZG9jKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkRXJyb3Iuc2V0KG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhcGlGYWxsYmFja1VzZWQpIHtcbiAgICAgICAgICAgICAgICBhcGlGYWxsYmFja1VzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5sb2FkRnJvbUFwaSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFhcGlGYWxsYmFja1VzZWQpIHtcbiAgICAgICAgICAgICAgICBhcGlGYWxsYmFja1VzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5sb2FkRnJvbUFwaSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBvbkNsZWFudXAoKCkgPT4ge1xuICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgc3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgLy8gc2F2aW5nIOKGkiBtdXRhciBzdGF0ZSAodmFsLWZvcm0ubmdEb0NoZWNrIGxvIGRldGVjdGEpLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBpc1NhdmluZyA9IHRoaXMuc2F2aW5nKCk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGlzU2F2aW5nID8gQ29tcG9uZW50U3RhdGVzLldPUktJTkcgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRDtcbiAgICAgIHRoaXMuZm9ybU1ldGEuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICh0aGlzLmZvcm1NZXRhLmFjdGlvbnMgYXMgQnV0dG9uTWV0YWRhdGEpLnN0YXRlID0gc3RhdGU7XG4gICAgICAodGhpcy5mb3JtTWV0YS5hY3Rpb25zIGFzIEJ1dHRvbk1ldGFkYXRhKS50ZXh0ID0gaXNTYXZpbmcgPyB0aGlzLnQoJ3NhdmluZycpIDogdGhpcy50KCdzYXZlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBwcm9maWxlIGxvYWRlZCArIGZvcm0gbW91bnRlZCDihpIgcGF0Y2hWYWx1ZSBhbCBGb3JtR3JvdXAuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnByb2ZpbGUoKTtcbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1DbXAoKT8uRm9ybTtcbiAgICAgIGlmICghcCB8fCAhZm9ybSkgcmV0dXJuO1xuICAgICAgZm9ybS5wYXRjaFZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgaGFuZGxlOiBwLmhhbmRsZSB8fCAnJyxcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgfHwgJycsXG4gICAgICAgICAgcGhvbmU6IHAucGhvbmUgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gaTE4bi5sYW5nIGNoYW5nZSDihpIgbXV0YXIgbGFiZWxzIChyYXJlLCBubyBhZmVjdGEgdHlwaW5nKS5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICAgIHRoaXMuYXBwbHlJMThuTGFiZWxzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29uc3RydWNjacOzbiBpbmljaWFsIOKAlCBVTkEgdmV6LiBHYXRlYSBoYW5kbGUvcGhvbmUgc2Vnw7puIGNvbmZpZy4gKi9cbiAgcHJpdmF0ZSBidWlsZEZvcm1NZXRhKCk6IEZvcm1NZXRhZGF0YSB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5yZXNvbHZlZENvbmZpZygpO1xuXG4gICAgY29uc3QgaGFuZGxlRmllbGQ6IElucHV0TWV0YWRhdGEgPSB7XG4gICAgICB0b2tlbjogJ3Byb2ZpbGUtaGFuZGxlJyxcbiAgICAgIG5hbWU6ICdoYW5kbGUnLFxuICAgICAgbGFiZWw6IHRoaXMudCgnaGFuZGxlJyksXG4gICAgICBoaW50OiB0aGlzLnQoJ2hhbmRsZUhpbnQnKSxcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ2hhbmRsZVBsYWNlaG9sZGVyJyksXG4gICAgICB0eXBlOiBJbnB1dFR5cGUuSEFORExFLFxuICAgICAgb3JkZXI6IDEsXG4gICAgICB2YWxpZGF0b3JzOiBbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoKEhBTkRMRV9NSU4pLFxuICAgICAgICBWYWxpZGF0b3JzLm1heExlbmd0aChIQU5ETEVfTUFYKSxcbiAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKEhBTkRMRV9QQVRURVJOKSxcbiAgICAgIF0sXG4gICAgICBlcnJvcnM6IHtcbiAgICAgICAgcmVxdWlyZWQ6IHRoaXMudCgndXNlcm5hbWVJbnZhbGlkJyksXG4gICAgICAgIG1pbmxlbmd0aDogdGhpcy50KCd1c2VybmFtZUludmFsaWQnKSxcbiAgICAgICAgbWF4bGVuZ3RoOiB0aGlzLnQoJ3VzZXJuYW1lSW52YWxpZCcpLFxuICAgICAgICBwYXR0ZXJuOiB0aGlzLnQoJ3VzZXJuYW1lSW52YWxpZCcpLFxuICAgICAgfSxcbiAgICAgIHZhbHVlOiAnJyxcbiAgICAgIHJhbmdlOiB7IG1pbjogSEFORExFX01JTiwgbWF4OiBIQU5ETEVfTUFYIH0sXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgfTtcblxuICAgIGNvbnN0IG5hbWVGaWVsZDogSW5wdXRNZXRhZGF0YSA9IHtcbiAgICAgIHRva2VuOiAncHJvZmlsZS1uYW1lJyxcbiAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgIGxhYmVsOiB0aGlzLnQoJ25hbWUnKSxcbiAgICAgIGhpbnQ6IHRoaXMudCgnbmFtZUhpbnQnKSxcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ25hbWVQbGFjZWhvbGRlcicpLFxuICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFQsXG4gICAgICBvcmRlcjogMixcbiAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgyKSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV0sXG4gICAgICBlcnJvcnM6IHt9LFxuICAgICAgdmFsdWU6ICcnLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgIH07XG5cbiAgICBjb25zdCBwaG9uZUZpZWxkOiBJbnB1dE1ldGFkYXRhID0ge1xuICAgICAgdG9rZW46ICdwcm9maWxlLXBob25lJyxcbiAgICAgIG5hbWU6ICdwaG9uZScsXG4gICAgICBsYWJlbDogdGhpcy50KCdwaG9uZScpLFxuICAgICAgaGludDogdGhpcy50KCdwaG9uZUhpbnQnKSxcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ3Bob25lUGxhY2Vob2xkZXInKSxcbiAgICAgIHR5cGU6IElucHV0VHlwZS5QSE9ORSxcbiAgICAgIG9yZGVyOiAzLFxuICAgICAgdmFsaWRhdG9yczogW10sXG4gICAgICBlcnJvcnM6IHt9LFxuICAgICAgdmFsdWU6ICcnLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgIH07XG5cbiAgICAvLyBGaWx0cmFkbyBwb3IgY29uZmlnOiBlbCBuYW1lIHNpZW1wcmUgdmE7IGhhbmRsZS9waG9uZSBzb24gb3B0LW91dC5cbiAgICBjb25zdCBmaWVsZHM6IElucHV0TWV0YWRhdGFbXSA9IFtdO1xuICAgIGlmIChjZmcuc2hvd0hhbmRsZSkgZmllbGRzLnB1c2goaGFuZGxlRmllbGQpO1xuICAgIGZpZWxkcy5wdXNoKG5hbWVGaWVsZCk7XG4gICAgaWYgKGNmZy5zaG93UGhvbmUpIGZpZWxkcy5wdXNoKHBob25lRmllbGQpO1xuXG4gICAgY29uc3Qgc3VibWl0QnV0dG9uOiBCdXR0b25NZXRhZGF0YSA9IHtcbiAgICAgIHRleHQ6IHRoaXMudCgnc2F2ZScpLFxuICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgdG9rZW46ICdwcm9maWxlLXNhdmUnLFxuICAgIH0gYXMgQnV0dG9uTWV0YWRhdGE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHN1Ym1pdEJ1dHRvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJlLWFwbGljYSBsYWJlbHMvaGludHMvcGxhY2Vob2xkZXJzIGVuIGNhbWJpbyBkZSBpZGlvbWEuICovXG4gIHByaXZhdGUgYXBwbHlJMThuTGFiZWxzKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLmZvcm1NZXRhLnNlY3Rpb25zWzBdO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHMpIHtcbiAgICAgIHN3aXRjaCAoZmllbGQubmFtZSkge1xuICAgICAgICBjYXNlICdoYW5kbGUnOlxuICAgICAgICAgIGZpZWxkLmxhYmVsID0gdGhpcy50KCdoYW5kbGUnKTtcbiAgICAgICAgICBmaWVsZC5oaW50ID0gdGhpcy50KCdoYW5kbGVIaW50Jyk7XG4gICAgICAgICAgZmllbGQucGxhY2Vob2xkZXIgPSB0aGlzLnQoJ2hhbmRsZVBsYWNlaG9sZGVyJyk7XG4gICAgICAgICAgZmllbGQuZXJyb3JzID0ge1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRoaXMudCgndXNlcm5hbWVJbnZhbGlkJyksXG4gICAgICAgICAgICBtaW5sZW5ndGg6IHRoaXMudCgndXNlcm5hbWVJbnZhbGlkJyksXG4gICAgICAgICAgICBtYXhsZW5ndGg6IHRoaXMudCgndXNlcm5hbWVJbnZhbGlkJyksXG4gICAgICAgICAgICBwYXR0ZXJuOiB0aGlzLnQoJ3VzZXJuYW1lSW52YWxpZCcpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICAgIGZpZWxkLmxhYmVsID0gdGhpcy50KCduYW1lJyk7XG4gICAgICAgICAgZmllbGQuaGludCA9IHRoaXMudCgnbmFtZUhpbnQnKTtcbiAgICAgICAgICBmaWVsZC5wbGFjZWhvbGRlciA9IHRoaXMudCgnbmFtZVBsYWNlaG9sZGVyJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Bob25lJzpcbiAgICAgICAgICBmaWVsZC5sYWJlbCA9IHRoaXMudCgncGhvbmUnKTtcbiAgICAgICAgICBmaWVsZC5oaW50ID0gdGhpcy50KCdwaG9uZUhpbnQnKTtcbiAgICAgICAgICBmaWVsZC5wbGFjZWhvbGRlciA9IHRoaXMudCgncGhvbmVQbGFjZWhvbGRlcicpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmZvcm1NZXRhLmFjdGlvbnMgYXMgQnV0dG9uTWV0YWRhdGE7XG4gICAgYnV0dG9uLnRleHQgPSB0aGlzLnNhdmluZygpID8gdGhpcy50KCdzYXZpbmcnKSA6IHRoaXMudCgnc2F2ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbGxiYWNrIFJFU1QuIENhcGEgNCAoVUkgZGVjbGFyYXRpdmEpOiBOTyB0b2FzdGVhbW9zIGFjw6Eg4oCUIGVsXG4gICAqIHZhbC1lbXB0eS1zdGF0ZSBFUyBsYSBVSSBkZWwgZXJyb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRGcm9tQXBpKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHAgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmF1dGguZ2V0UHJvZmlsZSgpKTtcbiAgICAgIHRoaXMucHJvZmlsZS5zZXQocCk7XG4gICAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvYWRFcnJvci5zZXQoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYXBNaXJyb3JUb1Byb2ZpbGUoZG9jOiBVc2VyTWlycm9yRG9jKTogR2V0UHJvZmlsZVJlc3BvbnNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0aW9uSWQ6ICcnLFxuICAgICAgdXNlcklkOiBkb2MudXNlcklkLFxuICAgICAgZW1haWw6IGRvYy5lbWFpbCxcbiAgICAgIG5hbWU6IGRvYy5uYW1lID8/ICcnLFxuICAgICAgaGFuZGxlOiBkb2MuaGFuZGxlLFxuICAgICAgcGhvbmU6IGRvYy5waG9uZSxcbiAgICAgIGF2YXRhclVybDogZG9jLmF2YXRhclVybCxcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgcGhvbmVWZXJpZmllZDogZmFsc2UsXG4gICAgICBtZmFFbmFibGVkOiBmYWxzZSxcbiAgICAgIGNyZWF0ZWRBdDogJycsXG4gICAgICB1cGRhdGVkQXQ6ICcnLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBvblN1Ym1pdChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNhdmluZygpKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5wcm9maWxlKCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBjZmcgPSB0aGlzLnJlc29sdmVkQ29uZmlnKCk7XG4gICAgY29uc3QgZmllbGRzID0gZXZlbnQuZmllbGRzIHx8IHt9O1xuICAgIGNvbnN0IG5leHRIYW5kbGUgPSBTdHJpbmcoZmllbGRzWydoYW5kbGUnXSB8fCAnJylcbiAgICAgIC50cmltKClcbiAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5leHROYW1lID0gU3RyaW5nKGZpZWxkc1snbmFtZSddIHx8ICcnKS50cmltKCk7XG4gICAgY29uc3QgbmV4dFBob25lID0gU3RyaW5nKGZpZWxkc1sncGhvbmUnXSB8fCAnJykudHJpbSgpO1xuXG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlZCA9IGNmZy5zaG93SGFuZGxlICYmICEhbmV4dEhhbmRsZSAmJiBuZXh0SGFuZGxlICE9PSAoY3VycmVudC5oYW5kbGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbmFtZUNoYW5nZWQgPSAhIW5leHROYW1lICYmIG5leHROYW1lICE9PSAoY3VycmVudC5uYW1lIHx8ICcnKTtcbiAgICBjb25zdCBwaG9uZUNoYW5nZWQgPSBjZmcuc2hvd1Bob25lICYmIG5leHRQaG9uZSAhPT0gKGN1cnJlbnQucGhvbmUgfHwgJycpO1xuXG4gICAgaWYgKCFoYW5kbGVDaGFuZ2VkICYmICFuYW1lQ2hhbmdlZCAmJiAhcGhvbmVDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ3NhdmVTdWNjZXNzJyksXG4gICAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNhdmluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChoYW5kbGVDaGFuZ2VkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnVwZGF0ZUhhbmRsZShuZXh0SGFuZGxlKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICdwcm9maWxlLnVwZGF0ZUhhbmRsZScsXG4gICAgICAgICAgICBpMThuTWFwOiB7IEFVVEhfVVNFUk5BTUVfRVhJU1RTOiAnaGFuZGxlSW5Vc2UnIH0sXG4gICAgICAgICAgICBmYWxsYmFja0tleTogJ2hhbmRsZUVycm9yJyxcbiAgICAgICAgICAgIGkxOG5OYW1lc3BhY2U6IHRoaXMubnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRnJvbUFwaSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmFtZUNoYW5nZWQgfHwgcGhvbmVDaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IHsgbmFtZT86IHN0cmluZzsgcGhvbmU/OiBzdHJpbmcgfSA9IHt9O1xuICAgICAgICBpZiAobmFtZUNoYW5nZWQpIHBheWxvYWQubmFtZSA9IG5leHROYW1lO1xuICAgICAgICBpZiAocGhvbmVDaGFuZ2VkKSBwYXlsb2FkLnBob25lID0gbmV4dFBob25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC51cGRhdGVQcm9maWxlKHBheWxvYWQpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICAgICAgY29udGV4dDogJ3Byb2ZpbGUudXBkYXRlUHJvZmlsZScsXG4gICAgICAgICAgICBpMThuTWFwOiB7XG4gICAgICAgICAgICAgIEFVVEhWMl9QSE9ORV9FWElTVFM6ICdwaG9uZUluVXNlJyxcbiAgICAgICAgICAgICAgQVVUSFYyX0lOVkFMSURfUEhPTkU6ICdwaG9uZUludmFsaWQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbGxiYWNrS2V5OiAnc2F2ZUVycm9yJyxcbiAgICAgICAgICAgIGkxOG5OYW1lc3BhY2U6IHRoaXMubnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRnJvbUFwaSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ3NhdmVTdWNjZXNzJyksXG4gICAgICAgIGR1cmF0aW9uOiAyNTAwLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICB9KTtcbiAgICAgIGNmZy5vblNhdmVkPy4odGhpcy5wcm9maWxlKCkgPz8gY3VycmVudCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2F2aW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgb25BdmF0YXJVcGxvYWRlZChyZXN1bHQ6IEF2YXRhclVwbG9hZFJlc3VsdCk6IHZvaWQge1xuICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICBtZXNzYWdlOiB0aGlzLnQoJ2F2YXRhclN1Y2Nlc3MnKSxcbiAgICAgIGR1cmF0aW9uOiAyNTAwLFxuICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICB9KTtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnKCkub25BdmF0YXJVcGxvYWRlZD8uKHJlc3VsdCk7XG4gIH1cblxuICBvbkF2YXRhckVycm9yKF9lcnI6IEF2YXRhclVwbG9hZEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdC5zaG93KHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMudCgnYXZhdGFyRXJyb3InKSxcbiAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBMZWUgZGVsIG5hbWVzcGFjZSBjb25maWd1cmFkby4gKi9cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIHRoaXMubnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsc0Zyb21OYW1lKG5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuICc/JztcbiAgICBjb25zdCBwYXJ0cyA9IG5hbWUudHJpbSgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiAnPyc7XG4gICAgY29uc3QgZmlyc3QgPSBwYXJ0c1swXT8uWzBdID8/ICcnO1xuICAgIGNvbnN0IGxhc3QgPSBwYXJ0cy5sZW5ndGggPiAxID8gKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdPy5bMF0gPz8gJycpIDogJyc7XG4gICAgcmV0dXJuIChmaXJzdCArIGxhc3QpLnRvVXBwZXJDYXNlKCkgfHwgJz8nO1xuICB9XG59XG4iXX0=
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvcHJvZmlsZS12aWV3L3Byb2ZpbGUtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRXBGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUV4RCxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDO0FBRTdDOzs7Ozs7Ozs7O0dBVUc7QUFPSCxNQUFNLE9BQU8sb0JBQW9CO0lBWS9CO1FBWFEsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hDLFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0IsVUFBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUkxQyxPQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQXNCLENBQUM7WUFDMUYsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsSUFBSSxTQUFTLENBQUMsYUFBYSxJQUFJLGlCQUFpQixDQUFDO1FBQ3BGLENBQUMsQ0FBQyxDQUFDO1FBR0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLDRFQUE0RTtRQUM1RSxpRkFBaUY7UUFDakYsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQzsrR0FsQlUsb0JBQW9CO21HQUFwQixvQkFBb0IsMEdBRnJCLDZDQUE2Qyw0REFEN0MsdUJBQXVCOzs0RkFHdEIsb0JBQW9CO2tCQU5oQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDbEMsUUFBUSxFQUFFLDZDQUE2QztpQkFDeEQ7d0RBTVUsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uL25hdmlnYXRpb24uc2VydmljZSc7XG5cbmltcG9ydCB7IFByb2ZpbGVDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9wcm9maWxlLWNvbnRlbnQuY29tcG9uZW50JztcbmltcG9ydCB7IFByb2ZpbGVWaWV3Q29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBQUk9GSUxFX1ZJRVdfSTE4TiB9IGZyb20gJy4vcHJvZmlsZS12aWV3LmkxOG4nO1xuXG5jb25zdCBERUZBVUxUX05BTUVTUEFDRSA9ICdTZXR0aW5ncy5Qcm9maWxlJztcblxuLyoqXG4gKiBgdmFsLXByb2ZpbGUtdmlld2Ag4oCUIHZpc3RhIFBlcmZpbCBydXRlYWRhIChvcmdhbmlzbSkuIFdyYXBwZXIgZGVsZ2FkbzpcbiAqIGNvbmZpZ3VyYSBlbCBoZWFkZXIgZGVsIHNoZWxsIChgTmF2aWdhdGlvblNlcnZpY2Uuc2V0QmFja0hlYWRlcmApIHkgZGVsZWdhIFRPRE9cbiAqIGVsIGNvbnRlbmlkby9sw7NnaWNhIGEgYHZhbC1wcm9maWxlLWNvbnRlbnRgLlxuICpcbiAqIEVsIGNvbnRlbmlkbyB2aXZlIGVuIGB2YWwtcHJvZmlsZS1jb250ZW50YCAoc2luIGNyb23DoXRpY2EgZGUgcMOhZ2luYSkgcGFyYSBwb2RlclxuICogcmV1dGlsaXphcnNlIHRhbWJpw6luIGRlc2RlIGB2YWwtcHJvZmlsZS1tb2RhbGAgc2luIGNvbnRhbWluYXIgZWwgaGVhZGVyLlxuICpcbiAqIENvbnN1bW86IGlndWFsIHF1ZSBhbnRlcyAocnV0YSB2w61hIGBwcm92aWRlVmFsdGVjaFByb2ZpbGVSb3V0ZXNgIG8gZW1iZWJpZGEgY29uXG4gKiBgW2NvbmZpZ11gKS4gTGEgY29uZmlnIHNlIHBhc2EgdGFsIGN1YWwgYWwgY29udGVuaWRvLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtcHJvZmlsZS12aWV3JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1Byb2ZpbGVDb250ZW50Q29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGAgPHZhbC1wcm9maWxlLWNvbnRlbnQgW2NvbmZpZ109XCJjb25maWdcIiAvPiBgLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9maWxlVmlld0NvbXBvbmVudCB7XG4gIHByaXZhdGUgbmF2ID0gaW5qZWN0KE5hdmlnYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBASW5wdXQoKSBjb25maWc/OiBQcm9maWxlVmlld0NvbmZpZztcblxuICBwcml2YXRlIHJlYWRvbmx5IG5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGZyb21Sb3V0ZSA9ICh0aGlzLnJvdXRlPy5zbmFwc2hvdC5kYXRhWydwcm9maWxlQ29uZmlnJ10gPz8ge30pIGFzIFByb2ZpbGVWaWV3Q29uZmlnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8uaTE4bk5hbWVzcGFjZSA/PyBmcm9tUm91dGUuaTE4bk5hbWVzcGFjZSA/PyBERUZBVUxUX05BTUVTUEFDRTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgbnMgPSB0aGlzLm5zKCk7XG4gICAgLy8gRWwgaGVhZGVyIHVzYSBsYSBrZXkgJ3BhZ2VUaXRsZScgZGVsIG5hbWVzcGFjZTsgZWwgY29udGVuaWRvIHJlZ2lzdHJhIGxvc1xuICAgIC8vIGRlZmF1bHRzIGkxOG4sIHBlcm8gbG8gYXNlZ3VyYW1vcyB0YW1iacOpbiBhY8OhIHBvciBzaSBlbCBoZWFkZXIgcmVzdWVsdmUgYW50ZXMuXG4gICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMobnMsIFBST0ZJTEVfVklFV19JMThOKTtcbiAgICB0aGlzLm5hdi5zZXRCYWNrSGVhZGVyKCdwYWdlVGl0bGUnLCBucywgeyB3aXRoTWVudTogdHJ1ZSB9KTtcbiAgfVxufVxuIl19
|