@seniorsistemas/components-ai 2.4.0 → 2.4.1

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,6 +1,6 @@
1
1
  import { Component, ViewChild } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import { ReactiveFormsModule, FormsModule } from '@angular/forms';
3
+ import { FormsModule } from '@angular/forms';
4
4
  import { InputMaskModule } from 'primeng/inputmask';
5
5
  import { CalendarModule } from 'primeng/calendar';
6
6
  import { ButtonModule } from 'primeng/button';
@@ -10,16 +10,24 @@ import { DynamicFieldBaseComponent } from './dynamic-field-base.component';
10
10
  import * as i0 from "@angular/core";
11
11
  import * as i1 from "../../../services/translation.service";
12
12
  import * as i2 from "../../../services/locale.service";
13
- import * as i3 from "@angular/forms";
14
- import * as i4 from "primeng/inputmask";
15
- import * as i5 from "primeng/calendar";
16
- import * as i6 from "primeng/button";
17
- import * as i7 from "primeng/tooltip";
13
+ import * as i3 from "@angular/common";
14
+ import * as i4 from "@angular/forms";
15
+ import * as i5 from "primeng/inputmask";
16
+ import * as i6 from "primeng/calendar";
17
+ import * as i7 from "primeng/button";
18
+ import * as i8 from "primeng/tooltip";
18
19
  const DATE_MASK_CONFIGS = {
19
20
  'pt-BR': { mask: '99/99/9999', placeholder: 'dd/mm/aaaa', format: 'dmy' },
20
21
  'en-US': { mask: '99/99/9999', placeholder: 'mm/dd/yyyy', format: 'mdy' },
21
22
  'es-ES': { mask: '99/99/9999', placeholder: 'dd/mm/aaaa', format: 'dmy' }
22
23
  };
