valtech-components 4.0.12 → 4.0.14

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.
@@ -1,18 +1,21 @@
1
1
  import { Component, computed, inject, Input, signal } from '@angular/core';
2
- import { FormsModule } from '@angular/forms';
3
- import { IonButton, IonButtons, IonCheckbox, IonContent, IonHeader, IonIcon, IonSelect, IonSelectOption, IonSpinner, IonTextarea, IonToolbar, } from '@ionic/angular/standalone';
2
+ import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
3
+ import { IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonSpinner, IonTextarea, IonToolbar, } from '@ionic/angular/standalone';
4
4
  import { addIcons } from 'ionicons';
5
- import { cloudUploadOutline } from 'ionicons/icons';
5
+ import { cloudUploadOutline, documentTextOutline } from 'ionicons/icons';
6
6
  import { DisplayComponent } from '../../atoms/display/display.component';
7
7
  import { TextComponent } from '../../atoms/text/text.component';
8
8
  import { TitleComponent } from '../../atoms/title/title.component';
9
+ import { CheckInputComponent } from '../../molecules/check-input/check-input.component';
10
+ import { RadioInputComponent } from '../../molecules/radio-input/radio-input.component';
11
+ import { ComponentStates, InputType } from '../../types';
9
12
  import { I18nService } from '../../../services/i18n';
10
13
  import { OrgService } from '../../../services/org/org.service';
11
14
  import { MEMBER_IMPORT_MODAL_I18N } from './member-import-modal.i18n';
12
15
  import * as i0 from "@angular/core";
13
16
  import * as i1 from "@angular/forms";
14
17
  const DEFAULT_NAMESPACE = 'Settings.ImportModal';
15
- addIcons({ cloudUploadOutline });
18
+ addIcons({ cloudUploadOutline, documentTextOutline });
16
19
  /**
17
20
  * `val-member-import-modal` — panel de carga masiva de miembros (ADR-023 fase 6).
18
21
  *
@@ -33,8 +36,27 @@ export class MemberImportModalComponent {
33
36
  /** Namespace i18n. */
34
37
  this.i18nNamespace = DEFAULT_NAMESPACE;
35
38
  this.csv = '';
36
- this.onConflict = 'assignRole';
37
- this.sendActivation = true;
39
+ this.importMode = signal('file');
40
+ this.onConflictControl = new FormControl('assignRole');
41
+ this.sendActivationControl = new FormControl(true);
42
+ this.conflictRadioProps = computed(() => ({
43
+ control: this.onConflictControl,
44
+ label: '',
45
+ type: InputType.RADIO,
46
+ state: ComponentStates.ENABLED,
47
+ options: [
48
+ { id: 'assignRole', name: this.t('conflictAssign'), order: 0 },
49
+ { id: 'skip', name: this.t('conflictSkip'), order: 1 },
50
+ { id: 'error', name: this.t('conflictError'), order: 2 },
51
+ ],
52
+ }));
53
+ this.sendActivationProps = computed(() => ({
54
+ control: this.sendActivationControl,
55
+ label: this.t('sendActivation'),
56
+ type: InputType.CHECK,
57
+ state: ComponentStates.ENABLED,
58
+ labelPlacement: 'end',
59
+ }));
38
60
  this.submitting = signal(false);
39
61
  this.errorMsg = signal('');
40
62
  this.results = signal(null);