24
+ /**
25
+ * DynamicFieldDateComponent
26
+ *
27
+ * O FormControl.value SEMPRE armazena a data no formato ISO: "yyyy-MM-dd" (ex: "2026-05-18").
28
+ * A variável `displayValue` mantém o valor formatado no locale do usuário para exibição no input.
29
+ * Isso garante que qualquer componente que acesse form.value receba o valor pronto para o backend.
30
+ */
23
31
  export class DynamicFieldDateComponent extends DynamicFieldBaseComponent {
24
32
  localeService;
25
33
  cdr;
@@ -27,9 +35,14 @@ export class DynamicFieldDateComponent extends DynamicFieldBaseComponent {
27
35
  currentDateFormat = 'dd/mm/yy';
28
36
  dateMask = '99/99/9999';
29
37
  calendarValue = null;
38
+ /** Valor de exibição no formato locale (ex: "18/05/2026" para pt-BR) */
39
+ displayValue = null;
40
+ /** Controla a renderização do p-calendar (só existe no DOM quando necessário) */
41
+ showCalendar = false;
30
42
  langSub;
31
43
  valueSub;
32
44
  currentLocale = 'pt-BR';
45
+ updatingFromControl = false;
33
46
  constructor(translationService, localeService, cdr) {
34
47
  super(translationService);
35
48
  this.localeService = localeService;
@@ -38,71 +51,163 @@ export class DynamicFieldDateComponent extends DynamicFieldBaseComponent {
38
51
  ngOnInit() {
39
52
  this.currentLocale = this.translationService.getCurrentLanguage();
40
53
  this.updateDateFormat();
41
- this.initializeValue();
42
- this.langSub = this.translationService.currentLanguage$.subscribe((lang) => {
43
- this.currentLocale = lang;
44
- this.updateDateFormat();
45
- this.convertValueToNewLocale();
46
- });
47
54
  const control = this.form.get(this.field.field);
48
55
  if (control) {
56
+ // Inicializar displayValue a partir do valor ISO do control
57
+ this.syncDisplayFromControl(control.value);
58
+ // Observar mudanças externas no control (patchValue, setValue)
49
59
  this.valueSub = control.valueChanges.subscribe(value => {
50
- if (value instanceof Date) {
51
- control.setValue(this.dateToString(value), { emitEvent: false });
60
+ if (this.updatingFromControl) {
61
+ return;
52
62
  }
63
+ this.syncDisplayFromControl(value);
53
64
  });
54
65
  }
66
+ this.langSub = this.translationService.currentLanguage$.subscribe((lang) => {
67
+ this.currentLocale = lang;
68
+ this.updateDateFormat();
69
+ // Re-formatar o display com o novo locale
70
+ const ctrl = this.form.get(this.field.field);
71
+ if (ctrl) {
72
+ this.syncDisplayFromControl(ctrl.value);
73
+ }
74
+ });
55
75
  }
56
76
  ngOnDestroy() {
57
77
  this.langSub?.unsubscribe();
58
78
  this.valueSub?.unsubscribe();
59
79
  }
60
- initializeValue() {
61
- const control = this.form.get(this.field.field);
62
- if (control?.value instanceof Date) {
63
- control.setValue(this.dateToString(control.value), { emitEvent: false });
80
+ /**
81
+ * Sincroniza o displayValue a partir do valor ISO do FormControl.
82
+ * Aceita: "yyyy-MM-dd", Date, locale string "dd/MM/yyyy", ou null.
83
+ */
84
+ syncDisplayFromControl(value) {
85
+ if (!value) {
86
+ this.displayValue = null;
87
+ return;
88
+ }
89
+ if (value instanceof Date) {
90
+ // Converte Date para ISO no control e atualiza display
91
+ const iso = this.dateToIso(value);
92
+ this.setControlValue(iso);
93
+ this.displayValue = this.isoToLocale(iso);
94
+ return;
95
+ }
96
+ const s = String(value);
97
+ // Já está em formato ISO (yyyy-MM-dd)
98
+ if (s.match(/^\d{4}-\d{2}-\d{2}/)) {
99
+ const isoDate = s.substring(0, 10);
100
+ this.displayValue = this.isoToLocale(isoDate);
101
+ return;
102
+ }
103
+ // Está em formato locale (dd/MM/yyyy ou MM/dd/yyyy)
104
+ if (s.match(/^\d{2}\/\d{2}\/\d{4}$/)) {
105
+ const iso = this.localeToIso(s);
106
+ if (iso) {
107
+ this.setControlValue(iso);
108
+ this.displayValue = s;
109
+ }
110
+ else {
111
+ this.displayValue = s;
112
+ }
113
+ return;
64
114
  }
115
+ // Valor incompleto ou com máscara
116
+ this.displayValue = s.includes('_') ? null : null;
65
117
  }
66
- updateDateFormat() {
67
- const config = DATE_MASK_CONFIGS[this.currentLocale] || DATE_MASK_CONFIGS['pt-BR'];
68
- this.dateMask = config.mask;
69
- this.currentDateFormat = this.field?.dateFormat || this.localeService.getPrimeNGDateFormat();
118
+ /** Chamado quando o usuário completa a digitação da máscara */
119
+ onDisplayValueComplete() {
120
+ this.syncControlFromDisplay();
121
+ }
122
+ /** Chamado quando o input perde foco */
123
+ onDisplayValueBlur() {
124
+ this.syncControlFromDisplay();
70
125
  }
71
- convertValueToNewLocale() {
126
+ /**
127
+ * Converte o displayValue (locale) para ISO e seta no FormControl.
128
+ */
129
+ syncControlFromDisplay() {
72
130
  const control = this.form.get(this.field.field);
73
- if (control?.value && typeof control.value === 'string' && !control.value.includes('_')) {
74
- const date = this.stringToDate(control.value);
75
- if (date) {
76
- control.setValue(this.dateToString(date), { emitEvent: false });
77
- }
131
+ if (!control) {
132
+ return;
133
+ }
134
+ if (!this.displayValue || this.displayValue.includes('_')) {
135
+ this.setControlValue(null);
136
+ control.markAsDirty();
137
+ return;
138
+ }
139
+ const iso = this.localeToIso(this.displayValue);
140
+ if (iso) {
141
+ this.setControlValue(iso);
142
+ control.markAsDirty();
78
143
  }
79
144
  }
80
- dateToString(date) {
81
- const day = String(date.getDate()).padStart(2, '0');
82
- const month = String(date.getMonth() + 1).padStart(2, '0');
83
- const year = String(date.getFullYear());
145
+ /** Seta o valor no control sem disparar o subscriber interno */
146
+ setControlValue(value) {
147
+ const control = this.form.get(this.field.field);
148
+ if (!control) {
149
+ return;
150
+ }
151
+ this.updatingFromControl = true;
152
+ control.setValue(value, { emitEvent: true });
153
+ this.updatingFromControl = false;
154
+ }
155
+ // ==================== CONVERSÕES ====================
156
+ /** Converte ISO "yyyy-MM-dd" para locale string */
157
+ isoToLocale(iso) {
158
+ const [year, month, day] = iso.split('-');
84
159
  const config = DATE_MASK_CONFIGS[this.currentLocale] || DATE_MASK_CONFIGS['pt-BR'];
85
160
  return config.format === 'mdy' ? `${month}/${day}/${year}` : `${day}/${month}/${year}`;
86
161
  }
87
- stringToDate(value) {
88
- if (!value || value.includes('_'))
89
- return null;
90
- const parts = value.split('/');
91
- if (parts.length !== 3)
162
+ /** Converte locale string para ISO "yyyy-MM-dd" */
163
+ localeToIso(locale) {
164
+ const parts = locale.split('/');
165
+ if (parts.length !== 3) {
92
166
  return null;
167
+ }
93
168
  const config = DATE_MASK_CONFIGS[this.currentLocale] || DATE_MASK_CONFIGS['pt-BR'];
94
- const [p0, p1, p2] = parts.map(p => parseInt(p, 10));
169
+ const [p0, p1, p2] = parts;
95
170
  const [day, month, year] = config.format === 'mdy' ? [p1, p0, p2] : [p0, p1, p2];
96
- if (isNaN(day) || isNaN(month) || isNaN(year) || month < 1 || month > 12 || day < 1 || day > 31)
171
+ const d = parseInt(day, 10);
172
+ const m = parseInt(month, 10);
173
+ const y = parseInt(year, 10);
174
+ if (isNaN(d) || isNaN(m) || isNaN(y) || m < 1 || m > 12 || d < 1 || d > 31) {
175
+ return null;
176
+ }
177
+ return `${year}-${month}-${day}`;
178
+ }
179
+ /** Converte Date para ISO "yyyy-MM-dd" */
180
+ dateToIso(date) {
181
+ const day = String(date.getDate()).padStart(2, '0');
182
+ const month = String(date.getMonth() + 1).padStart(2, '0');
183
+ const year = String(date.getFullYear());
184
+ return `${year}-${month}-${day}`;
185
+ }
186
+ /** Converte locale string para Date */
187
+ localeToDate(value) {
188
+ const iso = this.localeToIso(value);
189
+ if (!iso) {
97
190
  return null;
191
+ }
192
+ const [year, month, day] = iso.split('-').map(p => parseInt(p, 10));
98
193
  const date = new Date(year, month - 1, day);
99
194
  return isNaN(date.getTime()) ? null : date;
100
195
  }
196
+ // ==================== CALENDAR ====================
197
+ updateDateFormat() {
198
+ const config = DATE_MASK_CONFIGS[this.currentLocale] || DATE_MASK_CONFIGS['pt-BR'];
199
+ this.dateMask = config.mask;
200
+ this.currentDateFormat = this.field?.dateFormat || this.localeService.getPrimeNGDateFormat();
201
+ }
101
202
  toggleCalendar(event) {
102
203
  event.stopPropagation();
103
- const control = this.form.get(this.field.field);
104
- this.calendarValue = control?.value ? this.stringToDate(control.value) : new Date();
105
- // Simular clique no input do calendar para abrir o overlay
204
+ if (this.displayValue && !this.displayValue.includes('_')) {
205
+ this.calendarValue = this.localeToDate(this.displayValue);
206
+ }
207
+ else {
208
+ this.calendarValue = new Date();
209
+ }
210
+ this.showCalendar = true;
106
211
  setTimeout(() => {
107
212
  if (this.calendarPicker && this.calendarPicker.inputfieldViewChild) {
108
213
  this.calendarPicker.inputfieldViewChild.nativeElement.click();
@@ -110,39 +215,53 @@ export class DynamicFieldDateComponent extends DynamicFieldBaseComponent {
110
215
  });
111
216
  }
112
217
  onCalendarSelect(date) {
113
- const control = this.form.get(this.field.field);
114
- if (control && date) {
115
- control.setValue(this.dateToString(date));
116
- control.markAsDirty();
218
+ if (date) {
219
+ const iso = this.dateToIso(date);
220
+ this.displayValue = this.isoToLocale(iso);
221
+ this.setControlValue(iso);
222
+ const control = this.form.get(this.field.field);
223
+ if (control) {
224
+ control.markAsDirty();
225
+ }
117
226
  }
118
227
  }
119
228
  onCalendarClear() {
229
+ this.displayValue = null;
230
+ this.setControlValue(null);
120
231
  const control = this.form.get(this.field.field);
121
232
  if (control) {
122
- control.setValue(null);
123
233
  control.markAsDirty();
124
234
  }
125
235
  }
236
+ isControlDisabled() {
237
+ const control = this.form.get(this.field.field);
238
+ return control ? control.disabled : false;
239
+ }
126
240
  getPlaceholder() {
127
- if (this.field.placeholder)
241
+ if (this.field.placeholder) {
128
242
  return this.field.placeholder;
243
+ }
129
244
  return DATE_MASK_CONFIGS[this.currentLocale]?.placeholder || 'dd/mm/aaaa';
130
245
  }
131
246
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDateComponent, deps: [{ token: i1.TranslationService }, { token: i2.LocaleService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
132
247
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFieldDateComponent, isStandalone: true, selector: "sia-dynamic-field-date", viewQueries: [{ propertyName: "calendarPicker", first: true, predicate: ["calendarPicker"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
133
248
  <sia-dynamic-field-wrapper [field]="field" [form]="form" [mode]="mode">
134
- <div [formGroup]="form" class="date-field">
249
+ <div class="date-field">
135
250
  <div class="date-input-group">
136
251
  <p-inputmask
137
252
  [inputId]="field.field"
138
- [formControlName]="field.field"
253
+ [(ngModel)]="displayValue"
254
+ [ngModelOptions]="{standalone: true}"
139
255
  [mask]="dateMask"
140
256
  [placeholder]="getPlaceholder()"
141
257
  slotChar="_"
142
258
  [autoClear]="false"
143
259
  styleClass="date-input"
144
260
  [class.ng-invalid]="isFieldInvalid()"
145
- [class.ng-dirty]="isFieldDirty()">
261
+ [class.ng-dirty]="isFieldDirty()"
262
+ [disabled]="isControlDisabled()"
263
+ (onComplete)="onDisplayValueComplete()"
264
+ (onBlur)="onDisplayValueBlur()">
146
265
  </p-inputmask>
147
266
  <div class="date-buttons">
148
267
  <p-button
@@ -156,28 +275,31 @@ export class DynamicFieldDateComponent extends DynamicFieldBaseComponent {
156
275
  size="small">
157
276
  </p-button>
158
277
  </div>
278
+ <p-calendar
279
+ *ngIf="showCalendar"
280
+ #calendarPicker
281
+ [(ngModel)]="calendarValue"
282
+ [ngModelOptions]="{standalone: true}"
283
+ [dateFormat]="currentDateFormat"
284
+ [showButtonBar]="true"
285
+ [appendTo]="'body'"
286
+ [inline]="false"
287
+ [showIcon]="false"
288
+ (onSelect)="onCalendarSelect($event)"
289
+ (onClearClick)="onCalendarClear()"
290
+ (onHide)="showCalendar = false"
291
+ styleClass="hidden-calendar-input"
292
+ [style]="{'position': 'absolute', 'width': '0', 'height': '0', 'overflow': 'hidden', 'opacity': '0', 'pointer-events': 'none'}">
293
+ </p-calendar>
159
294
  </div>
160
- <p-calendar
161
- #calendarPicker
162
- [(ngModel)]="calendarValue"
163
- [dateFormat]="currentDateFormat"
164
- [showButtonBar]="true"
165
- [appendTo]="'body'"
166
- [inline]="false"
167
- [showIcon]="false"
168
- (onSelect)="onCalendarSelect($event)"
169
- (onClearClick)="onCalendarClear()"
170
- styleClass="hidden-calendar-input">
171
- </p-calendar>
172
295
  </div>
173
296
  </sia-dynamic-field-wrapper>
174
- `, isInline: true, styles: [".date-field{width:100%;position:relative}.date-input-group{position:relative;width:100%;::ng-deep p-inputmask{width:100%;display:block;input{width:100%;padding-right:2.5rem}}.date-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}::ng-deep .hidden-calendar-input{position:absolute;width:0;height:0;overflow:hidden;opacity:0;pointer-events:none;input{width:0;height:0;padding:0;border:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputMaskModule }, { kind: "component", type: i4.InputMask, selector: "p-inputmask, p-inputMask, p-input-mask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "variant", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autofocus", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i5.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
297
+ `, isInline: true, styles: [".date-field{width:100%;position:relative}.date-input-group{position:relative;width:100%;::ng-deep p-inputmask{width:100%;display:block;input{width:100%;padding-right:2.5rem}}.date-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}.hidden-calendar-input,::ng-deep .hidden-calendar-input{position:absolute!important;width:0!important;height:0!important;overflow:hidden!important;opacity:0!important;pointer-events:none!important;margin:0!important;padding:0!important;border:none!important;top:0;left:0;input{width:0!important;height:0!important;padding:0!important;border:none!important}}>p-calendar{position:absolute!important;width:0!important;height:0!important;overflow:hidden!important;pointer-events:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputMaskModule }, { kind: "component", type: i5.InputMask, selector: "p-inputmask, p-inputMask, p-input-mask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "variant", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autofocus", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i6.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i7.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
175
298
  }
176
299
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDateComponent, decorators: [{
177
300
  type: Component,
178
301
  args: [{ selector: 'sia-dynamic-field-date', standalone: true, imports: [
179
302
  CommonModule,
180
- ReactiveFormsModule,
181
303
  FormsModule,
182
304
  InputMaskModule,
183
305
  CalendarModule,
@@ -186,18 +308,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
186
308
  DynamicFieldWrapperComponent
187
309
  ], template: `
188
310
  <sia-dynamic-field-wrapper [field]="field" [form]="form" [mode]="mode">
189
- <div [formGroup]="form" class="date-field">
311
+ <div class="date-field">
190
312
  <div class="date-input-group">
191
313
  <p-inputmask
192
314
  [inputId]="field.field"
193
- [formControlName]="field.field"
315
+ [(ngModel)]="displayValue"
316
+ [ngModelOptions]="{standalone: true}"
194
317
  [mask]="dateMask"
195
318
  [placeholder]="getPlaceholder()"
196
319
  slotChar="_"
197
320
  [autoClear]="false"
198
321
  styleClass="date-input"
199
322
  [class.ng-invalid]="isFieldInvalid()"
200
- [class.ng-dirty]="isFieldDirty()">
323
+ [class.ng-dirty]="isFieldDirty()"
324
+ [disabled]="isControlDisabled()"
325
+ (onComplete)="onDisplayValueComplete()"
326
+ (onBlur)="onDisplayValueBlur()">
201
327
  </p-inputmask>
202
328
  <div class="date-buttons">
203
329
  <p-button
@@ -211,24 +337,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
211
337
  size="small">
212
338
  </p-button>
213
339
  </div>
340
+ <p-calendar
341
+ *ngIf="showCalendar"
342
+ #calendarPicker
343
+ [(ngModel)]="calendarValue"
344
+ [ngModelOptions]="{standalone: true}"
345
+ [dateFormat]="currentDateFormat"
346
+ [showButtonBar]="true"
347
+ [appendTo]="'body'"
348
+ [inline]="false"
349
+ [showIcon]="false"
350
+ (onSelect)="onCalendarSelect($event)"
351
+ (onClearClick)="onCalendarClear()"
352
+ (onHide)="showCalendar = false"
353
+ styleClass="hidden-calendar-input"
354
+ [style]="{'position': 'absolute', 'width': '0', 'height': '0', 'overflow': 'hidden', 'opacity': '0', 'pointer-events': 'none'}">
355
+ </p-calendar>
214
356
  </div>
215
- <p-calendar
216
- #calendarPicker
217
- [(ngModel)]="calendarValue"
218
- [dateFormat]="currentDateFormat"
219
- [showButtonBar]="true"
220
- [appendTo]="'body'"
221
- [inline]="false"
222
- [showIcon]="false"
223
- (onSelect)="onCalendarSelect($event)"
224
- (onClearClick)="onCalendarClear()"
225
- styleClass="hidden-calendar-input">
226
- </p-calendar>
227
357
  </div>
228
358
  </sia-dynamic-field-wrapper>
229
- `, styles: [".date-field{width:100%;position:relative}.date-input-group{position:relative;width:100%;::ng-deep p-inputmask{width:100%;display:block;input{width:100%;padding-right:2.5rem}}.date-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}::ng-deep .hidden-calendar-input{position:absolute;width:0;height:0;overflow:hidden;opacity:0;pointer-events:none;input{width:0;height:0;padding:0;border:none}}\n"] }]
359
+ `, styles: [".date-field{width:100%;position:relative}.date-input-group{position:relative;width:100%;::ng-deep p-inputmask{width:100%;display:block;input{width:100%;padding-right:2.5rem}}.date-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}.hidden-calendar-input,::ng-deep .hidden-calendar-input{position:absolute!important;width:0!important;height:0!important;overflow:hidden!important;opacity:0!important;pointer-events:none!important;margin:0!important;padding:0!important;border:none!important;top:0;left:0;input{width:0!important;height:0!important;padding:0!important;border:none!important}}>p-calendar{position:absolute!important;width:0!important;height:0!important;overflow:hidden!important;pointer-events:none!important}\n"] }]
230
360
  }], ctorParameters: () => [{ type: i1.TranslationService }, { type: i2.LocaleService }, { type: i0.ChangeDetectorRef }], propDecorators: { calendarPicker: [{
231
361
  type: ViewChild,
232
362
  args: ['calendarPicker']
233
363
  }] } });
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC1kYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9maWVsZHMvZHluYW1pYy1maWVsZC1kYXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF3QyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJaEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7OztBQVczRSxNQUFNLGlCQUFpQixHQUE4QztJQUNuRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtJQUN6RSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtJQUN6RSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUss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QyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRVEsY0FBYztRQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDMUQsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsV0FBVyxJQUFJLFlBQVksQ0FBQztJQUM1RSxDQUFDO3dHQXhIVSx5QkFBeUI7NEZBQXpCLHlCQUF5QiwyTkFqSDFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ1QsMjNCQW5EQyxZQUFZLDhCQUNaLG1CQUFtQixtbEJBQ25CLFdBQVcsc1BBQ1gsZUFBZSxxaUJBQ2YsY0FBYyxpekNBQ2QsWUFBWSxpYkFDWixhQUFhLHNYQUNiLDRCQUE0Qjs7NEZBbUhuQix5QkFBeUI7a0JBOUhyQyxTQUFTOytCQUNFLHdCQUF3QixjQUN0QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFdBQVc7d0JBQ1gsZUFBZTt3QkFDZixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osYUFBYTt3QkFDYiw0QkFBNEI7cUJBQzdCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVDttSkF3RTRCLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRNYXNrTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG1hc2snO1xuaW1wb3J0IHsgQ2FsZW5kYXJNb2R1bGUsIENhbGVuZGFyIH0gZnJvbSAncHJpbWVuZy9jYWxlbmRhcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlLCBTdXBwb3J0ZWRMYW5ndWFnZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2xvY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNGaWVsZFdyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQtd3JhcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkQmFzZUNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1maWVsZC1iYXNlLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQ29uZmlndXJhw6fDo28gZGUgbcOhc2NhcmEgZGUgZGF0YSBwb3IgbG9jYWxlXG4gKi9cbmludGVyZmFjZSBEYXRlTWFza0NvbmZpZyB7XG4gIG1hc2s6IHN0cmluZztcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgZm9ybWF0OiAnZG15JyB8ICdtZHknO1xufVxuXG5jb25zdCBEQVRFX01BU0tfQ09ORklHUzogUmVjb3JkPFN1cHBvcnRlZExhbmd1YWdlLCBEYXRlTWFza0NvbmZpZz4gPSB7XG4gICdwdC1CUic6IHsgbWFzazogJzk5Lzk5Lzk5OTknLCBwbGFjZWhvbGRlcjogJ2RkL21tL2FhYWEnLCBmb3JtYXQ6ICdkbXknIH0sXG4gICdlbi1VUyc6IHsgbWFzazogJzk5Lzk5Lzk5OTknLCBwbGFjZWhvbGRlcjogJ21tL2RkL3l5eXknLCBmb3JtYXQ6ICdtZHknIH0sXG4gICdlcy1FUyc6IHsgbWFzazogJzk5Lzk5Lzk5OTknLCBwbGFjZWhvbGRlcjogJ2RkL21tL2FhYWEnLCBmb3JtYXQ6ICdkbXknIH1cbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpYS1keW5hbWljLWZpZWxkLWRhdGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgSW5wdXRNYXNrTW9kdWxlLFxuICAgIENhbGVuZGFyTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIER5bmFtaWNGaWVsZFdyYXBwZXJDb21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c2lhLWR5bmFtaWMtZmllbGQtd3JhcHBlciBbZmllbGRdPVwiZmllbGRcIiBbZm9ybV09XCJmb3JtXCIgW21vZGVdPVwibW9kZVwiPlxuICAgICAgPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImRhdGUtZmllbGRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8cC1pbnB1dG1hc2tcbiAgICAgICAgICAgIFtpbnB1dElkXT1cImZpZWxkLmZpZWxkXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQuZmllbGRcIlxuICAgICAgICAgICAgW21hc2tdPVwiZGF0ZU1hc2tcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyKClcIlxuICAgICAgICAgICAgc2xvdENoYXI9XCJfXCJcbiAgICAgICAgICAgIFthdXRvQ2xlYXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgc3R5bGVDbGFzcz1cImRhdGUtaW5wdXRcIlxuICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiaXNGaWVsZEludmFsaWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiaXNGaWVsZERpcnR5KClcIj5cbiAgICAgICAgICA8L3AtaW5wdXRtYXNrPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2FsZW5kYXJcIlxuICAgICAgICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBUb29sdGlwPVwiQWJyaXIgY2FsZW5kw6FyaW9cIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIj5cbiAgICAgICAgICAgIDwvcC1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1jYWxlbmRhclxuICAgICAgICAgICNjYWxlbmRhclBpY2tlclxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY2FsZW5kYXJWYWx1ZVwiXG4gICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY3VycmVudERhdGVGb3JtYXRcIlxuICAgICAgICAgIFtzaG93QnV0dG9uQmFyXT1cInRydWVcIlxuICAgICAgICAgIFthcHBlbmRUb109XCInYm9keSdcIlxuICAgICAgICAgIFtpbmxpbmVdPVwiZmFsc2VcIlxuICAgICAgICAgIFtzaG93SWNvbl09XCJmYWxzZVwiXG4gICAgICAgICAgKG9uU2VsZWN0KT1cIm9uQ2FsZW5kYXJTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgKG9uQ2xlYXJDbGljayk9XCJvbkNhbGVuZGFyQ2xlYXIoKVwiXG4gICAgICAgICAgc3R5bGVDbGFzcz1cImhpZGRlbi1jYWxlbmRhci1pbnB1dFwiPlxuICAgICAgICA8L3AtY2FsZW5kYXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NpYS1keW5hbWljLWZpZWxkLXdyYXBwZXI+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAuZGF0ZS1maWVsZCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG5cbiAgICAuZGF0ZS1pbnB1dC1ncm91cCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgOjpuZy1kZWVwIHAtaW5wdXRtYXNrIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuXG4gICAgICAgIGlucHV0IHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyLjVyZW07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmRhdGUtYnV0dG9ucyB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDRweDtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgfVxuXG4gICAgICA6Om5nLWRlZXAgLnAtYnV0dG9uIHtcbiAgICAgICAgd2lkdGg6IDJyZW0gIWltcG9ydGFudDtcbiAgICAgICAgaGVpZ2h0OiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIG1pbi13aWR0aDogMnJlbSAhaW1wb3J0YW50O1xuICAgICAgICBtaW4taGVpZ2h0OiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICAgICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG5cbiAgICAgICAgLnAtYnV0dG9uLWljb24ge1xuICAgICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW0gIWltcG9ydGFudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wLWJ1dHRvbi1sYWJlbCB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgOjpuZy1kZWVwIC5oaWRkZW4tY2FsZW5kYXItaW5wdXQge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgd2lkdGg6IDA7XG4gICAgICBoZWlnaHQ6IDA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gICAgICBpbnB1dCB7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIH1cbiAgICB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGaWVsZERhdGVDb21wb25lbnQgZXh0ZW5kcyBEeW5hbWljRmllbGRCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdjYWxlbmRhclBpY2tlcicpIGNhbGVuZGFyUGlja2VyITogQ2FsZW5kYXI7XG4gIFxuICBjdXJyZW50RGF0ZUZvcm1hdCA9ICdkZC9tbS95eSc7XG4gIGRhdGVNYXNrID0gJzk5Lzk5Lzk5OTknO1xuICBjYWxlbmRhclZhbHVlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIFxuICBwcml2YXRlIGxhbmdTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgdmFsdWVTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgY3VycmVudExvY2FsZTogU3VwcG9ydGVkTGFuZ3VhZ2UgPSAncHQtQlInO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIodHJhbnNsYXRpb25TZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRMYW5ndWFnZSgpO1xuICAgIHRoaXMudXBkYXRlRGF0ZUZvcm1hdCgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVZhbHVlKCk7XG4gICAgXG4gICAgdGhpcy5sYW5nU3ViID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuY3VycmVudExhbmd1YWdlJC5zdWJzY3JpYmUoKGxhbmcpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IGxhbmc7XG4gICAgICB0aGlzLnVwZGF0ZURhdGVGb3JtYXQoKTtcbiAgICAgIHRoaXMuY29udmVydFZhbHVlVG9OZXdMb2NhbGUoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuZmllbGQpO1xuICAgIGlmIChjb250cm9sKSB7XG4gICAgICB0aGlzLnZhbHVlU3ViID0gY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodGhpcy5kYXRlVG9TdHJpbmcodmFsdWUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubGFuZ1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnZhbHVlU3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgaWYgKGNvbnRyb2w/LnZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgY29udHJvbC5zZXRWYWx1ZSh0aGlzLmRhdGVUb1N0cmluZyhjb250cm9sLnZhbHVlKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0ZUZvcm1hdCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBEQVRFX01BU0tfQ09ORklHU1t0aGlzLmN1cnJlbnRMb2NhbGVdIHx8IERBVEVfTUFTS19DT05GSUdTWydwdC1CUiddO1xuICAgIHRoaXMuZGF0ZU1hc2sgPSBjb25maWcubWFzaztcbiAgICB0aGlzLmN1cnJlbnREYXRlRm9ybWF0ID0gdGhpcy5maWVsZD8uZGF0ZUZvcm1hdCB8fCB0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0UHJpbWVOR0RhdGVGb3JtYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFZhbHVlVG9OZXdMb2NhbGUoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgaWYgKGNvbnRyb2w/LnZhbHVlICYmIHR5cGVvZiBjb250cm9sLnZhbHVlID09PSAnc3RyaW5nJyAmJiAhY29udHJvbC52YWx1ZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5zdHJpbmdUb0RhdGUoY29udHJvbC52YWx1ZSk7XG4gICAgICBpZiAoZGF0ZSkge1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKHRoaXMuZGF0ZVRvU3RyaW5nKGRhdGUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgeWVhciA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgIGNvbnN0IGNvbmZpZyA9IERBVEVfTUFTS19DT05GSUdTW3RoaXMuY3VycmVudExvY2FsZV0gfHwgREFURV9NQVNLX0NPTkZJR1NbJ3B0LUJSJ107XG4gICAgcmV0dXJuIGNvbmZpZy5mb3JtYXQgPT09ICdtZHknID8gYCR7bW9udGh9LyR7ZGF5fS8ke3llYXJ9YCA6IGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XG4gIH1cblxuICBwcml2YXRlIHN0cmluZ1RvRGF0ZSh2YWx1ZTogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIGlmICghdmFsdWUgfHwgdmFsdWUuaW5jbHVkZXMoJ18nKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCgnLycpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbmZpZyA9IERBVEVfTUFTS19DT05GSUdTW3RoaXMuY3VycmVudExvY2FsZV0gfHwgREFURV9NQVNLX0NPTkZJR1NbJ3B0LUJSJ107XG4gICAgY29uc3QgW3AwLCBwMSwgcDJdID0gcGFydHMubWFwKHAgPT4gcGFyc2VJbnQocCwgMTApKTtcbiAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBjb25maWcuZm9ybWF0ID09PSAnbWR5JyA/IFtwMSwgcDAsIHAyXSA6IFtwMCwgcDEsIHAyXTtcbiAgICBpZiAoaXNOYU4oZGF5KSB8fCBpc05hTihtb250aCkgfHwgaXNOYU4oeWVhcikgfHwgbW9udGggPCAxIHx8IG1vbnRoID4gMTIgfHwgZGF5IDwgMSB8fCBkYXkgPiAzMSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcbiAgICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbnVsbCA6IGRhdGU7XG4gIH1cblxuICB0b2dnbGVDYWxlbmRhcihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICB0aGlzLmNhbGVuZGFyVmFsdWUgPSBjb250cm9sPy52YWx1ZSA/IHRoaXMuc3RyaW5nVG9EYXRlKGNvbnRyb2wudmFsdWUpIDogbmV3IERhdGUoKTtcbiAgICBcbiAgICAvLyBTaW11bGFyIGNsaXF1ZSBubyBpbnB1dCBkbyBjYWxlbmRhciBwYXJhIGFicmlyIG8gb3ZlcmxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2FsZW5kYXJQaWNrZXIgJiYgdGhpcy5jYWxlbmRhclBpY2tlci5pbnB1dGZpZWxkVmlld0NoaWxkKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJQaWNrZXIuaW5wdXRmaWVsZFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkNhbGVuZGFyU2VsZWN0KGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICBpZiAoY29udHJvbCAmJiBkYXRlKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKHRoaXMuZGF0ZVRvU3RyaW5nKGRhdGUpKTtcbiAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICB9XG4gIH1cblxuICBvbkNhbGVuZGFyQ2xlYXIoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWVsZC5wbGFjZWhvbGRlcikgcmV0dXJuIHRoaXMuZmllbGQucGxhY2Vob2xkZXI7XG4gICAgcmV0dXJuIERBVEVfTUFTS19DT05GSUdTW3RoaXMuY3VycmVudExvY2FsZV0/LnBsYWNlaG9sZGVyIHx8ICdkZC9tbS9hYWFhJztcbiAgfVxufVxuIl19
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC1kYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9maWVsZHMvZHluYW1pYy1maWVsZC1kYXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF3QyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJaEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7Ozs7QUFXM0UsTUFBTSxpQkFBaUIsR0FBOEM7SUFDbkUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7SUFDekUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7SUFDekUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Q0FDMUUsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQW9KSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEseUJBQXlCO0lBb0I1RDtJQUNBO0lBcEJtQixjQUFjLENBQVk7SUFFdkQsaUJBQWlCLEdBQUcsVUFBVSxDQUFDO0lBQy9CLFFBQVEsR0FBRyxZQUFZLENBQUM7SUFDeEIsYUFBYSxHQUFnQixJQUFJLENBQUM7SUFFbEMsd0VBQXdFO0lBQ3hFLFlBQVksR0FBa0IsSUFBSSxDQUFDO0lBRW5DLGlGQUFpRjtJQUNqRixZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRWIsT0FBTyxDQUFnQjtJQUN2QixRQUFRLENBQWdCO0lBQ3hCLGFBQWEsR0FBc0IsT0FBTyxDQUFDO0lBQzNDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUVwQyxZQUNFLGtCQUFzQyxFQUM5QixhQUE0QixFQUM1QixHQUFzQjtRQUU5QixLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUhsQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtJQUdoQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osNERBQTREO1lBQzVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFM0MsK0RBQStEO1lBQy9ELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3JELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQUMsT0FBTztnQkFBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsMENBQTBDO1lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7O09BR0c7SUFDSyxzQkFBc0IsQ0FBQyxLQUFjO1FBQzNDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDMUIsdURBQXVEO1lBQ3ZELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEIsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLE9BQU87UUFDVCxDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUN4QixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNwRCxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELHNCQUFzQjtRQUNwQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLGtCQUFrQjtRQUNoQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxzQkFBc0I7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ3hELGVBQWUsQ0FBQyxLQUFvQjtRQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRCx1REFBdUQ7SUFFdkQsbURBQW1EO0lBQzNDLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25GLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3pGLENBQUM7SUFFRCxtREFBbUQ7SUFDM0MsV0FBVyxDQUFDLE1BQWM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQztRQUFDLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25GLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakYsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0IsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQztRQUFDLENBQUM7UUFDNUYsT0FBTyxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELDBDQUEwQztJQUNsQyxTQUFTLENBQUMsSUFBVTtRQUMxQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCx1Q0FBdUM7SUFDL0IsWUFBWSxDQUFDLEtBQWE7UUFDaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQztRQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdDLENBQUM7SUFFRCxxREFBcUQ7SUFFN0MsZ0JBQWdCO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUMvRixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVk7UUFDekIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFVO1FBQ3pCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzVDLENBQUM7SUFFUSxjQUFjO1FBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFBQyxDQUFDO1FBQzlELE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFdBQVcsSUFBSSxZQUFZLENBQUM7SUFDNUUsQ0FBQzt3R0FyT1UseUJBQXlCOzRGQUF6Qix5QkFBeUIsMk5BdkkxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrRFQscXNDQTFEQyxZQUFZLGtJQUNaLFdBQVcsOFZBQ1gsZUFBZSxxaUJBQ2YsY0FBYyxpekNBQ2QsWUFBWSxpYkFDWixhQUFhLHNYQUNiLDRCQUE0Qjs7NEZBeUluQix5QkFBeUI7a0JBbkpyQyxTQUFTOytCQUNFLHdCQUF3QixjQUN0QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsNEJBQTRCO3FCQUM3QixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtEVDttSkFzRjRCLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRNYXNrTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG1hc2snO1xuaW1wb3J0IHsgQ2FsZW5kYXJNb2R1bGUsIENhbGVuZGFyIH0gZnJvbSAncHJpbWVuZy9jYWxlbmRhcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlLCBTdXBwb3J0ZWRMYW5ndWFnZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2xvY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNGaWVsZFdyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQtd3JhcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkQmFzZUNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1maWVsZC1iYXNlLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQ29uZmlndXJhw6fDo28gZGUgbcOhc2NhcmEgZGUgZGF0YSBwb3IgbG9jYWxlXG4gKi9cbmludGVyZmFjZSBEYXRlTWFza0NvbmZpZyB7XG4gIG1hc2s6IHN0cmluZztcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgZm9ybWF0OiAnZG15JyB8ICdtZHknO1xufVxuXG5jb25zdCBEQVRFX01BU0tfQ09ORklHUzogUmVjb3JkPFN1cHBvcnRlZExhbmd1YWdlLCBEYXRlTWFza0NvbmZpZz4gPSB7XG4gICdwdC1CUic6IHsgbWFzazogJzk5Lzk5Lzk5OTknLCBwbGFjZWhvbGRlcjogJ2RkL21tL2FhYWEnLCBmb3JtYXQ6ICdkbXknIH0sXG4gICdlbi1VUyc6IHsgbWFzazogJzk5Lzk5Lzk5OTknLCBwbGFjZWhvbGRlcjogJ21tL2RkL3l5eXknLCBmb3JtYXQ6ICdtZHknIH0sXG4gICdlcy1FUyc6IHsgbWFzazogJzk5Lzk5Lzk5OTknLCBwbGFjZWhvbGRlcjogJ2RkL21tL2FhYWEnLCBmb3JtYXQ6ICdkbXknIH1cbn07XG5cbi8qKlxuICogRHluYW1pY0ZpZWxkRGF0ZUNvbXBvbmVudFxuICpcbiAqIE8gRm9ybUNvbnRyb2wudmFsdWUgU0VNUFJFIGFybWF6ZW5hIGEgZGF0YSBubyBmb3JtYXRvIElTTzogXCJ5eXl5LU1NLWRkXCIgKGV4OiBcIjIwMjYtMDUtMThcIikuXG4gKiBBIHZhcmnDoXZlbCBgZGlzcGxheVZhbHVlYCBtYW50w6ltIG8gdmFsb3IgZm9ybWF0YWRvIG5vIGxvY2FsZSBkbyB1c3XDoXJpbyBwYXJhIGV4aWJpw6fDo28gbm8gaW5wdXQuXG4gKiBJc3NvIGdhcmFudGUgcXVlIHF1YWxxdWVyIGNvbXBvbmVudGUgcXVlIGFjZXNzZSBmb3JtLnZhbHVlIHJlY2ViYSBvIHZhbG9yIHByb250byBwYXJhIG8gYmFja2VuZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2lhLWR5bmFtaWMtZmllbGQtZGF0ZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgSW5wdXRNYXNrTW9kdWxlLFxuICAgIENhbGVuZGFyTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIER5bmFtaWNGaWVsZFdyYXBwZXJDb21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c2lhLWR5bmFtaWMtZmllbGQtd3JhcHBlciBbZmllbGRdPVwiZmllbGRcIiBbZm9ybV09XCJmb3JtXCIgW21vZGVdPVwibW9kZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGUtZmllbGRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8cC1pbnB1dG1hc2tcbiAgICAgICAgICAgIFtpbnB1dElkXT1cImZpZWxkLmZpZWxkXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgW21hc2tdPVwiZGF0ZU1hc2tcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyKClcIlxuICAgICAgICAgICAgc2xvdENoYXI9XCJfXCJcbiAgICAgICAgICAgIFthdXRvQ2xlYXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgc3R5bGVDbGFzcz1cImRhdGUtaW5wdXRcIlxuICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiaXNGaWVsZEludmFsaWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiaXNGaWVsZERpcnR5KClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQ29udHJvbERpc2FibGVkKClcIlxuICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwib25EaXNwbGF5VmFsdWVDb21wbGV0ZSgpXCJcbiAgICAgICAgICAgIChvbkJsdXIpPVwib25EaXNwbGF5VmFsdWVCbHVyKClcIj5cbiAgICAgICAgICA8L3AtaW5wdXRtYXNrPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2FsZW5kYXJcIlxuICAgICAgICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBUb29sdGlwPVwiQWJyaXIgY2FsZW5kw6FyaW9cIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIj5cbiAgICAgICAgICAgIDwvcC1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0NhbGVuZGFyXCJcbiAgICAgICAgICAgICNjYWxlbmRhclBpY2tlclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjYWxlbmRhclZhbHVlXCJcbiAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY3VycmVudERhdGVGb3JtYXRcIlxuICAgICAgICAgICAgW3Nob3dCdXR0b25CYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYXBwZW5kVG9dPVwiJ2JvZHknXCJcbiAgICAgICAgICAgIFtpbmxpbmVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3Nob3dJY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgIChvblNlbGVjdCk9XCJvbkNhbGVuZGFyU2VsZWN0KCRldmVudClcIlxuICAgICAgICAgICAgKG9uQ2xlYXJDbGljayk9XCJvbkNhbGVuZGFyQ2xlYXIoKVwiXG4gICAgICAgICAgICAob25IaWRlKT1cInNob3dDYWxlbmRhciA9IGZhbHNlXCJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJoaWRkZW4tY2FsZW5kYXItaW5wdXRcIlxuICAgICAgICAgICAgW3N0eWxlXT1cInsncG9zaXRpb24nOiAnYWJzb2x1dGUnLCAnd2lkdGgnOiAnMCcsICdoZWlnaHQnOiAnMCcsICdvdmVyZmxvdyc6ICdoaWRkZW4nLCAnb3BhY2l0eSc6ICcwJywgJ3BvaW50ZXItZXZlbnRzJzogJ25vbmUnfVwiPlxuICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NpYS1keW5hbWljLWZpZWxkLXdyYXBwZXI+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAuZGF0ZS1maWVsZCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG5cbiAgICAuZGF0ZS1pbnB1dC1ncm91cCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgOjpuZy1kZWVwIHAtaW5wdXRtYXNrIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuXG4gICAgICAgIGlucHV0IHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyLjVyZW07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmRhdGUtYnV0dG9ucyB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDRweDtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgfVxuXG4gICAgICA6Om5nLWRlZXAgLnAtYnV0dG9uIHtcbiAgICAgICAgd2lkdGg6IDJyZW0gIWltcG9ydGFudDtcbiAgICAgICAgaGVpZ2h0OiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIG1pbi13aWR0aDogMnJlbSAhaW1wb3J0YW50O1xuICAgICAgICBtaW4taGVpZ2h0OiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICAgICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG5cbiAgICAgICAgLnAtYnV0dG9uLWljb24ge1xuICAgICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW0gIWltcG9ydGFudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wLWJ1dHRvbi1sYWJlbCB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmhpZGRlbi1jYWxlbmRhci1pbnB1dCxcbiAgICA6Om5nLWRlZXAgLmhpZGRlbi1jYWxlbmRhci1pbnB1dCB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICAgIHdpZHRoOiAwICFpbXBvcnRhbnQ7XG4gICAgICBoZWlnaHQ6IDAgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgICAgIG9wYWNpdHk6IDAgIWltcG9ydGFudDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMDtcblxuICAgICAgaW5wdXQge1xuICAgICAgICB3aWR0aDogMCAhaW1wb3J0YW50O1xuICAgICAgICBoZWlnaHQ6IDAgIWltcG9ydGFudDtcbiAgICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICA+IHAtY2FsZW5kYXIge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgICB3aWR0aDogMCAhaW1wb3J0YW50O1xuICAgICAgaGVpZ2h0OiAwICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0ZpZWxkRGF0ZUNvbXBvbmVudCBleHRlbmRzIER5bmFtaWNGaWVsZEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2NhbGVuZGFyUGlja2VyJykgY2FsZW5kYXJQaWNrZXIhOiBDYWxlbmRhcjtcblxuICBjdXJyZW50RGF0ZUZvcm1hdCA9ICdkZC9tbS95eSc7XG4gIGRhdGVNYXNrID0gJzk5Lzk5Lzk5OTknO1xuICBjYWxlbmRhclZhbHVlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFZhbG9yIGRlIGV4aWJpw6fDo28gbm8gZm9ybWF0byBsb2NhbGUgKGV4OiBcIjE4LzA1LzIwMjZcIiBwYXJhIHB0LUJSKSAqL1xuICBkaXNwbGF5VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBDb250cm9sYSBhIHJlbmRlcml6YcOnw6NvIGRvIHAtY2FsZW5kYXIgKHPDsyBleGlzdGUgbm8gRE9NIHF1YW5kbyBuZWNlc3PDoXJpbykgKi9cbiAgc2hvd0NhbGVuZGFyID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsYW5nU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHZhbHVlU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGN1cnJlbnRMb2NhbGU6IFN1cHBvcnRlZExhbmd1YWdlID0gJ3B0LUJSJztcbiAgcHJpdmF0ZSB1cGRhdGluZ0Zyb21Db250cm9sID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBzdXBlcih0cmFuc2xhdGlvblNlcnZpY2UpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TG9jYWxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZ2V0Q3VycmVudExhbmd1YWdlKCk7XG4gICAgdGhpcy51cGRhdGVEYXRlRm9ybWF0KCk7XG5cbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICBpZiAoY29udHJvbCkge1xuICAgICAgLy8gSW5pY2lhbGl6YXIgZGlzcGxheVZhbHVlIGEgcGFydGlyIGRvIHZhbG9yIElTTyBkbyBjb250cm9sXG4gICAgICB0aGlzLnN5bmNEaXNwbGF5RnJvbUNvbnRyb2woY29udHJvbC52YWx1ZSk7XG5cbiAgICAgIC8vIE9ic2VydmFyIG11ZGFuw6dhcyBleHRlcm5hcyBubyBjb250cm9sIChwYXRjaFZhbHVlLCBzZXRWYWx1ZSlcbiAgICAgIHRoaXMudmFsdWVTdWIgPSBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICBpZiAodGhpcy51cGRhdGluZ0Zyb21Db250cm9sKSB7IHJldHVybjsgfVxuICAgICAgICB0aGlzLnN5bmNEaXNwbGF5RnJvbUNvbnRyb2wodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5sYW5nU3ViID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuY3VycmVudExhbmd1YWdlJC5zdWJzY3JpYmUoKGxhbmcpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IGxhbmc7XG4gICAgICB0aGlzLnVwZGF0ZURhdGVGb3JtYXQoKTtcbiAgICAgIC8vIFJlLWZvcm1hdGFyIG8gZGlzcGxheSBjb20gbyBub3ZvIGxvY2FsZVxuICAgICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgICBpZiAoY3RybCkge1xuICAgICAgICB0aGlzLnN5bmNEaXNwbGF5RnJvbUNvbnRyb2woY3RybC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhbmdTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy52YWx1ZVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5jcm9uaXphIG8gZGlzcGxheVZhbHVlIGEgcGFydGlyIGRvIHZhbG9yIElTTyBkbyBGb3JtQ29udHJvbC5cbiAgICogQWNlaXRhOiBcInl5eXktTU0tZGRcIiwgRGF0ZSwgbG9jYWxlIHN0cmluZyBcImRkL01NL3l5eXlcIiwgb3UgbnVsbC5cbiAgICovXG4gIHByaXZhdGUgc3luY0Rpc3BsYXlGcm9tQ29udHJvbCh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAvLyBDb252ZXJ0ZSBEYXRlIHBhcmEgSVNPIG5vIGNvbnRyb2wgZSBhdHVhbGl6YSBkaXNwbGF5XG4gICAgICBjb25zdCBpc28gPSB0aGlzLmRhdGVUb0lzbyh2YWx1ZSk7XG4gICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShpc28pO1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB0aGlzLmlzb1RvTG9jYWxlKGlzbyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcyA9IFN0cmluZyh2YWx1ZSk7XG5cbiAgICAvLyBKw6EgZXN0w6EgZW0gZm9ybWF0byBJU08gKHl5eXktTU0tZGQpXG4gICAgaWYgKHMubWF0Y2goL15cXGR7NH0tXFxkezJ9LVxcZHsyfS8pKSB7XG4gICAgICBjb25zdCBpc29EYXRlID0gcy5zdWJzdHJpbmcoMCwgMTApO1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB0aGlzLmlzb1RvTG9jYWxlKGlzb0RhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVzdMOhIGVtIGZvcm1hdG8gbG9jYWxlIChkZC9NTS95eXl5IG91IE1NL2RkL3l5eXkpXG4gICAgaWYgKHMubWF0Y2goL15cXGR7Mn1cXC9cXGR7Mn1cXC9cXGR7NH0kLykpIHtcbiAgICAgIGNvbnN0IGlzbyA9IHRoaXMubG9jYWxlVG9Jc28ocyk7XG4gICAgICBpZiAoaXNvKSB7XG4gICAgICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlKGlzbyk7XG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gcztcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxvciBpbmNvbXBsZXRvIG91IGNvbSBtw6FzY2FyYVxuICAgIHRoaXMuZGlzcGxheVZhbHVlID0gcy5pbmNsdWRlcygnXycpID8gbnVsbCA6IG51bGw7XG4gIH1cblxuICAvKiogQ2hhbWFkbyBxdWFuZG8gbyB1c3XDoXJpbyBjb21wbGV0YSBhIGRpZ2l0YcOnw6NvIGRhIG3DoXNjYXJhICovXG4gIG9uRGlzcGxheVZhbHVlQ29tcGxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jQ29udHJvbEZyb21EaXNwbGF5KCk7XG4gIH1cblxuICAvKiogQ2hhbWFkbyBxdWFuZG8gbyBpbnB1dCBwZXJkZSBmb2NvICovXG4gIG9uRGlzcGxheVZhbHVlQmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNDb250cm9sRnJvbURpc3BsYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0ZSBvIGRpc3BsYXlWYWx1ZSAobG9jYWxlKSBwYXJhIElTTyBlIHNldGEgbm8gRm9ybUNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIHN5bmNDb250cm9sRnJvbURpc3BsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgaWYgKCFjb250cm9sKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKCF0aGlzLmRpc3BsYXlWYWx1ZSB8fCB0aGlzLmRpc3BsYXlWYWx1ZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShudWxsKTtcbiAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc28gPSB0aGlzLmxvY2FsZVRvSXNvKHRoaXMuZGlzcGxheVZhbHVlKTtcbiAgICBpZiAoaXNvKSB7XG4gICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShpc28pO1xuICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRhIG8gdmFsb3Igbm8gY29udHJvbCBzZW0gZGlzcGFyYXIgbyBzdWJzY3JpYmVyIGludGVybm8gKi9cbiAgcHJpdmF0ZSBzZXRDb250cm9sVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICBpZiAoIWNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy51cGRhdGluZ0Zyb21Db250cm9sID0gdHJ1ZTtcbiAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICB0aGlzLnVwZGF0aW5nRnJvbUNvbnRyb2wgPSBmYWxzZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IENPTlZFUlPDlUVTID09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENvbnZlcnRlIElTTyBcInl5eXktTU0tZGRcIiBwYXJhIGxvY2FsZSBzdHJpbmcgKi9cbiAgcHJpdmF0ZSBpc29Ub0xvY2FsZShpc286IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gaXNvLnNwbGl0KCctJyk7XG4gICAgY29uc3QgY29uZmlnID0gREFURV9NQVNLX0NPTkZJR1NbdGhpcy5jdXJyZW50TG9jYWxlXSB8fCBEQVRFX01BU0tfQ09ORklHU1sncHQtQlInXTtcbiAgICByZXR1cm4gY29uZmlnLmZvcm1hdCA9PT0gJ21keScgPyBgJHttb250aH0vJHtkYXl9LyR7eWVhcn1gIDogYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0ZSBsb2NhbGUgc3RyaW5nIHBhcmEgSVNPIFwieXl5eS1NTS1kZFwiICovXG4gIHByaXZhdGUgbG9jYWxlVG9Jc28obG9jYWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBwYXJ0cyA9IGxvY2FsZS5zcGxpdCgnLycpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb25zdCBjb25maWcgPSBEQVRFX01BU0tfQ09ORklHU1t0aGlzLmN1cnJlbnRMb2NhbGVdIHx8IERBVEVfTUFTS19DT05GSUdTWydwdC1CUiddO1xuICAgIGNvbnN0IFtwMCwgcDEsIHAyXSA9IHBhcnRzO1xuICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IGNvbmZpZy5mb3JtYXQgPT09ICdtZHknID8gW3AxLCBwMCwgcDJdIDogW3AwLCBwMSwgcDJdO1xuICAgIGNvbnN0IGQgPSBwYXJzZUludChkYXksIDEwKTtcbiAgICBjb25zdCBtID0gcGFyc2VJbnQobW9udGgsIDEwKTtcbiAgICBjb25zdCB5ID0gcGFyc2VJbnQoeWVhciwgMTApO1xuICAgIGlmIChpc05hTihkKSB8fCBpc05hTihtKSB8fCBpc05hTih5KSB8fCBtIDwgMSB8fCBtID4gMTIgfHwgZCA8IDEgfHwgZCA+IDMxKSB7IHJldHVybiBudWxsOyB9XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gIH1cblxuICAvKiogQ29udmVydGUgRGF0ZSBwYXJhIElTTyBcInl5eXktTU0tZGRcIiAqL1xuICBwcml2YXRlIGRhdGVUb0lzbyhkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCB5ZWFyID0gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gIH1cblxuICAvKiogQ29udmVydGUgbG9jYWxlIHN0cmluZyBwYXJhIERhdGUgKi9cbiAgcHJpdmF0ZSBsb2NhbGVUb0RhdGUodmFsdWU6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICBjb25zdCBpc28gPSB0aGlzLmxvY2FsZVRvSXNvKHZhbHVlKTtcbiAgICBpZiAoIWlzbykgeyByZXR1cm4gbnVsbDsgfVxuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IGlzby5zcGxpdCgnLScpLm1hcChwID0+IHBhcnNlSW50KHAsIDEwKSk7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcbiAgICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbnVsbCA6IGRhdGU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBDQUxFTkRBUiA9PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0ZUZvcm1hdCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBEQVRFX01BU0tfQ09ORklHU1t0aGlzLmN1cnJlbnRMb2NhbGVdIHx8IERBVEVfTUFTS19DT05GSUdTWydwdC1CUiddO1xuICAgIHRoaXMuZGF0ZU1hc2sgPSBjb25maWcubWFzaztcbiAgICB0aGlzLmN1cnJlbnREYXRlRm9ybWF0ID0gdGhpcy5maWVsZD8uZGF0ZUZvcm1hdCB8fCB0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0UHJpbWVOR0RhdGVGb3JtYXQoKTtcbiAgfVxuXG4gIHRvZ2dsZUNhbGVuZGFyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmRpc3BsYXlWYWx1ZSAmJiAhdGhpcy5kaXNwbGF5VmFsdWUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgdGhpcy5jYWxlbmRhclZhbHVlID0gdGhpcy5sb2NhbGVUb0RhdGUodGhpcy5kaXNwbGF5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbGVuZGFyVmFsdWUgPSBuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNhbGVuZGFyUGlja2VyICYmIHRoaXMuY2FsZW5kYXJQaWNrZXIuaW5wdXRmaWVsZFZpZXdDaGlsZCkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyUGlja2VyLmlucHV0ZmllbGRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25DYWxlbmRhclNlbGVjdChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIGNvbnN0IGlzbyA9IHRoaXMuZGF0ZVRvSXNvKGRhdGUpO1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB0aGlzLmlzb1RvTG9jYWxlKGlzbyk7XG4gICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShpc28pO1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgICBpZiAoY29udHJvbCkgeyBjb250cm9sLm1hcmtBc0RpcnR5KCk7IH1cbiAgICB9XG4gIH1cblxuICBvbkNhbGVuZGFyQ2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5VmFsdWUgPSBudWxsO1xuICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlKG51bGwpO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuZmllbGQpO1xuICAgIGlmIChjb250cm9sKSB7IGNvbnRyb2wubWFya0FzRGlydHkoKTsgfVxuICB9XG5cbiAgaXNDb250cm9sRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgcmV0dXJuIGNvbnRyb2wgPyBjb250cm9sLmRpc2FibGVkIDogZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSBnZXRQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpZWxkLnBsYWNlaG9sZGVyKSB7IHJldHVybiB0aGlzLmZpZWxkLnBsYWNlaG9sZGVyOyB9XG4gICAgcmV0dXJuIERBVEVfTUFTS19DT05GSUdTW3RoaXMuY3VycmVudExvY2FsZV0/LnBsYWNlaG9sZGVyIHx8ICdkZC9tbS9hYWFhJztcbiAgfVxufVxuIl19