@@ -104,8 +126,8 @@ export class MemberImportModalComponent {
104
126
  this.orgService
105
127
  .importMembers(this.orgId, {
106
128
  users,
107
- onConflict: this.onConflict,
108
- sendActivation: this.sendActivation,
129
+ onConflict: (this.onConflictControl.value ?? 'assignRole'),
130
+ sendActivation: this.sendActivationControl.value ?? true,
109
131
  })
110
132
  .subscribe({
111
133
  next: res => {
@@ -134,6 +156,7 @@ export class MemberImportModalComponent {
134
156
  this.fileName.set('');
135
157
  this.errorMsg.set('');
136
158
  this.results.set(null);
159
+ this.importMode.set('file');
137
160
  }
138
161
  dismiss() {
139
162
  this._modalRef?.dismiss(null, 'cancel');
@@ -155,10 +178,9 @@ export class MemberImportModalComponent {
155
178
 
156
179
  <ion-content class="ion-padding">
157
180
  <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
181
+ <val-title [props]="{ content: t('subtitle'), size: 'large', color: '', bold: false }" />
158
182
 
159
183
  @if (!results()) {
160
- <val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
161
-
162
184
  @if (rolesHint()) {
163
185
  <val-text
164
186
  class="import-roles-hint"
@@ -166,42 +188,79 @@ export class MemberImportModalComponent {
166
188
  />
167
189
  }
168
190
 
169
- <!-- Subida de archivo: label nativo envuelve el input (label trick, igual
170
- que val-attachment-uploader) → gesto confiable en iOS/PWA. -->
171
- <div class="import-upload">
172
- <label class="import-upload__btn">
173
- <ion-icon name="cloud-upload-outline" />
174
- <span>{{ t('uploadFile') }}</span>
175
- <input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
176
- </label>
177
- <span class="import-upload__hint">{{ t('orPaste') }}</span>
191
+ <!-- Selector de método de importación -->
192
+ <div class="import-section">
193
+ <val-title [props]="{ content: t('importMethodLabel'), size: 'small', color: 'dark', bold: true }" />
194
+ <div class="import-method-cards">
195
+ <button
196
+ type="button"
197
+ class="import-method-card"
198
+ [class.import-method-card--active]="importMode() === 'file'"
199
+ (click)="importMode.set('file')"
200
+ >
201
+ <ion-icon name="cloud-upload-outline" class="import-method-card__icon" />
202
+ <span class="import-method-card__title">{{ t('importMethodFile') }}</span>
203
+ <span class="import-method-card__hint">{{ t('importMethodFileHint') }}</span>
204
+ </button>
205
+ <button
206
+ type="button"
207
+ class="import-method-card"
208
+ [class.import-method-card--active]="importMode() === 'paste'"
209
+ (click)="importMode.set('paste')"
210
+ >
211
+ <ion-icon name="document-text-outline" class="import-method-card__icon" />
212
+ <span class="import-method-card__title">{{ t('importMethodPaste') }}</span>
213
+ <span class="import-method-card__hint">{{ t('importMethodPasteHint') }}</span>
214
+ </button>
215
+ </div>
178
216
  </div>
179
217
 
180
- @if (fileName()) {
181
- <p class="import-file-loaded">
182
- {{ t('fileLoaded').replace('{name}', fileName()) }}
183
- </p>
218
+ <!-- Subida de archivo (label trick — gesto confiable en iOS/PWA) -->
219
+ @if (importMode() === 'file') {
220
+ <div class="import-section">
221
+ <label class="import-upload__btn">
222
+ <ion-icon name="cloud-upload-outline" />
223
+ <span>{{ t('uploadFile') }}</span>
224
+ <input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
225
+ </label>
226
+ @if (fileName()) {
227
+ <p class="import-file-loaded">
228
+ {{ t('fileLoaded').replace('{name}', fileName()) }}
229
+ </p>
230
+ }
231
+ </div>
184
232
  }
185
233
 
186
- <ion-textarea
187
- class="import-csv"
188
- [autoGrow]="true"
189
- [rows]="6"
190
- [placeholder]="t('csvPlaceholder')"
191
- [(ngModel)]="csv"
192
- />
234
+ <!-- Pegar CSV -->
235
+ @if (importMode() === 'paste') {
236
+ <div class="import-section">
237
+ <ion-textarea
238
+ class="import-csv"
239
+ [autoGrow]="true"
240
+ [rows]="6"
241
+ [placeholder]="t('csvPlaceholder')"
242
+ [(ngModel)]="csv"
243
+ />
244
+ </div>
245
+ }
193
246
 
194
- <!-- Selector de conflicto: label + ion-select fill=outline (patrón lib) -->
195
- <span class="import-field-label">{{ t('onConflictLabel') }}</span>
196
- <ion-select class="import-conflict" fill="outline" shape="round" interface="popover" [(ngModel)]="onConflict">
197
- <ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
198
- <ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
199
- <ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
200
- </ion-select>
247
+ <!-- Si hubo carga de archivo, mostrar textarea de solo lectura para revisar -->
248
+ @if (importMode() === 'file' && csv) {
249
+ <div class="import-section">
250
+ <ion-textarea class="import-csv" [autoGrow]="true" [rows]="4" [readonly]="true" [value]="csv" />
251
+ </div>
252
+ }
201
253
 
202
- <ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
203
- {{ t('sendActivation') }}
204
- </ion-checkbox>
254
+ <!-- Conflicto: radio buttons -->
255
+ <div class="import-section">
256
+ <val-title [props]="{ content: t('onConflictLabel'), size: 'small', color: 'dark', bold: true }" />
257
+ <val-radio-input [props]="conflictRadioProps()" />
258
+ </div>
259
+
260
+ <!-- Activación: val-check-input -->
261
+ <div class="import-section">
262
+ <val-check-input [props]="sendActivationProps()" />
263
+ </div>
205
264
 
206
265
  @if (errorMsg()) {
207
266
  <p class="import-error">{{ errorMsg() }}</p>
@@ -238,26 +297,26 @@ export class MemberImportModalComponent {
238
297
  </div>
239
298
  }
240
299
  </ion-content>
241
- `, isInline: true, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:16px}.import-roles-hint{display:block;margin-bottom:16px}.import-upload{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:16px}.import-upload__btn{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border:1px solid var(--ion-color-medium, #92949c);border-radius:10px;background:var(--ion-color-light);color:var(--ion-color-dark);font-size:.875rem;font-weight:600;cursor:pointer;transition:border-color .15s ease}.import-upload__btn:hover{border-color:var(--ion-color-primary, #7026df)}.import-upload__btn ion-icon{font-size:1.25rem}.import-upload__btn input[type=file]{display:none}.import-upload__hint{font-size:.8125rem;color:var(--ion-color-medium)}.import-file-loaded{margin:0 0 16px;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:20px;font-family:monospace;font-size:.8125rem}.import-field-label{display:block;font-size:.8125rem;font-weight:600;color:var(--ion-color-medium, #6b6675);margin-bottom:6px}.import-conflict{display:block;width:100%;margin-bottom:20px}.import-activation{display:block;margin-bottom:20px;font-size:.875rem}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:14px}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:12px;color:var(--ion-color-danger, #c0392b)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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"] }] }); }
300
+ `, isInline: true, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:8px}.import-roles-hint{display:block;margin-bottom:24px}.import-section{margin-bottom:28px}.import-section val-title{margin-bottom:10px}.import-method-cards{display:grid;grid-template-columns:1fr 1fr;gap:12px}.import-method-card{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:14px 16px;border:1.5px solid var(--ion-color-light-shade, #d7d8da);border-radius:12px;background:var(--ion-color-light);cursor:pointer;text-align:left;transition:border-color .15s ease,background .15s ease}.import-method-card:hover{border-color:var(--ion-color-medium, #92949c)}.import-method-card--active{border-color:var(--ion-color-primary, #7026df);background:color-mix(in srgb,var(--ion-color-primary, #7026df) 6%,var(--ion-color-light))}.import-method-card__icon{font-size:1.375rem;color:var(--ion-color-medium-shade, #6b6e76);margin-bottom:4px}.import-method-card--active .import-method-card__icon{color:var(--ion-color-primary, #7026df)}.import-method-card__title{font-size:.875rem;font-weight:600;color:var(--ion-color-dark)}.import-method-card__hint{font-size:.75rem;color:var(--ion-color-medium, #92949c);line-height:1.3}.import-upload__btn{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border:1px solid var(--ion-color-medium, #92949c);border-radius:10px;background:var(--ion-color-light);color:var(--ion-color-dark);font-size:.875rem;font-weight:600;cursor:pointer;transition:border-color .15s ease}.import-upload__btn:hover{border-color:var(--ion-color-primary, #7026df)}.import-upload__btn ion-icon{font-size:1.25rem}.import-upload__btn input[type=file]{display:none}.import-file-loaded{margin:10px 0 0;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;font-family:monospace;font-size:.8125rem}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:.875rem}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:.75rem;color:var(--ion-color-danger, #c0392b)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input", inputs: ["preset", "props"] }] }); }
242
301
  }
243
302
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MemberImportModalComponent, decorators: [{
244
303
  type: Component,
245
304
  args: [{ selector: 'val-member-import-modal', standalone: true, imports: [
246
305
  FormsModule,
306
+ ReactiveFormsModule,
247
307
  IonHeader,
248
308
  IonToolbar,
249
309
  IonButtons,
250
310
  IonButton,
251
311
  IonContent,
252
312
  IonTextarea,
253
- IonSelect,
254
- IonSelectOption,
255
- IonCheckbox,
256
313
  IonSpinner,
257
314
  IonIcon,
258
315
  DisplayComponent,
259
316
  TextComponent,
260
317
  TitleComponent,
318
+ RadioInputComponent,
319
+ CheckInputComponent,
261
320
  ], template: `
262
321
  <ion-header>
263
322
  <ion-toolbar>
@@ -271,10 +330,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
271
330
 
272
331
  <ion-content class="ion-padding">
273
332
  <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
333
+ <val-title [props]="{ content: t('subtitle'), size: 'large', color: '', bold: false }" />
274
334
 
275
335
  @if (!results()) {
276
- <val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
277
-
278
336
  @if (rolesHint()) {
279
337
  <val-text
280
338
  class="import-roles-hint"
@@ -282,42 +340,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
282
340
  />
283
341
  }
284
342
 
285
- <!-- Subida de archivo: label nativo envuelve el input (label trick, igual
286
- que val-attachment-uploader) → gesto confiable en iOS/PWA. -->
287
- <div class="import-upload">
288
- <label class="import-upload__btn">
289
- <ion-icon name="cloud-upload-outline" />
290
- <span>{{ t('uploadFile') }}</span>
291
- <input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
292
- </label>
293
- <span class="import-upload__hint">{{ t('orPaste') }}</span>
343
+ <!-- Selector de método de importación -->
344
+ <div class="import-section">
345
+ <val-title [props]="{ content: t('importMethodLabel'), size: 'small', color: 'dark', bold: true }" />
346
+ <div class="import-method-cards">
347
+ <button
348
+ type="button"
349
+ class="import-method-card"
350
+ [class.import-method-card--active]="importMode() === 'file'"
351
+ (click)="importMode.set('file')"
352
+ >
353
+ <ion-icon name="cloud-upload-outline" class="import-method-card__icon" />
354
+ <span class="import-method-card__title">{{ t('importMethodFile') }}</span>
355
+ <span class="import-method-card__hint">{{ t('importMethodFileHint') }}</span>
356
+ </button>
357
+ <button
358
+ type="button"
359
+ class="import-method-card"
360
+ [class.import-method-card--active]="importMode() === 'paste'"
361
+ (click)="importMode.set('paste')"
362
+ >
363
+ <ion-icon name="document-text-outline" class="import-method-card__icon" />
364
+ <span class="import-method-card__title">{{ t('importMethodPaste') }}</span>
365
+ <span class="import-method-card__hint">{{ t('importMethodPasteHint') }}</span>
366
+ </button>
367
+ </div>
294
368
  </div>
295
369
 
296
- @if (fileName()) {
297
- <p class="import-file-loaded">
298
- {{ t('fileLoaded').replace('{name}', fileName()) }}
299
- </p>
370
+ <!-- Subida de archivo (label trick — gesto confiable en iOS/PWA) -->
371
+ @if (importMode() === 'file') {
372
+ <div class="import-section">
373
+ <label class="import-upload__btn">
374
+ <ion-icon name="cloud-upload-outline" />
375
+ <span>{{ t('uploadFile') }}</span>
376
+ <input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
377
+ </label>
378
+ @if (fileName()) {
379
+ <p class="import-file-loaded">
380
+ {{ t('fileLoaded').replace('{name}', fileName()) }}
381
+ </p>
382
+ }
383
+ </div>
300
384
  }
301
385
 
302
- <ion-textarea
303
- class="import-csv"
304
- [autoGrow]="true"
305
- [rows]="6"
306
- [placeholder]="t('csvPlaceholder')"
307
- [(ngModel)]="csv"
308
- />
386
+ <!-- Pegar CSV -->
387
+ @if (importMode() === 'paste') {
388
+ <div class="import-section">
389
+ <ion-textarea
390
+ class="import-csv"
391
+ [autoGrow]="true"
392
+ [rows]="6"
393
+ [placeholder]="t('csvPlaceholder')"
394
+ [(ngModel)]="csv"
395
+ />
396
+ </div>
397
+ }
309
398
 
310
- <!-- Selector de conflicto: label + ion-select fill=outline (patrón lib) -->
311
- <span class="import-field-label">{{ t('onConflictLabel') }}</span>
312
- <ion-select class="import-conflict" fill="outline" shape="round" interface="popover" [(ngModel)]="onConflict">
313
- <ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
314
- <ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
315
- <ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
316
- </ion-select>
399
+ <!-- Si hubo carga de archivo, mostrar textarea de solo lectura para revisar -->
400
+ @if (importMode() === 'file' && csv) {
401
+ <div class="import-section">
402
+ <ion-textarea class="import-csv" [autoGrow]="true" [rows]="4" [readonly]="true" [value]="csv" />
403
+ </div>
404
+ }
317
405
 
318
- <ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
319
- {{ t('sendActivation') }}
320
- </ion-checkbox>
406
+ <!-- Conflicto: radio buttons -->
407
+ <div class="import-section">
408
+ <val-title [props]="{ content: t('onConflictLabel'), size: 'small', color: 'dark', bold: true }" />
409
+ <val-radio-input [props]="conflictRadioProps()" />
410
+ </div>
411
+
412
+ <!-- Activación: val-check-input -->
413
+ <div class="import-section">
414
+ <val-check-input [props]="sendActivationProps()" />
415
+ </div>
321
416
 
322
417
  @if (errorMsg()) {
323
418
  <p class="import-error">{{ errorMsg() }}</p>
@@ -354,7 +449,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
354
449
  </div>
355
450
  }
356
451
  </ion-content>
357
- `, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:16px}.import-roles-hint{display:block;margin-bottom:16px}.import-upload{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:16px}.import-upload__btn{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border:1px solid var(--ion-color-medium, #92949c);border-radius:10px;background:var(--ion-color-light);color:var(--ion-color-dark);font-size:.875rem;font-weight:600;cursor:pointer;transition:border-color .15s ease}.import-upload__btn:hover{border-color:var(--ion-color-primary, #7026df)}.import-upload__btn ion-icon{font-size:1.25rem}.import-upload__btn input[type=file]{display:none}.import-upload__hint{font-size:.8125rem;color:var(--ion-color-medium)}.import-file-loaded{margin:0 0 16px;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:20px;font-family:monospace;font-size:.8125rem}.import-field-label{display:block;font-size:.8125rem;font-weight:600;color:var(--ion-color-medium, #6b6675);margin-bottom:6px}.import-conflict{display:block;width:100%;margin-bottom:20px}.import-activation{display:block;margin-bottom:20px;font-size:.875rem}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:14px}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:12px;color:var(--ion-color-danger, #c0392b)}\n"] }]
452
+ `, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:8px}.import-roles-hint{display:block;margin-bottom:24px}.import-section{margin-bottom:28px}.import-section val-title{margin-bottom:10px}.import-method-cards{display:grid;grid-template-columns:1fr 1fr;gap:12px}.import-method-card{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:14px 16px;border:1.5px solid var(--ion-color-light-shade, #d7d8da);border-radius:12px;background:var(--ion-color-light);cursor:pointer;text-align:left;transition:border-color .15s ease,background .15s ease}.import-method-card:hover{border-color:var(--ion-color-medium, #92949c)}.import-method-card--active{border-color:var(--ion-color-primary, #7026df);background:color-mix(in srgb,var(--ion-color-primary, #7026df) 6%,var(--ion-color-light))}.import-method-card__icon{font-size:1.375rem;color:var(--ion-color-medium-shade, #6b6e76);margin-bottom:4px}.import-method-card--active .import-method-card__icon{color:var(--ion-color-primary, #7026df)}.import-method-card__title{font-size:.875rem;font-weight:600;color:var(--ion-color-dark)}.import-method-card__hint{font-size:.75rem;color:var(--ion-color-medium, #92949c);line-height:1.3}.import-upload__btn{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border:1px solid var(--ion-color-medium, #92949c);border-radius:10px;background:var(--ion-color-light);color:var(--ion-color-dark);font-size:.875rem;font-weight:600;cursor:pointer;transition:border-color .15s ease}.import-upload__btn:hover{border-color:var(--ion-color-primary, #7026df)}.import-upload__btn ion-icon{font-size:1.25rem}.import-upload__btn input[type=file]{display:none}.import-file-loaded{margin:10px 0 0;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;font-family:monospace;font-size:.8125rem}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:.875rem}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:.75rem;color:var(--ion-color-danger, #c0392b)}\n"] }]
358
453
  }], ctorParameters: () => [], propDecorators: { orgId: [{
359
454
  type: Input
360
455
  }], availableRoles: [{
@@ -366,4 +461,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
366
461
  }], i18nNamespace: [{
367
462
  type: Input
368
463
  }] } });
369
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLWltcG9ydC1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21lbWJlci1pbXBvcnQtbW9kYWwvbWVtYmVyLWltcG9ydC1tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixXQUFXLEVBQ1gsVUFBVSxHQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHL0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQUV0RSxNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0FBRWpELFFBQVEsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztBQUVqQzs7Ozs7Ozs7R0FRRztBQTBQSCxNQUFNLE9BQU8sMEJBQTBCO0lBeUNyQztRQXhDUSxTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNCLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFeEMsOEJBQThCO1FBQ3JCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFcEIsNkRBQTZEO1FBQ3BELG1CQUFjLEdBQWEsRUFBRSxDQUFDO1FBUXZDLHNCQUFzQjtRQUNiLGtCQUFhLEdBQUcsaUJBQWlCLENBQUM7UUFFM0MsUUFBRyxHQUFHLEVBQUUsQ0FBQztRQUNULGVBQVUsR0FBcUIsWUFBWSxDQUFDO1FBQzVDLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBRWIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixhQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLFlBQU8sR0FBRyxNQUFNLENBQStCLElBQUksQ0FBQyxDQUFDO1FBQzlELHFFQUFxRTtRQUM1RCxhQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLGNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2xHLENBQUM7UUFFTyxpQkFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDcEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQztZQUNsQyxJQUFJLENBQUMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FDdEYsVUFBVSxDQUNYLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBR0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsY0FBYyxDQUFDLEtBQVk7UUFDekIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsa0ZBQWtGO1FBQ2xGLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCx5RUFBeUU7SUFDakUsUUFBUTtRQUNkLE1BQU0sSUFBSSxHQUFvQixFQUFFLENBQUM7UUFDakMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSTtnQkFBRSxTQUFTO1lBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsc0RBQXNEO1lBQ3RELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDcEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN4QyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVO2FBQ1osYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDekIsS0FBSztZQUNMLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7U0FDcEMsQ0FBQzthQUNELFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDVixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLHFFQUFxRTtnQkFDckUsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDbkQsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JCLENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDbkUsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXLENBQUMsQ0FBa0I7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0MsT0FBTyxHQUFHLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQ2pHLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsQ0FBQyxDQUFDLEdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsQ0FBQzsrR0E3SVUsMEJBQTBCO21HQUExQiwwQkFBMEIsaU9Bck8zQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0dULDZ0RUFoSEMsV0FBVywrVkFDWCxTQUFTLG9HQUNULFVBQVUsbUZBQ1YsVUFBVSw4RUFDVixTQUFTLG9QQUNULFVBQVUsd0tBQ1YsV0FBVyxpYUFDWCxTQUFTLGtWQUNULGVBQWUsNkZBQ2YsV0FBVyxxTUFDWCxVQUFVLHlHQUNWLE9BQU8sMkpBQ1AsZ0JBQWdCLDJFQUNoQixhQUFhLHdFQUNiLGNBQWM7OzRGQXVPTCwwQkFBMEI7a0JBelB0QyxTQUFTOytCQUNFLHlCQUF5QixjQUN2QixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxTQUFTO3dCQUNULFVBQVU7d0JBQ1YsVUFBVTt3QkFDVixTQUFTO3dCQUNULFVBQVU7d0JBQ1YsV0FBVzt3QkFDWCxTQUFTO3dCQUNULGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCxVQUFVO3dCQUNWLE9BQU87d0JBQ1AsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGNBQWM7cUJBQ2YsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0dUO3dEQTBJUSxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIElvbkJ1dHRvbixcbiAgSW9uQnV0dG9ucyxcbiAgSW9uQ2hlY2tib3gsXG4gIElvbkNvbnRlbnQsXG4gIElvbkhlYWRlcixcbiAgSW9uSWNvbixcbiAgSW9uU2VsZWN0LFxuICBJb25TZWxlY3RPcHRpb24sXG4gIElvblNwaW5uZXIsXG4gIElvblRleHRhcmVhLFxuICBJb25Ub29sYmFyLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgY2xvdWRVcGxvYWRPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuXG5pbXBvcnQgeyBEaXNwbGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGV4dC90ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RpdGxlL3RpdGxlLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBPcmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvb3JnL29yZy5zZXJ2aWNlJztcbmltcG9ydCB7IEltcG9ydE1lbWJlcnNSZXNwb25zZSwgSW1wb3J0T25Db25mbGljdCwgSW1wb3J0Um93UmVzdWx0LCBJbXBvcnRVc2VyUm93IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvb3JnL3R5cGVzJztcblxuaW1wb3J0IHsgTUVNQkVSX0lNUE9SVF9NT0RBTF9JMThOIH0gZnJvbSAnLi9tZW1iZXItaW1wb3J0LW1vZGFsLmkxOG4nO1xuXG5jb25zdCBERUZBVUxUX05BTUVTUEFDRSA9ICdTZXR0aW5ncy5JbXBvcnRNb2RhbCc7XG5cbmFkZEljb25zKHsgY2xvdWRVcGxvYWRPdXRsaW5lIH0pO1xuXG4vKipcbiAqIGB2YWwtbWVtYmVyLWltcG9ydC1tb2RhbGAg4oCUIHBhbmVsIGRlIGNhcmdhIG1hc2l2YSBkZSBtaWVtYnJvcyAoQURSLTAyMyBmYXNlIDYpLlxuICpcbiAqIEVsIGFkbWluIHBlZ2EgdW4gQ1NWIChgZW1haWwsbm9tYnJlLHJvbGApOyBlbCBtb2RhbCBsbyBwYXJzZWEgYSBmaWxhcyB5IGxsYW1hXG4gKiBgT3JnU2VydmljZS5pbXBvcnRNZW1iZXJzYC4gTXVlc3RyYSBlbCByZXN1bHRhZG8gcG9yLWZpbGEgKHBhcnRpYWwgc3VjY2Vzcyk6XG4gKiBgY3JlYXRlZGAgLyBgYXNzaWduZWRgIC8gYHNraXBwZWRgIC8gYGVycm9yYC4gSGVhZGVyIGNhbsOzbmljbyAoUmVnbGEgIzUpLlxuICpcbiAqIEF1dG8tcmVnaXN0cmEgZGVmYXVsdHMgaTE4biAoZXMvZW4pIGVuIGBTZXR0aW5ncy5JbXBvcnRNb2RhbGAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1tZW1iZXItaW1wb3J0LW1vZGFsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIElvbkhlYWRlcixcbiAgICBJb25Ub29sYmFyLFxuICAgIElvbkJ1dHRvbnMsXG4gICAgSW9uQnV0dG9uLFxuICAgIElvbkNvbnRlbnQsXG4gICAgSW9uVGV4dGFyZWEsXG4gICAgSW9uU2VsZWN0LFxuICAgIElvblNlbGVjdE9wdGlvbixcbiAgICBJb25DaGVja2JveCxcbiAgICBJb25TcGlubmVyLFxuICAgIElvbkljb24sXG4gICAgRGlzcGxheUNvbXBvbmVudCxcbiAgICBUZXh0Q29tcG9uZW50LFxuICAgIFRpdGxlQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24taGVhZGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJkaXNtaXNzKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuXG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCd0aXRsZScpLCBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnIH1cIiAvPlxuXG4gICAgICBAaWYgKCFyZXN1bHRzKCkpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCdoaW50JyksIHNpemU6ICdsYXJnZScsIGNvbG9yOiAnJywgYm9sZDogZmFsc2UgfVwiIC8+XG5cbiAgICAgICAgQGlmIChyb2xlc0hpbnQoKSkge1xuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgY2xhc3M9XCJpbXBvcnQtcm9sZXMtaGludFwiXG4gICAgICAgICAgICBbcHJvcHNdPVwieyBjb250ZW50OiByb2xlc0hpbnQoKSwgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdtZWRpdW0nLCBib2xkOiBmYWxzZSB9XCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBTdWJpZGEgZGUgYXJjaGl2bzogbGFiZWwgbmF0aXZvIGVudnVlbHZlIGVsIGlucHV0IChsYWJlbCB0cmljaywgaWd1YWxcbiAgICAgICAgICAgICBxdWUgdmFsLWF0dGFjaG1lbnQtdXBsb2FkZXIpIOKGkiBnZXN0byBjb25maWFibGUgZW4gaU9TL1BXQS4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbXBvcnQtdXBsb2FkXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaW1wb3J0LXVwbG9hZF9fYnRuXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3VkLXVwbG9hZC1vdXRsaW5lXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7IHQoJ3VwbG9hZEZpbGUnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIi5jc3YsdGV4dC9jc3YsdGV4dC9wbGFpblwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImltcG9ydC11cGxvYWRfX2hpbnRcIj57eyB0KCdvclBhc3RlJykgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoZmlsZU5hbWUoKSkge1xuICAgICAgICAgIDxwIGNsYXNzPVwiaW1wb3J0LWZpbGUtbG9hZGVkXCI+XG4gICAgICAgICAgICB7eyB0KCdmaWxlTG9hZGVkJykucmVwbGFjZSgne25hbWV9JywgZmlsZU5hbWUoKSkgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIH1cblxuICAgICAgICA8aW9uLXRleHRhcmVhXG4gICAgICAgICAgY2xhc3M9XCJpbXBvcnQtY3N2XCJcbiAgICAgICAgICBbYXV0b0dyb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiNlwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInQoJ2NzdlBsYWNlaG9sZGVyJylcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY3N2XCJcbiAgICAgICAgLz5cblxuICAgICAgICA8IS0tIFNlbGVjdG9yIGRlIGNvbmZsaWN0bzogbGFiZWwgKyBpb24tc2VsZWN0IGZpbGw9b3V0bGluZSAocGF0csOzbiBsaWIpIC0tPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImltcG9ydC1maWVsZC1sYWJlbFwiPnt7IHQoJ29uQ29uZmxpY3RMYWJlbCcpIH19PC9zcGFuPlxuICAgICAgICA8aW9uLXNlbGVjdCBjbGFzcz1cImltcG9ydC1jb25mbGljdFwiIGZpbGw9XCJvdXRsaW5lXCIgc2hhcGU9XCJyb3VuZFwiIGludGVyZmFjZT1cInBvcG92ZXJcIiBbKG5nTW9kZWwpXT1cIm9uQ29uZmxpY3RcIj5cbiAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCJhc3NpZ25Sb2xlXCI+e3sgdCgnY29uZmxpY3RBc3NpZ24nKSB9fTwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwic2tpcFwiPnt7IHQoJ2NvbmZsaWN0U2tpcCcpIH19PC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCJlcnJvclwiPnt7IHQoJ2NvbmZsaWN0RXJyb3InKSB9fTwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgIDwvaW9uLXNlbGVjdD5cblxuICAgICAgICA8aW9uLWNoZWNrYm94IGNsYXNzPVwiaW1wb3J0LWFjdGl2YXRpb25cIiBsYWJlbFBsYWNlbWVudD1cImVuZFwiIFsobmdNb2RlbCldPVwic2VuZEFjdGl2YXRpb25cIj5cbiAgICAgICAgICB7eyB0KCdzZW5kQWN0aXZhdGlvbicpIH19XG4gICAgICAgIDwvaW9uLWNoZWNrYm94PlxuXG4gICAgICAgIEBpZiAoZXJyb3JNc2coKSkge1xuICAgICAgICAgIDxwIGNsYXNzPVwiaW1wb3J0LWVycm9yXCI+e3sgZXJyb3JNc2coKSB9fTwvcD5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbXBvcnQtYWN0aW9uc1wiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJkYXJrXCIgW2Rpc2FibGVkXT1cInN1Ym1pdHRpbmcoKVwiIChjbGljayk9XCJzdWJtaXQoKVwiPlxuICAgICAgICAgICAgQGlmIChzdWJtaXR0aW5nKCkpIHtcbiAgICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJkb3RzXCIgLz5cbiAgICAgICAgICAgICAgJm5ic3A7e3sgdCgnc3VibWl0dGluZycpIH19XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAge3sgdCgnc3VibWl0JykgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDwhLS0gUmVzdWx0YWRvcyAtLT5cbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiBzdW1tYXJ5TGFiZWwoKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiB0cnVlIH1cIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW1wb3J0LXJlc3VsdHNcIj5cbiAgICAgICAgICBAZm9yIChyIG9mIHJlc3VsdHMoKSEucmVzdWx0czsgdHJhY2sgci5lbWFpbCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltcG9ydC1yb3cgaW1wb3J0LXJvdy0te3sgci5zdGF0dXMgfX1cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbXBvcnQtcm93X19lbWFpbFwiPnt7IHIuZW1haWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW1wb3J0LXJvd19fc3RhdHVzXCI+e3sgc3RhdHVzTGFiZWwocikgfX08L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoci5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImltcG9ydC1yb3dfX3JlYXNvblwiPnt7IHIucmVhc29uIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW1wb3J0LWFjdGlvbnNcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJvdXRsaW5lXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cInJlc2V0KClcIj5cbiAgICAgICAgICAgIHt7IHQoJ2FnYWluJykgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIHZhbC1kaXNwbGF5IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICAgIH1cbiAgICAgIHZhbC10aXRsZSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgfVxuICAgICAgLmltcG9ydC1yb2xlcy1oaW50IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXVwbG9hZCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgfVxuICAgICAgLmltcG9ydC11cGxvYWRfX2J0biB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTBweCAxNnB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0KTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrKTtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMgZWFzZTtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtdXBsb2FkX19idG46aG92ZXIge1xuICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5LCAjNzAyNmRmKTtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtdXBsb2FkX19idG4gaW9uLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgICB9XG4gICAgICAvKiBFbCBpbnB1dCBuYXRpdm8gcXVlZGEgb2N1bHRvOyBlbCBsYWJlbCByZWVudsOtYSBlbCBjbGljIChsYWJlbCB0cmljaykuICovXG4gICAgICAuaW1wb3J0LXVwbG9hZF9fYnRuIGlucHV0W3R5cGU9J2ZpbGUnXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXVwbG9hZF9faGludCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LWZpbGUtbG9hZGVkIHtcbiAgICAgICAgbWFyZ2luOiAwIDAgMTZweCAwO1xuICAgICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0tc2hhZGUsICM2YjZlNzYpO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1jc3Yge1xuICAgICAgICAtLWJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1saWdodCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgfVxuICAgICAgLyogTGFiZWwgZGUgY2FtcG8g4oCUIG1pc21vIGVzdGlsbyBxdWUgLmZpZWxkLW5hbWUgZW4gdmFsLWZvcm0gKi9cbiAgICAgIC5pbXBvcnQtZmllbGQtbGFiZWwge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjNmI2Njc1KTtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICAgICAgfVxuICAgICAgLmltcG9ydC1jb25mbGljdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtYWN0aXZhdGlvbiB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1lcnJvciB7XG4gICAgICAgIG1hcmdpbjogMCAwIDEycHggMDtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXIsICNjMDM5MmIpO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1hY3Rpb25zIHtcbiAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xuICAgICAgfVxuICAgICAgLmltcG9ydC1yZXN1bHRzIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICAgIG1hcmdpbjogMTJweCAwO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1yb3cge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciBhdXRvO1xuICAgICAgICBncmlkLXJvdy1nYXA6IDJweDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1saWdodCk7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtcm93LS1jcmVhdGVkIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IHZhcigtLWlvbi1jb2xvci1zdWNjZXNzLCAjMmRkMzZmKTtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtcm93LS1hc3NpZ25lZCB7XG4gICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzcwMjZkZik7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXJvdy0tc2tpcHBlZCB7XG4gICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtcm93LS1lcnJvciB7XG4gICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyLCAjYzAzOTJiKTtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtcm93X19lbWFpbCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyayk7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXJvd19fc3RhdHVzIHtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLXNoYWRlLCAjNmI2ZTc2KTtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtcm93X19yZWFzb24ge1xuICAgICAgICBncmlkLWNvbHVtbjogMSAvIC0xO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyLCAjYzAzOTJiKTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBNZW1iZXJJbXBvcnRNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgb3JnU2VydmljZSA9IGluamVjdChPcmdTZXJ2aWNlKTtcblxuICAvKiogT3JnIGRlc3Rpbm8gZGVsIGltcG9ydC4gKi9cbiAgQElucHV0KCkgb3JnSWQgPSAnJztcblxuICAvKiogTm9tYnJlcyBkZSByb2xlcyBkaXNwb25pYmxlcyAocGFyYSBlbCBoaW50KS4gT3BjaW9uYWwuICovXG4gIEBJbnB1dCgpIGF2YWlsYWJsZVJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBDYWxsYmFjayB0cmFzIHVuYSBpbXBvcnRhY2nDs24gZXhpdG9zYSAo4omlMSBmaWxhIHByb2Nlc2FkYSkg4oCUIHJlZnJlc2NhIGxhIGxpc3RhLiAqL1xuICBASW5wdXQoKSBvblN1Y2Nlc3M/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKiBJbnllY3RhZG8gcG9yIGBNb2RhbFNlcnZpY2Uub3BlbmAuICovXG4gIEBJbnB1dCgpIF9tb2RhbFJlZj86IHsgZGlzbWlzczogKGRhdGE/OiB1bmtub3duLCByb2xlPzogc3RyaW5nKSA9PiB2b2lkIH07XG5cbiAgLyoqIE5hbWVzcGFjZSBpMThuLiAqL1xuICBASW5wdXQoKSBpMThuTmFtZXNwYWNlID0gREVGQVVMVF9OQU1FU1BBQ0U7XG5cbiAgY3N2ID0gJyc7XG4gIG9uQ29uZmxpY3Q6IEltcG9ydE9uQ29uZmxpY3QgPSAnYXNzaWduUm9sZSc7XG4gIHNlbmRBY3RpdmF0aW9uID0gdHJ1ZTtcblxuICByZWFkb25seSBzdWJtaXR0aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgZXJyb3JNc2cgPSBzaWduYWwoJycpO1xuICByZWFkb25seSByZXN1bHRzID0gc2lnbmFsPEltcG9ydE1lbWJlcnNSZXNwb25zZSB8IG51bGw+KG51bGwpO1xuICAvKiogTm9tYnJlIGRlbCBhcmNoaXZvIENTViBjYXJnYWRvICh2YWPDrW8gc2kgc2UgcGVnw7MgbWFudWFsbWVudGUpLiAqL1xuICByZWFkb25seSBmaWxlTmFtZSA9IHNpZ25hbCgnJyk7XG5cbiAgcmVhZG9ubHkgcm9sZXNIaW50ID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmF2YWlsYWJsZVJvbGVzLmxlbmd0aCA/IGAke3RoaXMudCgncm9sZXNBdmFpbGFibGUnKX0gJHt0aGlzLmF2YWlsYWJsZVJvbGVzLmpvaW4oJywgJyl9YCA6ICcnXG4gICk7XG5cbiAgcmVhZG9ubHkgc3VtbWFyeUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHMgPSB0aGlzLnJlc3VsdHMoKT8uc3VtbWFyeTtcbiAgICBpZiAoIXMpIHJldHVybiB0aGlzLnQoJ3N1bW1hcnknKTtcbiAgICByZXR1cm4gYCR7dGhpcy50KCdzdW1tYXJ5Jyl9OiAke3MuY3JlYXRlZH0gJHt0aGlzLnQoJ2NyZWF0ZWQnKX0gwrcgJHtzLmFzc2lnbmVkfSAke3RoaXMudChcbiAgICAgICdhc3NpZ25lZCdcbiAgICApfSDCtyAke3Muc2tpcHBlZH0gJHt0aGlzLnQoJ3NraXBwZWQnKX0gwrcgJHtzLmZhaWxlZH0gJHt0aGlzLnQoJ2ZhaWxlZCcpfWA7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShERUZBVUxUX05BTUVTUEFDRSkpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckNvbnRlbnQoREVGQVVMVF9OQU1FU1BBQ0UsIE1FTUJFUl9JTVBPUlRfTU9EQUxfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKHRoaXMuaTE4bk5hbWVzcGFjZSkpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckNvbnRlbnQodGhpcy5pMThuTmFtZXNwYWNlLCBNRU1CRVJfSU1QT1JUX01PREFMX0kxOE4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYXJnYSB1biBhcmNoaXZvIENTViBzZWxlY2Npb25hZG86IGxlZSBzdSB0ZXh0byBhbCB0ZXh0YXJlYSAoYGNzdmApLiAqL1xuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlcz8uWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICAgIHRoaXMuZXJyb3JNc2cuc2V0KCcnKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNzdiA9IFN0cmluZyhyZWFkZXIucmVzdWx0ID8/ICcnKTtcbiAgICAgIHRoaXMuZmlsZU5hbWUuc2V0KGZpbGUubmFtZSk7XG4gICAgfTtcbiAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHRoaXMuZXJyb3JNc2cuc2V0KHRoaXMudCgnZmlsZVJlYWRFcnJvcicpKTtcbiAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgICAvLyBQZXJtaXRlIHJlLXNlbGVjY2lvbmFyIGVsIG1pc21vIGFyY2hpdm8gKGVsIGNoYW5nZSBubyBkaXNwYXJhIHNpIG5vIHNlIGxpbXBpYSkuXG4gICAgaW5wdXQudmFsdWUgPSAnJztcbiAgfVxuXG4gIC8qKiBQYXJzZWEgZWwgQ1NWIHBlZ2FkbyBhIGZpbGFzIHtlbWFpbCxuYW1lLHJvbGVOYW1lfS4gVG9sZXJhIGhlYWRlci4gKi9cbiAgcHJpdmF0ZSBwYXJzZUNzdigpOiBJbXBvcnRVc2VyUm93W10ge1xuICAgIGNvbnN0IHJvd3M6IEltcG9ydFVzZXJSb3dbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmF3IG9mIHRoaXMuY3N2LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSByYXcudHJpbSgpO1xuICAgICAgaWYgKCFsaW5lKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNvbHMgPSBsaW5lLnNwbGl0KCcsJykubWFwKGMgPT4gYy50cmltKCkpO1xuICAgICAgY29uc3QgZW1haWwgPSAoY29sc1swXSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIC8vIFNhbHRhciBoZWFkZXIgKHByaW1lcmEgY29sIFwiZW1haWxcIikgbyBsw61uZWFzIHNpbiBALlxuICAgICAgaWYgKCFlbWFpbCB8fCAhZW1haWwuaW5jbHVkZXMoJ0AnKSkgY29udGludWU7XG4gICAgICByb3dzLnB1c2goeyBlbWFpbCwgbmFtZTogY29sc1sxXSA/PyAnJywgcm9sZU5hbWU6IGNvbHNbMl0gPz8gJycgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgc3VibWl0KCk6IHZvaWQge1xuICAgIHRoaXMuZXJyb3JNc2cuc2V0KCcnKTtcbiAgICBjb25zdCB1c2VycyA9IHRoaXMucGFyc2VDc3YoKTtcbiAgICBpZiAodXNlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVycm9yTXNnLnNldCh0aGlzLnQoJ25vUm93cycpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXJzLnNvbWUodSA9PiAhdS5yb2xlTmFtZSkpIHtcbiAgICAgIHRoaXMuZXJyb3JNc2cuc2V0KHRoaXMudCgncGFyc2VFcnJvcicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN1Ym1pdHRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMub3JnU2VydmljZVxuICAgICAgLmltcG9ydE1lbWJlcnModGhpcy5vcmdJZCwge1xuICAgICAgICB1c2VycyxcbiAgICAgICAgb25Db25mbGljdDogdGhpcy5vbkNvbmZsaWN0LFxuICAgICAgICBzZW5kQWN0aXZhdGlvbjogdGhpcy5zZW5kQWN0aXZhdGlvbixcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgICB0aGlzLnN1Ym1pdHRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnJlc3VsdHMuc2V0KHJlcyk7XG4gICAgICAgICAgLy8gUmVmcmVzY2FyIGxpc3RhIGRlbCBjb25zdW1lciBzaSBodWJvIGFsdGFzL2FzaWduYWNpb25lcyBlZmVjdGl2YXMuXG4gICAgICAgICAgaWYgKHJlcy5zdW1tYXJ5LmNyZWF0ZWQgKyByZXMuc3VtbWFyeS5hc3NpZ25lZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub25TdWNjZXNzPy4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuc3VibWl0dGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuZXJyb3JNc2cuc2V0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgPz8gdGhpcy50KCdnZW5lcmljRXJyb3InKSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIHN0YXR1c0xhYmVsKHI6IEltcG9ydFJvd1Jlc3VsdCk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMudChyLnN0YXR1cyA9PT0gJ2Vycm9yJyA/ICdmYWlsZWQnIDogci5zdGF0dXMpO1xuICAgIGlmIChyLnN0YXR1cyA9PT0gJ2NyZWF0ZWQnICYmIHIuYWN0aXZhdGlvbikge1xuICAgICAgcmV0dXJuIGAke2Jhc2V9IMK3ICR7dGhpcy50KHIuYWN0aXZhdGlvbiA9PT0gJ3NlbnQnID8gJ2FjdGl2YXRpb25TZW50JyA6ICdhY3RpdmF0aW9uUGVuZGluZycpfWA7XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jc3YgPSAnJztcbiAgICB0aGlzLmZpbGVOYW1lLnNldCgnJyk7XG4gICAgdGhpcy5lcnJvck1zZy5zZXQoJycpO1xuICAgIHRoaXMucmVzdWx0cy5zZXQobnVsbCk7XG4gIH1cblxuICBkaXNtaXNzKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsUmVmPy5kaXNtaXNzKG51bGwsICdjYW5jZWwnKTtcbiAgfVxuXG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIHRoaXMuaTE4bk5hbWVzcGFjZSk7XG4gIH1cbn1cbiJdfQ==
464
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLWltcG9ydC1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21lbWJlci1pbXBvcnQtbW9kYWwvbWVtYmVyLWltcG9ydC1tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsR0FDWCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsZUFBZSxFQUFpQixTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxV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QUFVO3dCQUNWLFNBQVM7d0JBQ1QsVUFBVTt3QkFDVixXQUFXO3dCQUNYLFVBQVU7d0JBQ1YsT0FBTzt3QkFDUCxnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLG1CQUFtQjtxQkFDcEIsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0lUO3dEQThKUSxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBJb25CdXR0b24sXG4gIElvbkJ1dHRvbnMsXG4gIElvbkNvbnRlbnQsXG4gIElvbkhlYWRlcixcbiAgSW9uSWNvbixcbiAgSW9uU3Bpbm5lcixcbiAgSW9uVGV4dGFyZWEsXG4gIElvblRvb2xiYXIsXG59IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBjbG91ZFVwbG9hZE91dGxpbmUsIGRvY3VtZW50VGV4dE91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5cbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IENoZWNrSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvY2hlY2staW5wdXQvY2hlY2staW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFJhZGlvSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvcmFkaW8taW5wdXQvcmFkaW8taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFN0YXRlcywgSW5wdXRNZXRhZGF0YSwgSW5wdXRUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgT3JnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL29yZy9vcmcuc2VydmljZSc7XG5pbXBvcnQgeyBJbXBvcnRNZW1iZXJzUmVzcG9uc2UsIEltcG9ydE9uQ29uZmxpY3QsIEltcG9ydFJvd1Jlc3VsdCwgSW1wb3J0VXNlclJvdyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL29yZy90eXBlcyc7XG5cbmltcG9ydCB7IE1FTUJFUl9JTVBPUlRfTU9EQUxfSTE4TiB9IGZyb20gJy4vbWVtYmVyLWltcG9ydC1tb2RhbC5pMThuJztcblxuY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSAnU2V0dGluZ3MuSW1wb3J0TW9kYWwnO1xuXG5hZGRJY29ucyh7IGNsb3VkVXBsb2FkT3V0bGluZSwgZG9jdW1lbnRUZXh0T3V0bGluZSB9KTtcblxuLyoqXG4gKiBgdmFsLW1lbWJlci1pbXBvcnQtbW9kYWxgIOKAlCBwYW5lbCBkZSBjYXJnYSBtYXNpdmEgZGUgbWllbWJyb3MgKEFEUi0wMjMgZmFzZSA2KS5cbiAqXG4gKiBFbCBhZG1pbiBwZWdhIHVuIENTViAoYGVtYWlsLG5vbWJyZSxyb2xgKTsgZWwgbW9kYWwgbG8gcGFyc2VhIGEgZmlsYXMgeSBsbGFtYVxuICogYE9yZ1NlcnZpY2UuaW1wb3J0TWVtYmVyc2AuIE11ZXN0cmEgZWwgcmVzdWx0YWRvIHBvci1maWxhIChwYXJ0aWFsIHN1Y2Nlc3MpOlxuICogYGNyZWF0ZWRgIC8gYGFzc2lnbmVkYCAvIGBza2lwcGVkYCAvIGBlcnJvcmAuIEhlYWRlciBjYW7Ds25pY28gKFJlZ2xhICM1KS5cbiAqXG4gKiBBdXRvLXJlZ2lzdHJhIGRlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbiBgU2V0dGluZ3MuSW1wb3J0TW9kYWxgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbWVtYmVyLWltcG9ydC1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIElvbkhlYWRlcixcbiAgICBJb25Ub29sYmFyLFxuICAgIElvbkJ1dHRvbnMsXG4gICAgSW9uQnV0dG9uLFxuICAgIElvbkNvbnRlbnQsXG4gICAgSW9uVGV4dGFyZWEsXG4gICAgSW9uU3Bpbm5lcixcbiAgICBJb25JY29uLFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgVGV4dENvbXBvbmVudCxcbiAgICBUaXRsZUNvbXBvbmVudCxcbiAgICBSYWRpb0lucHV0Q29tcG9uZW50LFxuICAgIENoZWNrSW5wdXRDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImRpc21pc3MoKVwiPlxuICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ3RpdGxlJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG4gICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ3N1YnRpdGxlJyksIHNpemU6ICdsYXJnZScsIGNvbG9yOiAnJywgYm9sZDogZmFsc2UgfVwiIC8+XG5cbiAgICAgIEBpZiAoIXJlc3VsdHMoKSkge1xuICAgICAgICBAaWYgKHJvbGVzSGludCgpKSB7XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBjbGFzcz1cImltcG9ydC1yb2xlcy1oaW50XCJcbiAgICAgICAgICAgIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHJvbGVzSGludCgpLCBzaXplOiAnc21hbGwnLCBjb2xvcjogJ21lZGl1bScsIGJvbGQ6IGZhbHNlIH1cIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFNlbGVjdG9yIGRlIG3DqXRvZG8gZGUgaW1wb3J0YWNpw7NuIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW1wb3J0LXNlY3Rpb25cIj5cbiAgICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHQoJ2ltcG9ydE1ldGhvZExhYmVsJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IHRydWUgfVwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImltcG9ydC1tZXRob2QtY2FyZHNcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaW1wb3J0LW1ldGhvZC1jYXJkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmltcG9ydC1tZXRob2QtY2FyZC0tYWN0aXZlXT1cImltcG9ydE1vZGUoKSA9PT0gJ2ZpbGUnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImltcG9ydE1vZGUuc2V0KCdmaWxlJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3VkLXVwbG9hZC1vdXRsaW5lXCIgY2xhc3M9XCJpbXBvcnQtbWV0aG9kLWNhcmRfX2ljb25cIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImltcG9ydC1tZXRob2QtY2FyZF9fdGl0bGVcIj57eyB0KCdpbXBvcnRNZXRob2RGaWxlJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW1wb3J0LW1ldGhvZC1jYXJkX19oaW50XCI+e3sgdCgnaW1wb3J0TWV0aG9kRmlsZUhpbnQnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbXBvcnQtbWV0aG9kLWNhcmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW1wb3J0LW1ldGhvZC1jYXJkLS1hY3RpdmVdPVwiaW1wb3J0TW9kZSgpID09PSAncGFzdGUnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImltcG9ydE1vZGUuc2V0KCdwYXN0ZScpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJkb2N1bWVudC10ZXh0LW91dGxpbmVcIiBjbGFzcz1cImltcG9ydC1tZXRob2QtY2FyZF9faWNvblwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW1wb3J0LW1ldGhvZC1jYXJkX190aXRsZVwiPnt7IHQoJ2ltcG9ydE1ldGhvZFBhc3RlJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW1wb3J0LW1ldGhvZC1jYXJkX19oaW50XCI+e3sgdCgnaW1wb3J0TWV0aG9kUGFzdGVIaW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTdWJpZGEgZGUgYXJjaGl2byAobGFiZWwgdHJpY2sg4oCUIGdlc3RvIGNvbmZpYWJsZSBlbiBpT1MvUFdBKSAtLT5cbiAgICAgICAgQGlmIChpbXBvcnRNb2RlKCkgPT09ICdmaWxlJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbXBvcnQtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaW1wb3J0LXVwbG9hZF9fYnRuXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2xvdWQtdXBsb2FkLW91dGxpbmVcIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KCd1cGxvYWRGaWxlJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIi5jc3YsdGV4dC9jc3YsdGV4dC9wbGFpblwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgQGlmIChmaWxlTmFtZSgpKSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiaW1wb3J0LWZpbGUtbG9hZGVkXCI+XG4gICAgICAgICAgICAgICAge3sgdCgnZmlsZUxvYWRlZCcpLnJlcGxhY2UoJ3tuYW1lfScsIGZpbGVOYW1lKCkpIH19XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gUGVnYXIgQ1NWIC0tPlxuICAgICAgICBAaWYgKGltcG9ydE1vZGUoKSA9PT0gJ3Bhc3RlJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbXBvcnQtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGlvbi10ZXh0YXJlYVxuICAgICAgICAgICAgICBjbGFzcz1cImltcG9ydC1jc3ZcIlxuICAgICAgICAgICAgICBbYXV0b0dyb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtyb3dzXT1cIjZcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidCgnY3N2UGxhY2Vob2xkZXInKVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3N2XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFNpIGh1Ym8gY2FyZ2EgZGUgYXJjaGl2bywgbW9zdHJhciB0ZXh0YXJlYSBkZSBzb2xvIGxlY3R1cmEgcGFyYSByZXZpc2FyIC0tPlxuICAgICAgICBAaWYgKGltcG9ydE1vZGUoKSA9PT0gJ2ZpbGUnICYmIGNzdikge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbXBvcnQtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGlvbi10ZXh0YXJlYSBjbGFzcz1cImltcG9ydC1jc3ZcIiBbYXV0b0dyb3ddPVwidHJ1ZVwiIFtyb3dzXT1cIjRcIiBbcmVhZG9ubHldPVwidHJ1ZVwiIFt2YWx1ZV09XCJjc3ZcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBDb25mbGljdG86IHJhZGlvIGJ1dHRvbnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbXBvcnQtc2VjdGlvblwiPlxuICAgICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnb25Db25mbGljdExhYmVsJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IHRydWUgfVwiIC8+XG4gICAgICAgICAgPHZhbC1yYWRpby1pbnB1dCBbcHJvcHNdPVwiY29uZmxpY3RSYWRpb1Byb3BzKClcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEFjdGl2YWNpw7NuOiB2YWwtY2hlY2staW5wdXQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbXBvcnQtc2VjdGlvblwiPlxuICAgICAgICAgIDx2YWwtY2hlY2staW5wdXQgW3Byb3BzXT1cInNlbmRBY3RpdmF0aW9uUHJvcHMoKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoZXJyb3JNc2coKSkge1xuICAgICAgICAgIDxwIGNsYXNzPVwiaW1wb3J0LWVycm9yXCI+e3sgZXJyb3JNc2coKSB9fTwvcD5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbXBvcnQtYWN0aW9uc1wiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJkYXJrXCIgW2Rpc2FibGVkXT1cInN1Ym1pdHRpbmcoKVwiIChjbGljayk9XCJzdWJtaXQoKVwiPlxuICAgICAgICAgICAgQGlmIChzdWJtaXR0aW5nKCkpIHtcbiAgICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJkb3RzXCIgLz5cbiAgICAgICAgICAgICAgJm5ic3A7e3sgdCgnc3VibWl0dGluZycpIH19XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAge3sgdCgnc3VibWl0JykgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDwhLS0gUmVzdWx0YWRvcyAtLT5cbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiBzdW1tYXJ5TGFiZWwoKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICcnLCBib2xkOiB0cnVlIH1cIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW1wb3J0LXJlc3VsdHNcIj5cbiAgICAgICAgICBAZm9yIChyIG9mIHJlc3VsdHMoKSEucmVzdWx0czsgdHJhY2sgci5lbWFpbCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltcG9ydC1yb3cgaW1wb3J0LXJvdy0te3sgci5zdGF0dXMgfX1cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbXBvcnQtcm93X19lbWFpbFwiPnt7IHIuZW1haWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW1wb3J0LXJvd19fc3RhdHVzXCI+e3sgc3RhdHVzTGFiZWwocikgfX08L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoci5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImltcG9ydC1yb3dfX3JlYXNvblwiPnt7IHIucmVhc29uIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW1wb3J0LWFjdGlvbnNcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGZpbGw9XCJvdXRsaW5lXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cInJlc2V0KClcIj5cbiAgICAgICAgICAgIHt7IHQoJ2FnYWluJykgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIHZhbC1kaXNwbGF5IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICAgIH1cbiAgICAgIHZhbC10aXRsZSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXJvbGVzLWhpbnQge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtc2VjdGlvbiB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDI4cHg7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXNlY3Rpb24gdmFsLXRpdGxlIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtbWV0aG9kLWNhcmRzIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LW1ldGhvZC1jYXJkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGdhcDogNHB4O1xuICAgICAgICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gICAgICAgIGJvcmRlcjogMS41cHggc29saWQgdmFyKC0taW9uLWNvbG9yLWxpZ2h0LXNoYWRlLCAjZDdkOGRhKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0KTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICB0cmFuc2l0aW9uOlxuICAgICAgICAgIGJvcmRlci1jb2xvciAwLjE1cyBlYXNlLFxuICAgICAgICAgIGJhY2tncm91bmQgMC4xNXMgZWFzZTtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtbWV0aG9kLWNhcmQ6aG92ZXIge1xuICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1tZXRob2QtY2FyZC0tYWN0aXZlIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzcwMjZkZik7XG4gICAgICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzcwMjZkZikgNiUsIHZhcigtLWlvbi1jb2xvci1saWdodCkpO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1tZXRob2QtY2FyZF9faWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMS4zNzVyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLXNoYWRlLCAjNmI2ZTc2KTtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgICAgfVxuICAgICAgLmltcG9ydC1tZXRob2QtY2FyZC0tYWN0aXZlIC5pbXBvcnQtbWV0aG9kLWNhcmRfX2ljb24ge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnksICM3MDI2ZGYpO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1tZXRob2QtY2FyZF9fdGl0bGUge1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmspO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1tZXRob2QtY2FyZF9faGludCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgICAgfVxuICAgICAgLmltcG9ydC11cGxvYWRfX2J0biB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTBweCAxNnB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0KTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrKTtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMgZWFzZTtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtdXBsb2FkX19idG46aG92ZXIge1xuICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5LCAjNzAyNmRmKTtcbiAgICAgIH1cbiAgICAgIC5pbXBvcnQtdXBsb2FkX19idG4gaW9uLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXVwbG9hZF9fYnRuIGlucHV0W3R5cGU9J2ZpbGUnXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LWZpbGUtbG9hZGVkIHtcbiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwO1xuICAgICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0tc2hhZGUsICM2YjZlNzYpO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1jc3Yge1xuICAgICAgICAtLWJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1saWdodCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1lcnJvciB7XG4gICAgICAgIG1hcmdpbjogMCAwIDEycHggMDtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXIsICNjMDM5MmIpO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1hY3Rpb25zIHtcbiAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xuICAgICAgfVxuICAgICAgLmltcG9ydC1yZXN1bHRzIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICAgIG1hcmdpbjogMTJweCAwO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1yb3cge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciBhdXRvO1xuICAgICAgICBncmlkLXJvdy1nYXA6IDJweDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1saWdodCk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXJvdy0tY3JlYXRlZCB7XG4gICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS1pb24tY29sb3Itc3VjY2VzcywgIzJkZDM2Zik7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXJvdy0tYXNzaWduZWQge1xuICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnksICM3MDI2ZGYpO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1yb3ctLXNraXBwZWQge1xuICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXJvdy0tZXJyb3Ige1xuICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhbmdlciwgI2MwMzkyYik7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXJvd19fZW1haWwge1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmspO1xuICAgICAgfVxuICAgICAgLmltcG9ydC1yb3dfX3N0YXR1cyB7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bS1zaGFkZSwgIzZiNmU3Nik7XG4gICAgICB9XG4gICAgICAuaW1wb3J0LXJvd19fcmVhc29uIHtcbiAgICAgICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhbmdlciwgI2MwMzkyYik7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVtYmVySW1wb3J0TW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIG9yZ1NlcnZpY2UgPSBpbmplY3QoT3JnU2VydmljZSk7XG5cbiAgLyoqIE9yZyBkZXN0aW5vIGRlbCBpbXBvcnQuICovXG4gIEBJbnB1dCgpIG9yZ0lkID0gJyc7XG5cbiAgLyoqIE5vbWJyZXMgZGUgcm9sZXMgZGlzcG9uaWJsZXMgKHBhcmEgZWwgaGludCkuIE9wY2lvbmFsLiAqL1xuICBASW5wdXQoKSBhdmFpbGFibGVSb2xlczogc3RyaW5nW10gPSBbXTtcblxuICAvKiogQ2FsbGJhY2sgdHJhcyB1bmEgaW1wb3J0YWNpw7NuIGV4aXRvc2EgKOKJpTEgZmlsYSBwcm9jZXNhZGEpIOKAlCByZWZyZXNjYSBsYSBsaXN0YS4gKi9cbiAgQElucHV0KCkgb25TdWNjZXNzPzogKCkgPT4gdm9pZDtcblxuICAvKiogSW55ZWN0YWRvIHBvciBgTW9kYWxTZXJ2aWNlLm9wZW5gLiAqL1xuICBASW5wdXQoKSBfbW9kYWxSZWY/OiB7IGRpc21pc3M6IChkYXRhPzogdW5rbm93biwgcm9sZT86IHN0cmluZykgPT4gdm9pZCB9O1xuXG4gIC8qKiBOYW1lc3BhY2UgaTE4bi4gKi9cbiAgQElucHV0KCkgaTE4bk5hbWVzcGFjZSA9IERFRkFVTFRfTkFNRVNQQUNFO1xuXG4gIGNzdiA9ICcnO1xuXG4gIHJlYWRvbmx5IGltcG9ydE1vZGUgPSBzaWduYWw8J2ZpbGUnIHwgJ3Bhc3RlJz4oJ2ZpbGUnKTtcblxuICByZWFkb25seSBvbkNvbmZsaWN0Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCdhc3NpZ25Sb2xlJyk7XG4gIHJlYWRvbmx5IHNlbmRBY3RpdmF0aW9uQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbDxib29sZWFuPih0cnVlKTtcblxuICByZWFkb25seSBjb25mbGljdFJhZGlvUHJvcHMgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgY29udHJvbDogdGhpcy5vbkNvbmZsaWN0Q29udHJvbCBhcyBGb3JtQ29udHJvbCxcbiAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICB0eXBlOiBJbnB1dFR5cGUuUkFESU8sXG4gICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgIHsgaWQ6ICdhc3NpZ25Sb2xlJywgbmFtZTogdGhpcy50KCdjb25mbGljdEFzc2lnbicpLCBvcmRlcjogMCB9LFxuICAgICAgICAgIHsgaWQ6ICdza2lwJywgbmFtZTogdGhpcy50KCdjb25mbGljdFNraXAnKSwgb3JkZXI6IDEgfSxcbiAgICAgICAgICB7IGlkOiAnZXJyb3InLCBuYW1lOiB0aGlzLnQoJ2NvbmZsaWN0RXJyb3InKSwgb3JkZXI6IDIgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pIGFzIElucHV0TWV0YWRhdGFcbiAgKTtcblxuICByZWFkb25seSBzZW5kQWN0aXZhdGlvblByb3BzID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgICh7XG4gICAgICAgIGNvbnRyb2w6IHRoaXMuc2VuZEFjdGl2YXRpb25Db250cm9sIGFzIEZvcm1Db250cm9sLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdzZW5kQWN0aXZhdGlvbicpLFxuICAgICAgICB0eXBlOiBJbnB1dFR5cGUuQ0hFQ0ssXG4gICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgbGFiZWxQbGFjZW1lbnQ6ICdlbmQnLFxuICAgICAgfSkgYXMgSW5wdXRNZXRhZGF0YVxuICApO1xuXG4gIHJlYWRvbmx5IHN1Ym1pdHRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBlcnJvck1zZyA9IHNpZ25hbCgnJyk7XG4gIHJlYWRvbmx5IHJlc3VsdHMgPSBzaWduYWw8SW1wb3J0TWVtYmVyc1Jlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBOb21icmUgZGVsIGFyY2hpdm8gQ1NWIGNhcmdhZG8gKHZhY8OtbyBzaSBzZSBwZWfDsyBtYW51YWxtZW50ZSkuICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lID0gc2lnbmFsKCcnKTtcblxuICByZWFkb25seSByb2xlc0hpbnQgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuYXZhaWxhYmxlUm9sZXMubGVuZ3RoID8gYCR7dGhpcy50KCdyb2xlc0F2YWlsYWJsZScpfSAke3RoaXMuYXZhaWxhYmxlUm9sZXMuam9pbignLCAnKX1gIDogJydcbiAgKTtcblxuICByZWFkb25seSBzdW1tYXJ5TGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcyA9IHRoaXMucmVzdWx0cygpPy5zdW1tYXJ5O1xuICAgIGlmICghcykgcmV0dXJuIHRoaXMudCgnc3VtbWFyeScpO1xuICAgIHJldHVybiBgJHt0aGlzLnQoJ3N1bW1hcnknKX06ICR7cy5jcmVhdGVkfSAke3RoaXMudCgnY3JlYXRlZCcpfSDCtyAke3MuYXNzaWduZWR9ICR7dGhpcy50KFxuICAgICAgJ2Fzc2lnbmVkJ1xuICAgICl9IMK3ICR7cy5za2lwcGVkfSAke3RoaXMudCgnc2tpcHBlZCcpfSDCtyAke3MuZmFpbGVkfSAke3RoaXMudCgnZmFpbGVkJyl9YDtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKERFRkFVTFRfTkFNRVNQQUNFKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyQ29udGVudChERUZBVUxUX05BTUVTUEFDRSwgTUVNQkVSX0lNUE9SVF9NT0RBTF9JMThOKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UodGhpcy5pMThuTmFtZXNwYWNlKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyQ29udGVudCh0aGlzLmkxOG5OYW1lc3BhY2UsIE1FTUJFUl9JTVBPUlRfTU9EQUxfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhcmdhIHVuIGFyY2hpdm8gQ1NWIHNlbGVjY2lvbmFkbzogbGVlIHN1IHRleHRvIGFsIHRleHRhcmVhIChgY3N2YCkuICovXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgdGhpcy5lcnJvck1zZy5zZXQoJycpO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIHRoaXMuY3N2ID0gU3RyaW5nKHJlYWRlci5yZXN1bHQgPz8gJycpO1xuICAgICAgdGhpcy5maWxlTmFtZS5zZXQoZmlsZS5uYW1lKTtcbiAgICB9O1xuICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4gdGhpcy5lcnJvck1zZy5zZXQodGhpcy50KCdmaWxlUmVhZEVycm9yJykpO1xuICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuICAgIC8vIFBlcm1pdGUgcmUtc2VsZWNjaW9uYXIgZWwgbWlzbW8gYXJjaGl2byAoZWwgY2hhbmdlIG5vIGRpc3BhcmEgc2kgbm8gc2UgbGltcGlhKS5cbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgLyoqIFBhcnNlYSBlbCBDU1YgcGVnYWRvIGEgZmlsYXMge2VtYWlsLG5hbWUscm9sZU5hbWV9LiBUb2xlcmEgaGVhZGVyLiAqL1xuICBwcml2YXRlIHBhcnNlQ3N2KCk6IEltcG9ydFVzZXJSb3dbXSB7XG4gICAgY29uc3Qgcm93czogSW1wb3J0VXNlclJvd1tdID0gW107XG4gICAgZm9yIChjb25zdCByYXcgb2YgdGhpcy5jc3Yuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgICAgY29uc3QgbGluZSA9IHJhdy50cmltKCk7XG4gICAgICBpZiAoIWxpbmUpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY29scyA9IGxpbmUuc3BsaXQoJywnKS5tYXAoYyA9PiBjLnRyaW0oKSk7XG4gICAgICBjb25zdCBlbWFpbCA9IChjb2xzWzBdID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgLy8gU2FsdGFyIGhlYWRlciAocHJpbWVyYSBjb2wgXCJlbWFpbFwiKSBvIGzDrW5lYXMgc2luIEAuXG4gICAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSBjb250aW51ZTtcbiAgICAgIHJvd3MucHVzaCh7IGVtYWlsLCBuYW1lOiBjb2xzWzFdID8/ICcnLCByb2xlTmFtZTogY29sc1syXSA/PyAnJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBzdWJtaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lcnJvck1zZy5zZXQoJycpO1xuICAgIGNvbnN0IHVzZXJzID0gdGhpcy5wYXJzZUNzdigpO1xuICAgIGlmICh1c2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZXJyb3JNc2cuc2V0KHRoaXMudCgnbm9Sb3dzJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodXNlcnMuc29tZSh1ID0+ICF1LnJvbGVOYW1lKSkge1xuICAgICAgdGhpcy5lcnJvck1zZy5zZXQodGhpcy50KCdwYXJzZUVycm9yJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3VibWl0dGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5vcmdTZXJ2aWNlXG4gICAgICAuaW1wb3J0TWVtYmVycyh0aGlzLm9yZ0lkLCB7XG4gICAgICAgIHVzZXJzLFxuICAgICAgICBvbkNvbmZsaWN0OiAodGhpcy5vbkNvbmZsaWN0Q29udHJvbC52YWx1ZSA/PyAnYXNzaWduUm9sZScpIGFzIEltcG9ydE9uQ29uZmxpY3QsXG4gICAgICAgIHNlbmRBY3RpdmF0aW9uOiB0aGlzLnNlbmRBY3RpdmF0aW9uQ29udHJvbC52YWx1ZSA/PyB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgIHRoaXMuc3VibWl0dGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMucmVzdWx0cy5zZXQocmVzKTtcbiAgICAgICAgICAvLyBSZWZyZXNjYXIgbGlzdGEgZGVsIGNvbnN1bWVyIHNpIGh1Ym8gYWx0YXMvYXNpZ25hY2lvbmVzIGVmZWN0aXZhcy5cbiAgICAgICAgICBpZiAocmVzLnN1bW1hcnkuY3JlYXRlZCArIHJlcy5zdW1tYXJ5LmFzc2lnbmVkID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3M/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgdGhpcy5zdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5lcnJvck1zZy5zZXQoZXJyPy5lcnJvcj8ubWVzc2FnZSA/PyB0aGlzLnQoJ2dlbmVyaWNFcnJvcicpKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgc3RhdHVzTGFiZWwocjogSW1wb3J0Um93UmVzdWx0KTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy50KHIuc3RhdHVzID09PSAnZXJyb3InID8gJ2ZhaWxlZCcgOiByLnN0YXR1cyk7XG4gICAgaWYgKHIuc3RhdHVzID09PSAnY3JlYXRlZCcgJiYgci5hY3RpdmF0aW9uKSB7XG4gICAgICByZXR1cm4gYCR7YmFzZX0gwrcgJHt0aGlzLnQoci5hY3RpdmF0aW9uID09PSAnc2VudCcgPyAnYWN0aXZhdGlvblNlbnQnIDogJ2FjdGl2YXRpb25QZW5kaW5nJyl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNzdiA9ICcnO1xuICAgIHRoaXMuZmlsZU5hbWUuc2V0KCcnKTtcbiAgICB0aGlzLmVycm9yTXNnLnNldCgnJyk7XG4gICAgdGhpcy5yZXN1bHRzLnNldChudWxsKTtcbiAgICB0aGlzLmltcG9ydE1vZGUuc2V0KCdmaWxlJyk7XG4gIH1cblxuICBkaXNtaXNzKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsUmVmPy5kaXNtaXNzKG51bGwsICdjYW5jZWwnKTtcbiAgfVxuXG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIHRoaXMuaTE4bk5hbWVzcGFjZSk7XG4gIH1cbn1cbiJdfQ==