fx-form-builder-wrapper 2.0.74 → 2.0.75

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, inject, Input, ViewChild } from '@angular/core';
2
2
  import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
3
- import { FxBaseComponent, FxComponent, FxOptionSetting, FxStringSetting } from '@instantsys-labs/fx';
3
+ import { FxBaseComponent, FxComponent, FxOptionSetting, FxSelectSetting, FxStringSetting } from '@instantsys-labs/fx';
4
4
  import { Subject, takeUntil } from 'rxjs';
5
5
  import { CommonModule } from '@angular/common';
6
6
  import { CalendarModule } from 'primeng/calendar';
@@ -22,7 +22,7 @@ export class RadioGroupComponent extends FxBaseComponent {
22
22
  showOnSelection = 'yes'; // configurable: show textarea on Yes or No
23
23
  showTextArea = false;
24
24
  confirmationForm = this.fb.group({
25
- confirmation: ['', Validators.required],
25
+ confirmation: [''],
26
26
  remarks: [''],
27
27
  valueToShowTextArea: [''],
28
28
  label: ['']
@@ -48,7 +48,6 @@ export class RadioGroupComponent extends FxBaseComponent {
48
48
  this.options = this.fxComponent?.fxData?.settings?.find((s) => s.key === 'items')?.options || [];
49
49
  const labelData = this.fxComponent?.fxData?.settings?.find((s) => s.key === 'select-label')?.value ??
50
50
  '';
51
- console.log('Label Data:', labelData);
52
51
  const label = this.confirmationForm.get('label');
53
52
  label?.setValue(labelData);
54
53
  setTimeout(() => {
@@ -59,6 +58,13 @@ export class RadioGroupComponent extends FxBaseComponent {
59
58
  this.onSelectionChange(data.valueToShowTextArea);
60
59
  }
61
60
  }, 200);
61
+ setTimeout(() => {
62
+ const mainControl = this.confirmationForm.get('confirmation');
63
+ if (this.setting('isRadioRequired') === 'true') {
64
+ mainControl?.setValidators([Validators.required]);
65
+ mainControl?.updateValueAndValidity();
66
+ }
67
+ }, 100);
62
68
  }
63
69
  ngOnInit() {
64
70
  this.fxBuilderWrapperService.variables$
@@ -81,24 +87,23 @@ export class RadioGroupComponent extends FxBaseComponent {
81
87
  });
82
88
  this.options = this.fxComponent?.fxData?.settings?.find((s) => s.key === 'items')?.options || [];
83
89
  // this.setting('items').length > 0 ? this.options = this.setting('items') : null;
84
- this.confirmationForm.get('confirmation')?.valueChanges.subscribe(value => {
85
- const otherControl = this.confirmationForm.get('remarks');
86
- const valueToShowTextArea = this.confirmationForm.get('valueToShowTextArea');
87
- if (value) {
88
- otherControl?.setValidators([Validators.required]);
89
- valueToShowTextArea?.setValue(this.setting('value-show-text'));
90
- }
91
- else {
92
- otherControl?.setValidators([Validators.required]);
93
- otherControl?.reset();
94
- valueToShowTextArea?.reset();
95
- }
96
- });
90
+ // this.confirmationForm.get('confirmation')?.valueChanges.subscribe(value => {
91
+ // const otherControl = this.confirmationForm.get('remarks');
92
+ // const valueToShowTextArea = this.confirmationForm.get('valueToShowTextArea');
93
+ // if (value) {
94
+ // otherControl?.setValidators([Validators.required]);
95
+ // valueToShowTextArea?.setValue(this.setting('value-show-text'));
96
+ // } else {
97
+ // otherControl?.clearValidators();
98
+ // otherControl?.reset();
99
+ // valueToShowTextArea?.reset();
100
+ // }
101
+ // });
97
102
  }
98
103
  settings() {
99
104
  return [
100
105
  // new FxStringSetting({ key: 'clinicalNotesURL', $title: 'API Url', value: '' }),
101
- // new FxStringSetting({ key: 'customClass', $title: 'Custom Class Name', value: '' }),
106
+ new FxStringSetting({ key: 'customClasss', $title: 'Custom Class Name', value: '' }),
102
107
  new FxStringSetting({ key: 'select-label', $title: 'Header Label', value: 'Header Label' }),
103
108
  // new FxStringSetting({ key: 'option-value-one', $title: 'Value one', value: 'Value one' }),
104
109
  // new FxStringSetting({ key: 'option-value-two', $title: 'Value two', value: 'Value two' }),
@@ -110,6 +115,7 @@ export class RadioGroupComponent extends FxBaseComponent {
110
115
  new FxStringSetting({ key: 'additional-field-error-msg', $title: 'Additional field error message', value: 'Please fill out the field' }),
111
116
  new FxStringSetting({ key: 'error-msg', $title: 'Error message', value: 'Please select' }),
112
117
  new FxStringSetting({ key: 'remark-placeholder', $title: 'Additional field placeholder', value: 'enter here' }),
118
+ new FxSelectSetting({ key: 'isRadioRequired', $title: 'Required', value: 'true' }, [{ option: 'Yes', value: 'true' }, { option: 'No', value: 'false' }]),
113
119
  // new FxStringSetting({ key: 'other-placeholder', $title: 'Other Placeholder', value: '' }),
114
120
  // new FxSelectSetting({key: 'serviceName', $title: 'Service', value: ''}, [{option: 'User Service', value: 'user_service'}, {option: 'Patient Service', value: 'patient_service'},{option: 'Workflow Service', value: 'workflow_service'}]),
115
121
  // // new FxSelectSetting({key: 'service', $title: 'Service', value: 'local'}, [{option: 'Local', value: 'local'}, {option: 'QA', value: 'qa'},{option: 'UAT', value: 'uat'},{option: 'Production', value: 'prod'}]),
@@ -124,17 +130,29 @@ export class RadioGroupComponent extends FxBaseComponent {
124
130
  const labelData = this.fxComponent?.fxData?.settings?.find((s) => s.key === 'value-show-text')?.value ??
125
131
  '';
126
132
  this.showTextArea = selection === labelData;
133
+ if (this.showTextArea) {
134
+ const valueToShowTextArea = this.confirmationForm.get('valueToShowTextArea');
135
+ valueToShowTextArea?.setValue(this.setting('value-show-text'));
136
+ const otherControl = this.confirmationForm.get('remarks');
137
+ otherControl?.setValidators([Validators.required]);
138
+ otherControl?.updateValueAndValidity();
139
+ }
140
+ else {
141
+ const otherControl = this.confirmationForm.get('remarks');
142
+ otherControl?.clearValidators();
143
+ otherControl?.updateValueAndValidity();
144
+ }
127
145
  }
128
146
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadioGroupComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.HttpClient }, { token: i2.FxBuilderWrapperService }, { token: i3.ApiServiceRegistry }], target: i0.ɵɵFactoryTarget.Component });
129
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RadioGroupComponent, isStandalone: true, selector: "radio-group-custom", inputs: { showOnSelection: "showOnSelection" }, viewQueries: [{ propertyName: "fxComponent", first: true, predicate: ["fxComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <form [formGroup]=\"confirmationForm\" class=\"flex flex-col gap-4\">\r\n\r\n <!-- Title -->\r\n <label class=\"font-semibold text-gray-800\">\r\n {{ setting('select-label') }}\r\n </label>\r\n\r\n <!-- ROW -->\r\n <div class=\"flex items-start gap-16\">\r\n\r\n <!-- RADIO GROUP -->\r\n <div class=\"flex flex-col\">\r\n <div class=\"flex items-center custom-gap\">\r\n\r\n <label\r\n *ngFor=\"let opt of options\"\r\n class=\"flex items-center gap-2 cursor-pointer text-gray-700\"\r\n >\r\n <input\r\n type=\"radio\"\r\n formControlName=\"confirmation\"\r\n [value]=\"opt.value\"\r\n (change)=\"onSelectionChange(opt.value)\"\r\n class=\"w-4 h-4 accent-blue-600 cursor-pointer\"\r\n />\r\n <span>{{ opt.option }}</span>\r\n </label>\r\n\r\n </div>\r\n\r\n <!-- Radio error -->\r\n <small\r\n *ngIf=\"\r\n confirmationForm.get('confirmation')?.touched &&\r\n confirmationForm.get('confirmation')?.errors?.['required']\r\n \"\r\n class=\"text-red-500 mt-1\"\r\n >\r\n {{ setting('error-msg') }}\r\n </small>\r\n </div>\r\n\r\n <!-- REMARKS -->\r\n <div *ngIf=\"showTextArea\" class=\"flex flex-col w-80 ml-4\">\r\n\r\n <label class=\"mb-2 font-medium text-gray-700\">\r\n {{ setting('additional-field-label') }}\r\n </label>\r\n\r\n <textarea\r\n formControlName=\"remarks\"\r\n rows=\"3\"\r\n placeholder=\" {{ setting('additional-field-label') }}\"\r\n class=\"border border-gray-300 rounded-lg p-3 w-full \r\n resize-none shadow-sm\r\n focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n ></textarea>\r\n\r\n <!-- Error -->\r\n <small\r\n *ngIf=\"\r\n confirmationForm.get('remarks')?.touched &&\r\n confirmationForm.get('remarks')?.errors?.['required']\r\n \"\r\n class=\"text-red-500 mt-1\"\r\n >\r\n {{ setting('additional-field-error-msg') }}\r\n </small>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </form>\r\n</fx-component>\r\n", styles: [".custom-gap{gap:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "ngmodule", type: RadioButtonModule }] });
147
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RadioGroupComponent, isStandalone: true, selector: "radio-group-custom", inputs: { showOnSelection: "showOnSelection" }, viewQueries: [{ propertyName: "fxComponent", first: true, predicate: ["fxComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div [ngClass]=\"setting('customClasss')\">\r\n<form [formGroup]=\"confirmationForm\" class=\"flex gap-4 w-full\">\r\n <div class=\"flex-1 w-full\">\r\n <!-- Title -->\r\n <label class=\"font-semibold text-gray-800\">\r\n {{ setting('select-label') }}\r\n </label>\r\n\r\n <!-- TWO COLUMN LAYOUT -->\r\n \r\n\r\n <!-- LEFT COLUMN (RADIO GROUP) -->\r\n <div class=\"flex-1\">\r\n\r\n <div class=\"flex gap-3 my-2\"> \r\n <!-- stack vertically so height is correct -->\r\n <label\r\n *ngFor=\"let opt of options\"\r\n class=\"flex items-center gap-2 cursor-pointer text-gray-700\"\r\n >\r\n <input\r\n type=\"radio\"\r\n formControlName=\"confirmation\"\r\n [value]=\"opt.value\"\r\n (change)=\"onSelectionChange(opt.value)\"\r\n class=\"w-4 h-4 accent-blue-600 cursor-pointer\"\r\n />\r\n <span>{{ opt.option }}</span>\r\n </label>\r\n </div>\r\n\r\n <!-- Radio error -->\r\n <small\r\n *ngIf=\"\r\n confirmationForm.get('confirmation')?.touched &&\r\n confirmationForm.get('confirmation')?.errors?.['required']\r\n \"\r\n class=\"text-red-500 mt-1\"\r\n >\r\n {{ setting('error-msg') }}\r\n </small>\r\n\r\n </div>\r\n\r\n </div>\r\n \r\n <!-- RIGHT COLUMN (TEXTAREA) -->\r\n <div *ngIf=\"showTextArea\" class=\"flex-1\">\r\n\r\n <label class=\"mb-2 font-medium text-gray-700\">\r\n {{ setting('additional-field-label') }}\r\n </label>\r\n\r\n <textarea\r\n formControlName=\"remarks\"\r\n rows=\"3\"\r\n placeholder=\"{{ setting('additional-field-label') }}\"\r\n class=\"border border-gray-300 rounded-lg p-3 w-full resize-none shadow-sm\r\n focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n ></textarea>\r\n\r\n <!-- Textarea error -->\r\n <small\r\n *ngIf=\"\r\n confirmationForm.get('remarks')?.touched &&\r\n confirmationForm.get('remarks')?.errors?.['required']\r\n \"\r\n class=\"text-red-500 mt-1\"\r\n >\r\n {{ setting('additional-field-error-msg') }}\r\n </small>\r\n\r\n </div>\r\n\r\n\r\n\r\n</form>\r\n</div>\r\n\r\n\r\n</fx-component>\r\n", styles: [".custom-gap{gap:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "ngmodule", type: RadioButtonModule }] });
130
148
  }
131
149
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadioGroupComponent, decorators: [{
132
150
  type: Component,
133
- args: [{ selector: 'radio-group-custom', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule, FxComponent, CalendarModule, RadioButtonModule], template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <form [formGroup]=\"confirmationForm\" class=\"flex flex-col gap-4\">\r\n\r\n <!-- Title -->\r\n <label class=\"font-semibold text-gray-800\">\r\n {{ setting('select-label') }}\r\n </label>\r\n\r\n <!-- ROW -->\r\n <div class=\"flex items-start gap-16\">\r\n\r\n <!-- RADIO GROUP -->\r\n <div class=\"flex flex-col\">\r\n <div class=\"flex items-center custom-gap\">\r\n\r\n <label\r\n *ngFor=\"let opt of options\"\r\n class=\"flex items-center gap-2 cursor-pointer text-gray-700\"\r\n >\r\n <input\r\n type=\"radio\"\r\n formControlName=\"confirmation\"\r\n [value]=\"opt.value\"\r\n (change)=\"onSelectionChange(opt.value)\"\r\n class=\"w-4 h-4 accent-blue-600 cursor-pointer\"\r\n />\r\n <span>{{ opt.option }}</span>\r\n </label>\r\n\r\n </div>\r\n\r\n <!-- Radio error -->\r\n <small\r\n *ngIf=\"\r\n confirmationForm.get('confirmation')?.touched &&\r\n confirmationForm.get('confirmation')?.errors?.['required']\r\n \"\r\n class=\"text-red-500 mt-1\"\r\n >\r\n {{ setting('error-msg') }}\r\n </small>\r\n </div>\r\n\r\n <!-- REMARKS -->\r\n <div *ngIf=\"showTextArea\" class=\"flex flex-col w-80 ml-4\">\r\n\r\n <label class=\"mb-2 font-medium text-gray-700\">\r\n {{ setting('additional-field-label') }}\r\n </label>\r\n\r\n <textarea\r\n formControlName=\"remarks\"\r\n rows=\"3\"\r\n placeholder=\" {{ setting('additional-field-label') }}\"\r\n class=\"border border-gray-300 rounded-lg p-3 w-full \r\n resize-none shadow-sm\r\n focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n ></textarea>\r\n\r\n <!-- Error -->\r\n <small\r\n *ngIf=\"\r\n confirmationForm.get('remarks')?.touched &&\r\n confirmationForm.get('remarks')?.errors?.['required']\r\n \"\r\n class=\"text-red-500 mt-1\"\r\n >\r\n {{ setting('additional-field-error-msg') }}\r\n </small>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </form>\r\n</fx-component>\r\n", styles: [".custom-gap{gap:1rem}\n"] }]
151
+ args: [{ selector: 'radio-group-custom', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule, FxComponent, CalendarModule, RadioButtonModule], template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div [ngClass]=\"setting('customClasss')\">\r\n<form [formGroup]=\"confirmationForm\" class=\"flex gap-4 w-full\">\r\n <div class=\"flex-1 w-full\">\r\n <!-- Title -->\r\n <label class=\"font-semibold text-gray-800\">\r\n {{ setting('select-label') }}\r\n </label>\r\n\r\n <!-- TWO COLUMN LAYOUT -->\r\n \r\n\r\n <!-- LEFT COLUMN (RADIO GROUP) -->\r\n <div class=\"flex-1\">\r\n\r\n <div class=\"flex gap-3 my-2\"> \r\n <!-- stack vertically so height is correct -->\r\n <label\r\n *ngFor=\"let opt of options\"\r\n class=\"flex items-center gap-2 cursor-pointer text-gray-700\"\r\n >\r\n <input\r\n type=\"radio\"\r\n formControlName=\"confirmation\"\r\n [value]=\"opt.value\"\r\n (change)=\"onSelectionChange(opt.value)\"\r\n class=\"w-4 h-4 accent-blue-600 cursor-pointer\"\r\n />\r\n <span>{{ opt.option }}</span>\r\n </label>\r\n </div>\r\n\r\n <!-- Radio error -->\r\n <small\r\n *ngIf=\"\r\n confirmationForm.get('confirmation')?.touched &&\r\n confirmationForm.get('confirmation')?.errors?.['required']\r\n \"\r\n class=\"text-red-500 mt-1\"\r\n >\r\n {{ setting('error-msg') }}\r\n </small>\r\n\r\n </div>\r\n\r\n </div>\r\n \r\n <!-- RIGHT COLUMN (TEXTAREA) -->\r\n <div *ngIf=\"showTextArea\" class=\"flex-1\">\r\n\r\n <label class=\"mb-2 font-medium text-gray-700\">\r\n {{ setting('additional-field-label') }}\r\n </label>\r\n\r\n <textarea\r\n formControlName=\"remarks\"\r\n rows=\"3\"\r\n placeholder=\"{{ setting('additional-field-label') }}\"\r\n class=\"border border-gray-300 rounded-lg p-3 w-full resize-none shadow-sm\r\n focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n ></textarea>\r\n\r\n <!-- Textarea error -->\r\n <small\r\n *ngIf=\"\r\n confirmationForm.get('remarks')?.touched &&\r\n confirmationForm.get('remarks')?.errors?.['required']\r\n \"\r\n class=\"text-red-500 mt-1\"\r\n >\r\n {{ setting('additional-field-error-msg') }}\r\n </small>\r\n\r\n </div>\r\n\r\n\r\n\r\n</form>\r\n</div>\r\n\r\n\r\n</fx-component>\r\n", styles: [".custom-gap{gap:1rem}\n"] }]
134
152
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.HttpClient }, { type: i2.FxBuilderWrapperService }, { type: i3.ApiServiceRegistry }], propDecorators: { showOnSelection: [{
135
153
  type: Input
136
154
  }], fxComponent: [{
137
155
  type: ViewChild,
138
156
  args: ['fxComponent']
139
157
  }] } });
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvY29tcG9uZW50cy9yYWRpby1ncm91cC9yYWRpby1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3JhZGlvLWdyb3VwL3JhZGlvLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNGLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBOEIsZUFBZSxFQUFvQyxNQUFNLHFCQUFxQixDQUFDO0FBQ25LLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7QUFTeEQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGVBQWU7SUFzQmhDO0lBQStCO0lBQXlCO0lBQXlEO0lBckJqSSxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO0lBQzFDLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFDZixlQUFlLEdBQWlCLEtBQUss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akcsZUFBZTtzQkFBdkIsS0FBSztnQkFld0IsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnkgfSBmcm9tICdAaW5zdGFudHN5cy1sYWJzL2NvcmUnO1xyXG5pbXBvcnQgeyBGeEJhc2VDb21wb25lbnQsIEZ4Q29tcG9uZW50LCBGeE9wdGlvblNldHRpbmcsIEZ4U2VsZWN0U2V0dGluZywgRnhTZXR0aW5nLCBGeFN0cmluZ1NldHRpbmcsIEZ4VmFsaWRhdGlvbiwgRnhWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnQGluc3RhbnRzeXMtbGFicy9meCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSB9IGZyb20gJy4uLy4uL2Z4LWJ1aWxkZXItd3JhcHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ2FsZW5kYXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NhbGVuZGFyJztcclxuaW1wb3J0IHsgUmFkaW9CdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL3JhZGlvYnV0dG9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncmFkaW8tZ3JvdXAtY3VzdG9tJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlLCBGeENvbXBvbmVudCwgQ2FsZW5kYXJNb2R1bGUsUmFkaW9CdXR0b25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yYWRpby1ncm91cC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3JhZGlvLWdyb3VwLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSYWRpb0dyb3VwQ29tcG9uZW50IGV4dGVuZHMgRnhCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0e1xyXG5wcml2YXRlIGZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcclxucHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PEJvb2xlYW4+KCk7XHJcbmZvcm1PYmplY3Q6IG9iamVjdCA9IHt9O1xyXG5ASW5wdXQoKSBzaG93T25TZWxlY3Rpb246ICd5ZXMnIHwgJ25vJyA9ICd5ZXMnOyAvLyBjb25maWd1cmFibGU6IHNob3cgdGV4dGFyZWEgb24gWWVzIG9yIE5vXHJcbiAgc2hvd1RleHRBcmVhID0gZmFsc2U7XHJcbiBwdWJsaWMgY29uZmlybWF0aW9uRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBjb25maXJtYXRpb246IFsnJyxWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcmVtYXJrczogWycnXSxcclxuICAgICAgdmFsdWVUb1Nob3dUZXh0QXJlYTogWycnXSxcclxuICAgICAgbGFiZWw6WycnXVxyXG4gICAgfSk7XHJcblxyXG4gICAgb3B0aW9uczogYW55W10gPSBbXHJcbiAgICAgIHsgb3B0aW9uOiAnWWVzJywgdmFsdWU6ICdZRVMnIH0sXHJcbiAgICAgIHsgb3B0aW9uOiAnTm8nLCB2YWx1ZTogJ05PJyB9LFxyXG4gICAgICB7IG9wdGlvbjogJ05BJywgdmFsdWU6ICdOQScgfVxyXG4gICAgXTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdmeENvbXBvbmVudCcpIGZ4Q29tcG9uZW50ITogRnhDb21wb25lbnQ7XHJcbiAgICByYWRvaW9NYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQscHJpdmF0ZSBmeEJ1aWxkZXJXcmFwcGVyU2VydmljZTogRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UscHJpdmF0ZSBmeEFwaVNlcnZpY2U6IEFwaVNlcnZpY2VSZWdpc3RyeSkge1xyXG4gICAgICAgc3VwZXIoY2RyKVxyXG4gICAgICAgIHRoaXMub25Jbml0LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9yZWdpc3Rlcih0aGlzLmNvbmZpcm1hdGlvbkZvcm0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgXHJcbiAgICAgfVxyXG5cclxuICAgICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgID0gKHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8uc2V0dGluZ3M/LmZpbmQoKHM6IGFueSkgPT4gcy5rZXkgPT09ICdpdGVtcycpIGFzIGFueSk/Lm9wdGlvbnMgfHwgW107XHJcbiAgICAgICBjb25zdCBsYWJlbERhdGEgPVxyXG4gICh0aGlzLmZ4Q29tcG9uZW50Py5meERhdGE/LnNldHRpbmdzPy5maW5kKChzOiBhbnkpID0+IHMua2V5ID09PSAnc2VsZWN0LWxhYmVsJykgYXMgYW55KT8udmFsdWUgPz9cclxuICAnJztcclxuXHJcbiAgY29uc29sZS5sb2coJ0xhYmVsIERhdGE6JywgbGFiZWxEYXRhKTtcclxuICAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmNvbmZpcm1hdGlvbkZvcm0uZ2V0KCdsYWJlbCcpO1xyXG4gICAgICAgICBsYWJlbD8uc2V0VmFsdWUobGFiZWxEYXRhKTtcclxuICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gIGNvbnN0IGtleSA9IHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8ubmFtZTtcclxuXHJcbiAgaWYgKGtleSAmJiB0aGlzLnJhZG9pb01hcC5oYXMoa2V5KSkge1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25Gb3JtLnBhdGNoVmFsdWUodGhpcy5yYWRvaW9NYXAuZ2V0KGtleSkpO1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmFkb2lvTWFwLmdldChrZXkpO1xyXG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZShkYXRhLnZhbHVlVG9TaG93VGV4dEFyZWEpO1xyXG4gIH1cclxufSwgMjAwKTtcclxuXHJcbiAgICAgICAgXHJcbiAgICAgICB9XHJcbiAgICAgXHJcbiAgICAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICAgICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykgYXMgW3N0cmluZywgYW55XVtdKSB7XHJcbiAgICAgICAgICAgIC8vICAgaWYgKGtleS5pbmNsdWRlcygncmFkaW8tZ3JvdXAtY3VzdG9tJykpIHtcclxuICAgICAgICAgICAgLy8gICAgdGhpcy5mb3JtT2JqZWN0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpIGFzIFtzdHJpbmcsIGFueV1bXSkge1xyXG4gIGlmIChcclxuICAgIHZhbHVlICYmXHJcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXHJcbiAgICAnY29uZmlybWF0aW9uJyBpbiB2YWx1ZVxyXG4gICkge1xyXG4gICAgdGhpcy5yYWRvaW9NYXAuc2V0KGtleSwgdmFsdWUpO1xyXG4gIH1cclxufVxyXG5cclxuICAgICAgICAgICAgXHJcbiAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLm9wdGlvbnMgID0gKHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8uc2V0dGluZ3M/LmZpbmQoKHM6IGFueSkgPT4gcy5rZXkgPT09ICdpdGVtcycpIGFzIGFueSk/Lm9wdGlvbnMgfHwgW107XHJcblxyXG5cclxuICAgICAgLy8gIHRoaXMuc2V0dGluZygnaXRlbXMnKS5sZW5ndGggPiAwID8gdGhpcy5vcHRpb25zID0gdGhpcy5zZXR0aW5nKCdpdGVtcycpIDogbnVsbDtcclxuICAgICBcclxuICAgICAgICB0aGlzLmNvbmZpcm1hdGlvbkZvcm0uZ2V0KCdjb25maXJtYXRpb24nKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgIGNvbnN0IG90aGVyQ29udHJvbCA9IHRoaXMuY29uZmlybWF0aW9uRm9ybS5nZXQoJ3JlbWFya3MnKTtcclxuICAgICAgICAgY29uc3QgdmFsdWVUb1Nob3dUZXh0QXJlYSA9IHRoaXMuY29uZmlybWF0aW9uRm9ybS5nZXQoJ3ZhbHVlVG9TaG93VGV4dEFyZWEnKTtcclxuICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgb3RoZXJDb250cm9sPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgICAgICAgdmFsdWVUb1Nob3dUZXh0QXJlYT8uc2V0VmFsdWUodGhpcy5zZXR0aW5nKCd2YWx1ZS1zaG93LXRleHQnKSk7XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICBvdGhlckNvbnRyb2w/LnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuICAgICAgICAgICBvdGhlckNvbnRyb2w/LnJlc2V0KCk7XHJcbiAgICAgICAgICAgdmFsdWVUb1Nob3dUZXh0QXJlYT8ucmVzZXQoKTtcclxuICAgICAgICAgfVxyXG4gICAgICAgfSk7XHJcbiAgICAgICBcclxuICAgICBcclxuICAgICB9XHJcblxyXG4gICAgIHByb3RlY3RlZCBzZXR0aW5ncygpOiBGeFNldHRpbmdbXSB7XHJcbiAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAvLyBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnY2xpbmljYWxOb3Rlc1VSTCcsICR0aXRsZTogJ0FQSSBVcmwnLCB2YWx1ZTogJycgfSksXHJcbiAgICAgICAgICAgIC8vIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdjdXN0b21DbGFzcycsICR0aXRsZTogJ0N1c3RvbSBDbGFzcyBOYW1lJywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3NlbGVjdC1sYWJlbCcsICR0aXRsZTogJ0hlYWRlciBMYWJlbCcsIHZhbHVlOiAnSGVhZGVyIExhYmVsJyB9KSwgXHJcbiAgICAgICAgICAgICAgLy8gbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ29wdGlvbi12YWx1ZS1vbmUnLCAkdGl0bGU6ICdWYWx1ZSBvbmUnLCB2YWx1ZTogJ1ZhbHVlIG9uZScgfSksIFxyXG4gICAgICAgICAgICAgIC8vICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnb3B0aW9uLXZhbHVlLXR3bycsICR0aXRsZTogJ1ZhbHVlIHR3bycsIHZhbHVlOiAnVmFsdWUgdHdvJyB9KSwgXHJcbiAgICAgICAgICAgICAgLy8gICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnb3B0aW9uLWxhYmVsLW9uZScsICR0aXRsZTogJ0xhYmVsIG9uZScsIHZhbHVlOiAnTGFiZWwgb25lJyB9KSwgXHJcbiAgICAgICAgICAgICAgLy8gICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnb3B0aW9uLWxhYmVsLXR3bycsICR0aXRsZTogJ0xhYmVsIHR3bycsIHZhbHVlOiAnTGFiZWwgdHdvJyB9KSwgXHJcbiAgICAgICAgICAgICAgICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAndmFsdWUtc2hvdy10ZXh0JywgJHRpdGxlOiAnVmFsdWUgdG8gc2hvdyB0ZXh0YXJlYScsIHZhbHVlOiAnVmFsdWUgdG8gc2hvdyB0ZXh0YXJlYScgfSksXHJcbiAgICAgICAgICAgICAgICBuZXcgRnhPcHRpb25TZXR0aW5nKHsga2V5OiAnaXRlbXMnLCAkdGl0bGU6ICdPcHRpb25zJywgdmFsdWU6IFt7b3B0aW9uOiAnWWVzJywgdmFsdWU6ICd5ZXMnfSwge29wdGlvbjogJ05vJywgdmFsdWU6ICdubyd9XSAgfSwgW3tvcHRpb246ICdZZXMnLCB2YWx1ZTogJ3llcyd9LCB7b3B0aW9uOiAnTm8nLCB2YWx1ZTogJ25vJ31dKSwgXHJcbiAgICAgICAgICAgICAgICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnYWRkaXRpb25hbC1maWVsZC1sYWJlbCcsICR0aXRsZTogJ0FkZGl0aW9uYWwgZmllbGQgbGFiZWwnLCB2YWx1ZTogJycgfSksXHJcbiAgICAgICAgICAgICAgICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnYWRkaXRpb25hbC1maWVsZC1lcnJvci1tc2cnLCAkdGl0bGU6ICdBZGRpdGlvbmFsIGZpZWxkIGVycm9yIG1lc3NhZ2UnLCB2YWx1ZTogJ1BsZWFzZSBmaWxsIG91dCB0aGUgZmllbGQnIH0pLFxyXG4gICAgICAgICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2Vycm9yLW1zZycsICR0aXRsZTogJ0Vycm9yIG1lc3NhZ2UnLCB2YWx1ZTogJ1BsZWFzZSBzZWxlY3QnIH0pLFxyXG4gICAgICAgICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3JlbWFyay1wbGFjZWhvbGRlcicsICR0aXRsZTogJ0FkZGl0aW9uYWwgZmllbGQgcGxhY2Vob2xkZXInLCB2YWx1ZTogJ2VudGVyIGhlcmUnIH0pLFxyXG4gICAgICAgICAgICAvLyAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdvdGhlci1wbGFjZWhvbGRlcicsICR0aXRsZTogJ090aGVyIFBsYWNlaG9sZGVyJywgdmFsdWU6ICcnIH0pLCAgXHJcbiAgICAgICAgICAgIC8vICAgbmV3IEZ4U2VsZWN0U2V0dGluZyh7a2V5OiAnc2VydmljZU5hbWUnLCAkdGl0bGU6ICdTZXJ2aWNlJywgdmFsdWU6ICcnfSwgW3tvcHRpb246ICdVc2VyIFNlcnZpY2UnLCB2YWx1ZTogJ3VzZXJfc2VydmljZSd9LCB7b3B0aW9uOiAnUGF0aWVudCBTZXJ2aWNlJywgdmFsdWU6ICdwYXRpZW50X3NlcnZpY2UnfSx7b3B0aW9uOiAnV29ya2Zsb3cgU2VydmljZScsIHZhbHVlOiAnd29ya2Zsb3dfc2VydmljZSd9XSksXHJcbiAgICAgICAgICAgIC8vICAgLy8gbmV3IEZ4U2VsZWN0U2V0dGluZyh7a2V5OiAnc2VydmljZScsICR0aXRsZTogJ1NlcnZpY2UnLCB2YWx1ZTogJ2xvY2FsJ30sIFt7b3B0aW9uOiAnTG9jYWwnLCB2YWx1ZTogJ2xvY2FsJ30sIHtvcHRpb246ICdRQScsIHZhbHVlOiAncWEnfSx7b3B0aW9uOiAnVUFUJywgdmFsdWU6ICd1YXQnfSx7b3B0aW9uOiAnUHJvZHVjdGlvbicsIHZhbHVlOiAncHJvZCd9XSksICAgXHJcbiAgICAgICAgICAgIC8vICAgLy8gbmV3IEZ4U2VsZWN0U2V0dGluZyh7a2V5OiAnaXNSZXF1aXJlZCcsICR0aXRsZTogJ1JlcXVpcmVkJywgdmFsdWU6IHRydWV9LCBbe29wdGlvbjogJ1llcycsIHZhbHVlOiB0cnVlfSwge29wdGlvbjogJ05vJywgdmFsdWU6IGZhbHNlfV0pLCAgICBcclxuICAgICAgICAgICAgLy8gICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2Vycm9yTWVzc2FnZScsICR0aXRsZTogJ0Vycm9yIE1lc3NhZ2UnLCB2YWx1ZTogJ1BsZWFzZSBmaWxsIG91dCB0aGUgZmllbGQnIH0pLCAgXHJcbiAgICAgICAgICBdO1xyXG4gICAgICAgIH1cclxuICAgICAgXHJcbiAgICAgICAgcHJvdGVjdGVkIHZhbGlkYXRpb25zKCk6IEZ4VmFsaWRhdGlvbltdIHtcclxuICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbjogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWxEYXRhID1cclxuICAodGhpcy5meENvbXBvbmVudD8uZnhEYXRhPy5zZXR0aW5ncz8uZmluZCgoczogYW55KSA9PiBzLmtleSA9PT0gJ3ZhbHVlLXNob3ctdGV4dCcpIGFzIGFueSk/LnZhbHVlID8/XHJcbiAgJyc7XHJcbiAgICB0aGlzLnNob3dUZXh0QXJlYSA9IHNlbGVjdGlvbiA9PT0gbGFiZWxEYXRhO1xyXG4gIH1cclxufVxyXG4iLCI8ZngtY29tcG9uZW50IFtmeERhdGFdPVwiZnhEYXRhXCIgI2Z4Q29tcG9uZW50PlxyXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiY29uZmlybWF0aW9uRm9ybVwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxyXG5cclxuICAgIDwhLS0gVGl0bGUgLS0+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtZ3JheS04MDBcIj5cclxuICAgICAge3sgc2V0dGluZygnc2VsZWN0LWxhYmVsJykgfX1cclxuICAgIDwvbGFiZWw+XHJcblxyXG4gICAgPCEtLSBST1cgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBnYXAtMTZcIj5cclxuXHJcbiAgICAgIDwhLS0gUkFESU8gR1JPVVAgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGN1c3RvbS1nYXBcIj5cclxuXHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdCBvZiBvcHRpb25zXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBjdXJzb3ItcG9pbnRlciB0ZXh0LWdyYXktNzAwXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb25maXJtYXRpb25cIlxyXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHQudmFsdWVcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2Uob3B0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LTQgaC00IGFjY2VudC1ibHVlLTYwMCBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IG9wdC5vcHRpb24gfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBSYWRpbyBlcnJvciAtLT5cclxuICAgICAgICA8c21hbGxcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIGNvbmZpcm1hdGlvbkZvcm0uZ2V0KCdjb25maXJtYXRpb24nKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICBjb25maXJtYXRpb25Gb3JtLmdldCgnY29uZmlybWF0aW9uJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXJlZC01MDAgbXQtMVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgc2V0dGluZygnZXJyb3ItbXNnJykgfX1cclxuICAgICAgICA8L3NtYWxsPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gUkVNQVJLUyAtLT5cclxuICAgICAgPGRpdiAqbmdJZj1cInNob3dUZXh0QXJlYVwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LTgwIG1sLTRcIj5cclxuXHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMiBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwXCI+XHJcbiAgICAgICAgICB7eyBzZXR0aW5nKCdhZGRpdGlvbmFsLWZpZWxkLWxhYmVsJykgfX1cclxuICAgICAgICA8L2xhYmVsPlxyXG5cclxuICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlbWFya3NcIlxyXG4gICAgICAgICAgcm93cz1cIjNcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCIge3sgc2V0dGluZygnYWRkaXRpb25hbC1maWVsZC1sYWJlbCcpIH19XCJcclxuICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLWxnIHAtMyB3LWZ1bGwgXHJcbiAgICAgICAgICAgICAgICAgcmVzaXplLW5vbmUgc2hhZG93LXNtXHJcbiAgICAgICAgICAgICAgICAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwXCJcclxuICAgICAgICA+PC90ZXh0YXJlYT5cclxuXHJcbiAgICAgICAgPCEtLSBFcnJvciAtLT5cclxuICAgICAgICA8c21hbGxcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIGNvbmZpcm1hdGlvbkZvcm0uZ2V0KCdyZW1hcmtzJyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgY29uZmlybWF0aW9uRm9ybS5nZXQoJ3JlbWFya3MnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBjbGFzcz1cInRleHQtcmVkLTUwMCBtdC0xXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBzZXR0aW5nKCdhZGRpdGlvbmFsLWZpZWxkLWVycm9yLW1zZycpIH19XHJcbiAgICAgICAgPC9zbWFsbD5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Zvcm0+XHJcbjwvZngtY29tcG9uZW50PlxyXG4iXX0=
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvY29tcG9uZW50cy9yYWRpby1ncm91cC9yYWRpby1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3JhZGlvLWdyb3VwL3JhZGlvLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNGLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQWEsZUFBZSxFQUFvQyxNQUFNLHFCQUFxQixDQUFDO0FBQ25LLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7QUFTeEQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGVBQWU7SUFzQmhDO0lBQStCO0lBQXlCO0lBQXlEO0lBckJqSSxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO0lBQzFDLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFDZixlQUFlLEdBQWlCLEtBQUssQ0FBQyxDQUFDLDJDQUEyQztJQUN6RixZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ2YsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDbkMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNiLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3pCLEtBQUssRUFBQyxDQUFDLEVBQUUsQ0FBQztLQUNYLENBQUMsQ0FBQztJQUVILE9BQU8sR0FBVTtRQUNmLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1FBQy9CLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1FBQzdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQzlCLENBQUM7SUFFd0IsV0FBVyxDQUFlO0lBQ3BELFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0lBRW5DLFlBQW9CLEdBQXNCLEVBQVMsSUFBZ0IsRUFBUyx1QkFBZ0QsRUFBUyxZQUFnQztRQUNsSyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFETyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFTLFNBQUksR0FBSixJQUFJLENBQVk7UUFBUyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQVMsaUJBQVksR0FBWixZQUFZLENBQW9CO1FBRWpLLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBRU4sQ0FBQztJQUVDLGVBQWU7UUFDZCxJQUFJLENBQUMsT0FBTyxHQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFTLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNqSCxNQUFNLFNBQVMsR0FDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxjQUFjLENBQVMsRUFBRSxLQUFLO1lBQzlGLEVBQUUsQ0FBQztRQUNJLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsS0FBSyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3JCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQztZQUUzQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVELFVBQVUsQ0FBQyxHQUFFLEVBQUU7WUFDakIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM5RCxJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsS0FBSyxNQUFNLEVBQUMsQ0FBQztnQkFDOUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztZQUN2QyxDQUFDO1FBQ0YsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxDQUFBO0lBR0gsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVTthQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsU0FBUztnQkFBRSxPQUFPO1lBR3ZCLDZFQUE2RTtZQUM3RSw4Q0FBOEM7WUFDOUMsOEJBQThCO1lBQzlCLE1BQU07WUFDTixJQUFJO1lBRUosS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFvQixFQUFFLENBQUM7Z0JBQ3BGLElBQ0UsS0FBSztvQkFDTCxPQUFPLEtBQUssS0FBSyxRQUFRO29CQUN6QixjQUFjLElBQUksS0FBSyxFQUN2QixDQUFDO29CQUNELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDakMsQ0FBQztZQUNILENBQUM7UUFHTSxDQUFDLENBQUMsQ0FBQTtRQUVELElBQUksQ0FBQyxPQUFPLEdBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQVMsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBR2xILG1GQUFtRjtRQUVuRixpRkFBaUY7UUFDakYsZ0VBQWdFO1FBQ2hFLG1GQUFtRjtRQUNuRixrQkFBa0I7UUFDbEIsMkRBQTJEO1FBQzNELHVFQUF1RTtRQUV2RSxlQUFlO1FBQ2Ysd0NBQXdDO1FBQ3hDLDhCQUE4QjtRQUM5QixxQ0FBcUM7UUFDckMsT0FBTztRQUNQLE9BQU87SUFHUixDQUFDO0lBRVMsUUFBUTtRQUNiLE9BQU87WUFDTCxrRkFBa0Y7WUFDbEYsSUFBSSxlQUFlLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDbkYsSUFBSSxlQUFlLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQzFGLDhGQUE4RjtZQUM5RiwrRkFBK0Y7WUFDL0YsZ0dBQWdHO1lBQ2hHLGdHQUFnRztZQUM5RixJQUFJLGVBQWUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFLENBQUM7WUFDbEgsSUFBSSxlQUFlLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDLEVBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1lBQzVMLElBQUksZUFBZSxDQUFDLEVBQUUsR0FBRyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDbkcsSUFBSSxlQUFlLENBQUMsRUFBRSxHQUFHLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxFQUFFLGdDQUFnQyxFQUFFLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxDQUFDO1lBQ3hJLElBQUksZUFBZSxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUMxRixJQUFJLGVBQWUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsOEJBQThCLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQy9HLElBQUksZUFBZSxDQUFDLEVBQUMsR0FBRyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7WUFDdEosaUdBQWlHO1lBQ2pHLCtPQUErTztZQUMvTywwTkFBME47WUFDMU4sb0pBQW9KO1lBQ3BKLGtIQUFrSDtTQUNuSCxDQUFDO0lBQ0osQ0FBQztJQUVTLFdBQVc7UUFDbkIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBaUI7UUFDMUIsTUFBTSxTQUFTLEdBQzdCLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssaUJBQWlCLENBQVMsRUFBRSxLQUFLO1lBQ2pHLEVBQUUsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxLQUFLLFNBQVMsQ0FBQztRQUM1QyxJQUFHLElBQUksQ0FBQyxZQUFZLEVBQUMsQ0FBQztZQUMxQixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUM1RSxtQkFBbUIsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRCxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbkQsWUFBWSxFQUFFLHNCQUFzQixFQUFFLENBQUM7UUFDbkMsQ0FBQzthQUNHLENBQUM7WUFDSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFELFlBQVksRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUNoQyxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztRQUN6QyxDQUFDO0lBRUgsQ0FBQzt3R0F4SlUsbUJBQW1COzRGQUFuQixtQkFBbUIsaVFDbEJoQyxtMUVBa0ZBLGdGRHBFWSxZQUFZLDZWQUFFLG1CQUFtQiwrcENBQUUsV0FBVywrQkFBRSxXQUFXLDRFQUFFLGNBQWMsOEJBQUMsaUJBQWlCOzs0RkFJNUYsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUMsaUJBQWlCLENBQUM7c0xBUWpHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBZXdCLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnQGluc3RhbnRzeXMtbGFicy9jb3JlJztcclxuaW1wb3J0IHsgRnhCYXNlQ29tcG9uZW50LCBGeENvbXBvbmVudCwgRnhPcHRpb25TZXR0aW5nLCBGeFNlbGVjdFNldHRpbmcsIEZ4U2V0dGluZywgRnhTdHJpbmdTZXR0aW5nLCBGeFZhbGlkYXRpb24sIEZ4VmFsaWRhdG9yU2VydmljZSB9IGZyb20gJ0BpbnN0YW50c3lzLWxhYnMvZngnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9meC1idWlsZGVyLXdyYXBwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENhbGVuZGFyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jYWxlbmRhcic7XHJcbmltcG9ydCB7IFJhZGlvQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9yYWRpb2J1dHRvbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3JhZGlvLWdyb3VwLWN1c3RvbScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZSwgRnhDb21wb25lbnQsIENhbGVuZGFyTW9kdWxlLFJhZGlvQnV0dG9uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmFkaW8tZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9yYWRpby1ncm91cC5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUmFkaW9Hcm91cENvbXBvbmVudCBleHRlbmRzIEZ4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdHtcclxucHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XHJcbnByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxCb29sZWFuPigpO1xyXG5mb3JtT2JqZWN0OiBvYmplY3QgPSB7fTtcclxuQElucHV0KCkgc2hvd09uU2VsZWN0aW9uOiAneWVzJyB8ICdubycgPSAneWVzJzsgLy8gY29uZmlndXJhYmxlOiBzaG93IHRleHRhcmVhIG9uIFllcyBvciBOb1xyXG4gIHNob3dUZXh0QXJlYSA9IGZhbHNlO1xyXG4gcHVibGljIGNvbmZpcm1hdGlvbkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgY29uZmlybWF0aW9uOiBbJyddLFxyXG4gICAgICByZW1hcmtzOiBbJyddLFxyXG4gICAgICB2YWx1ZVRvU2hvd1RleHRBcmVhOiBbJyddLFxyXG4gICAgICBsYWJlbDpbJyddXHJcbiAgICB9KTtcclxuXHJcbiAgICBvcHRpb25zOiBhbnlbXSA9IFtcclxuICAgICAgeyBvcHRpb246ICdZZXMnLCB2YWx1ZTogJ1lFUycgfSxcclxuICAgICAgeyBvcHRpb246ICdObycsIHZhbHVlOiAnTk8nIH0sXHJcbiAgICAgIHsgb3B0aW9uOiAnTkEnLCB2YWx1ZTogJ05BJyB9XHJcbiAgICBdO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2Z4Q29tcG9uZW50JykgZnhDb21wb25lbnQhOiBGeENvbXBvbmVudDtcclxuICAgIHJhZG9pb01hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxwcml2YXRlIGZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlOiBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSxwcml2YXRlIGZ4QXBpU2VydmljZTogQXBpU2VydmljZVJlZ2lzdHJ5KSB7XHJcbiAgICAgICBzdXBlcihjZHIpXHJcbiAgICAgICAgdGhpcy5vbkluaXQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMuY29uZmlybWF0aW9uRm9ybSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICBcclxuICAgICB9XHJcblxyXG4gICAgICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyAgPSAodGhpcy5meENvbXBvbmVudD8uZnhEYXRhPy5zZXR0aW5ncz8uZmluZCgoczogYW55KSA9PiBzLmtleSA9PT0gJ2l0ZW1zJykgYXMgYW55KT8ub3B0aW9ucyB8fCBbXTtcclxuICAgICAgIGNvbnN0IGxhYmVsRGF0YSA9XHJcbiAgKHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8uc2V0dGluZ3M/LmZpbmQoKHM6IGFueSkgPT4gcy5rZXkgPT09ICdzZWxlY3QtbGFiZWwnKSBhcyBhbnkpPy52YWx1ZSA/P1xyXG4gICcnO1xyXG4gICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuY29uZmlybWF0aW9uRm9ybS5nZXQoJ2xhYmVsJyk7XHJcbiAgICAgICAgIGxhYmVsPy5zZXRWYWx1ZShsYWJlbERhdGEpO1xyXG4gICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgY29uc3Qga2V5ID0gdGhpcy5meENvbXBvbmVudD8uZnhEYXRhPy5uYW1lO1xyXG5cclxuICBpZiAoa2V5ICYmIHRoaXMucmFkb2lvTWFwLmhhcyhrZXkpKSB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvbkZvcm0ucGF0Y2hWYWx1ZSh0aGlzLnJhZG9pb01hcC5nZXQoa2V5KSk7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yYWRvaW9NYXAuZ2V0KGtleSk7XHJcbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKGRhdGEudmFsdWVUb1Nob3dUZXh0QXJlYSk7XHJcbiAgfVxyXG59LCAyMDApO1xyXG5cclxuICAgICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAgICBjb25zdCBtYWluQ29udHJvbCA9IHRoaXMuY29uZmlybWF0aW9uRm9ybS5nZXQoJ2NvbmZpcm1hdGlvbicpO1xyXG4gICAgIGlmKHRoaXMuc2V0dGluZygnaXNSYWRpb1JlcXVpcmVkJykgPT09ICd0cnVlJyl7XHJcbiAgICAgIG1haW5Db250cm9sPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgIG1haW5Db250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgfVxyXG4gICAgfSwxMDApXHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgfVxyXG4gICAgIFxyXG4gICAgICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgICAgdGhpcy5meEJ1aWxkZXJXcmFwcGVyU2VydmljZS52YXJpYWJsZXMkXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlcykgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAvLyBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpIGFzIFtzdHJpbmcsIGFueV1bXSkge1xyXG4gICAgICAgICAgICAvLyAgIGlmIChrZXkuaW5jbHVkZXMoJ3JhZGlvLWdyb3VwLWN1c3RvbScpKSB7XHJcbiAgICAgICAgICAgIC8vICAgIHRoaXMuZm9ybU9iamVjdCA9IHZhbHVlO1xyXG4gICAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSBhcyBbc3RyaW5nLCBhbnldW10pIHtcclxuICBpZiAoXHJcbiAgICB2YWx1ZSAmJlxyXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxyXG4gICAgJ2NvbmZpcm1hdGlvbicgaW4gdmFsdWVcclxuICApIHtcclxuICAgIHRoaXMucmFkb2lvTWFwLnNldChrZXksIHZhbHVlKTtcclxuICB9XHJcbn1cclxuXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy5vcHRpb25zICA9ICh0aGlzLmZ4Q29tcG9uZW50Py5meERhdGE/LnNldHRpbmdzPy5maW5kKChzOiBhbnkpID0+IHMua2V5ID09PSAnaXRlbXMnKSBhcyBhbnkpPy5vcHRpb25zIHx8IFtdO1xyXG5cclxuXHJcbiAgICAgIC8vICB0aGlzLnNldHRpbmcoJ2l0ZW1zJykubGVuZ3RoID4gMCA/IHRoaXMub3B0aW9ucyA9IHRoaXMuc2V0dGluZygnaXRlbXMnKSA6IG51bGw7XHJcbiAgICAgXHJcbiAgICAgIC8vICAgdGhpcy5jb25maXJtYXRpb25Gb3JtLmdldCgnY29uZmlybWF0aW9uJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAvLyAgICBjb25zdCBvdGhlckNvbnRyb2wgPSB0aGlzLmNvbmZpcm1hdGlvbkZvcm0uZ2V0KCdyZW1hcmtzJyk7XHJcbiAgICAgIC8vICAgIGNvbnN0IHZhbHVlVG9TaG93VGV4dEFyZWEgPSB0aGlzLmNvbmZpcm1hdGlvbkZvcm0uZ2V0KCd2YWx1ZVRvU2hvd1RleHRBcmVhJyk7XHJcbiAgICAgIC8vICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvLyAgICAgIG90aGVyQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG4gICAgICAvLyAgICAgIHZhbHVlVG9TaG93VGV4dEFyZWE/LnNldFZhbHVlKHRoaXMuc2V0dGluZygndmFsdWUtc2hvdy10ZXh0JykpO1xyXG5cclxuICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgICAgb3RoZXJDb250cm9sPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgLy8gICAgICBvdGhlckNvbnRyb2w/LnJlc2V0KCk7XHJcbiAgICAgIC8vICAgICAgdmFsdWVUb1Nob3dUZXh0QXJlYT8ucmVzZXQoKTtcclxuICAgICAgLy8gICAgfVxyXG4gICAgICAvLyAgfSk7XHJcbiAgICAgICBcclxuICAgICBcclxuICAgICB9XHJcblxyXG4gICAgIHByb3RlY3RlZCBzZXR0aW5ncygpOiBGeFNldHRpbmdbXSB7XHJcbiAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAvLyBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnY2xpbmljYWxOb3Rlc1VSTCcsICR0aXRsZTogJ0FQSSBVcmwnLCB2YWx1ZTogJycgfSksXHJcbiAgICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdjdXN0b21DbGFzc3MnLCAkdGl0bGU6ICdDdXN0b20gQ2xhc3MgTmFtZScsIHZhbHVlOiAnJyB9KSxcclxuICAgICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdzZWxlY3QtbGFiZWwnLCAkdGl0bGU6ICdIZWFkZXIgTGFiZWwnLCB2YWx1ZTogJ0hlYWRlciBMYWJlbCcgfSksIFxyXG4gICAgICAgICAgICAgIC8vIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdvcHRpb24tdmFsdWUtb25lJywgJHRpdGxlOiAnVmFsdWUgb25lJywgdmFsdWU6ICdWYWx1ZSBvbmUnIH0pLCBcclxuICAgICAgICAgICAgICAvLyAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ29wdGlvbi12YWx1ZS10d28nLCAkdGl0bGU6ICdWYWx1ZSB0d28nLCB2YWx1ZTogJ1ZhbHVlIHR3bycgfSksIFxyXG4gICAgICAgICAgICAgIC8vICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ29wdGlvbi1sYWJlbC1vbmUnLCAkdGl0bGU6ICdMYWJlbCBvbmUnLCB2YWx1ZTogJ0xhYmVsIG9uZScgfSksIFxyXG4gICAgICAgICAgICAgIC8vICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ29wdGlvbi1sYWJlbC10d28nLCAkdGl0bGU6ICdMYWJlbCB0d28nLCB2YWx1ZTogJ0xhYmVsIHR3bycgfSksIFxyXG4gICAgICAgICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3ZhbHVlLXNob3ctdGV4dCcsICR0aXRsZTogJ1ZhbHVlIHRvIHNob3cgdGV4dGFyZWEnLCB2YWx1ZTogJ1ZhbHVlIHRvIHNob3cgdGV4dGFyZWEnIH0pLFxyXG4gICAgICAgICAgICAgICAgbmV3IEZ4T3B0aW9uU2V0dGluZyh7IGtleTogJ2l0ZW1zJywgJHRpdGxlOiAnT3B0aW9ucycsIHZhbHVlOiBbe29wdGlvbjogJ1llcycsIHZhbHVlOiAneWVzJ30sIHtvcHRpb246ICdObycsIHZhbHVlOiAnbm8nfV0gIH0sIFt7b3B0aW9uOiAnWWVzJywgdmFsdWU6ICd5ZXMnfSwge29wdGlvbjogJ05vJywgdmFsdWU6ICdubyd9XSksIFxyXG4gICAgICAgICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2FkZGl0aW9uYWwtZmllbGQtbGFiZWwnLCAkdGl0bGU6ICdBZGRpdGlvbmFsIGZpZWxkIGxhYmVsJywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2FkZGl0aW9uYWwtZmllbGQtZXJyb3ItbXNnJywgJHRpdGxlOiAnQWRkaXRpb25hbCBmaWVsZCBlcnJvciBtZXNzYWdlJywgdmFsdWU6ICdQbGVhc2UgZmlsbCBvdXQgdGhlIGZpZWxkJyB9KSxcclxuICAgICAgICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdlcnJvci1tc2cnLCAkdGl0bGU6ICdFcnJvciBtZXNzYWdlJywgdmFsdWU6ICdQbGVhc2Ugc2VsZWN0JyB9KSxcclxuICAgICAgICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdyZW1hcmstcGxhY2Vob2xkZXInLCAkdGl0bGU6ICdBZGRpdGlvbmFsIGZpZWxkIHBsYWNlaG9sZGVyJywgdmFsdWU6ICdlbnRlciBoZXJlJyB9KSxcclxuICAgICAgICAgICAgICAgIG5ldyBGeFNlbGVjdFNldHRpbmcoe2tleTogJ2lzUmFkaW9SZXF1aXJlZCcsICR0aXRsZTogJ1JlcXVpcmVkJywgdmFsdWU6ICd0cnVlJ30sIFt7b3B0aW9uOiAnWWVzJywgdmFsdWU6ICd0cnVlJ30sIHtvcHRpb246ICdObycsIHZhbHVlOiAnZmFsc2UnfV0pLCAgICBcclxuICAgICAgICAgICAgLy8gICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnb3RoZXItcGxhY2Vob2xkZXInLCAkdGl0bGU6ICdPdGhlciBQbGFjZWhvbGRlcicsIHZhbHVlOiAnJyB9KSwgIFxyXG4gICAgICAgICAgICAvLyAgIG5ldyBGeFNlbGVjdFNldHRpbmcoe2tleTogJ3NlcnZpY2VOYW1lJywgJHRpdGxlOiAnU2VydmljZScsIHZhbHVlOiAnJ30sIFt7b3B0aW9uOiAnVXNlciBTZXJ2aWNlJywgdmFsdWU6ICd1c2VyX3NlcnZpY2UnfSwge29wdGlvbjogJ1BhdGllbnQgU2VydmljZScsIHZhbHVlOiAncGF0aWVudF9zZXJ2aWNlJ30se29wdGlvbjogJ1dvcmtmbG93IFNlcnZpY2UnLCB2YWx1ZTogJ3dvcmtmbG93X3NlcnZpY2UnfV0pLFxyXG4gICAgICAgICAgICAvLyAgIC8vIG5ldyBGeFNlbGVjdFNldHRpbmcoe2tleTogJ3NlcnZpY2UnLCAkdGl0bGU6ICdTZXJ2aWNlJywgdmFsdWU6ICdsb2NhbCd9LCBbe29wdGlvbjogJ0xvY2FsJywgdmFsdWU6ICdsb2NhbCd9LCB7b3B0aW9uOiAnUUEnLCB2YWx1ZTogJ3FhJ30se29wdGlvbjogJ1VBVCcsIHZhbHVlOiAndWF0J30se29wdGlvbjogJ1Byb2R1Y3Rpb24nLCB2YWx1ZTogJ3Byb2QnfV0pLCAgIFxyXG4gICAgICAgICAgICAvLyAgIC8vIG5ldyBGeFNlbGVjdFNldHRpbmcoe2tleTogJ2lzUmVxdWlyZWQnLCAkdGl0bGU6ICdSZXF1aXJlZCcsIHZhbHVlOiB0cnVlfSwgW3tvcHRpb246ICdZZXMnLCB2YWx1ZTogdHJ1ZX0sIHtvcHRpb246ICdObycsIHZhbHVlOiBmYWxzZX1dKSwgICAgXHJcbiAgICAgICAgICAgIC8vICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdlcnJvck1lc3NhZ2UnLCAkdGl0bGU6ICdFcnJvciBNZXNzYWdlJywgdmFsdWU6ICdQbGVhc2UgZmlsbCBvdXQgdGhlIGZpZWxkJyB9KSwgIFxyXG4gICAgICAgICAgXTtcclxuICAgICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAgIHByb3RlY3RlZCB2YWxpZGF0aW9ucygpOiBGeFZhbGlkYXRpb25bXSB7XHJcbiAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb246IHN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsRGF0YSA9XHJcbiAgKHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8uc2V0dGluZ3M/LmZpbmQoKHM6IGFueSkgPT4gcy5rZXkgPT09ICd2YWx1ZS1zaG93LXRleHQnKSBhcyBhbnkpPy52YWx1ZSA/P1xyXG4gICcnO1xyXG4gICAgdGhpcy5zaG93VGV4dEFyZWEgPSBzZWxlY3Rpb24gPT09IGxhYmVsRGF0YTtcclxuICAgIGlmKHRoaXMuc2hvd1RleHRBcmVhKXtcclxuY29uc3QgdmFsdWVUb1Nob3dUZXh0QXJlYSA9IHRoaXMuY29uZmlybWF0aW9uRm9ybS5nZXQoJ3ZhbHVlVG9TaG93VGV4dEFyZWEnKTtcclxuIHZhbHVlVG9TaG93VGV4dEFyZWE/LnNldFZhbHVlKHRoaXMuc2V0dGluZygndmFsdWUtc2hvdy10ZXh0JykpO1xyXG5jb25zdCBvdGhlckNvbnRyb2wgPSB0aGlzLmNvbmZpcm1hdGlvbkZvcm0uZ2V0KCdyZW1hcmtzJyk7XHJcbm90aGVyQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG5vdGhlckNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIGNvbnN0IG90aGVyQ29udHJvbCA9IHRoaXMuY29uZmlybWF0aW9uRm9ybS5nZXQoJ3JlbWFya3MnKTtcclxuICAgICAgb3RoZXJDb250cm9sPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgb3RoZXJDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxufVxyXG4iLCI8ZngtY29tcG9uZW50IFtmeERhdGFdPVwiZnhEYXRhXCIgI2Z4Q29tcG9uZW50PlxyXG4gIDxkaXYgIFtuZ0NsYXNzXT1cInNldHRpbmcoJ2N1c3RvbUNsYXNzcycpXCI+XHJcbjxmb3JtIFtmb3JtR3JvdXBdPVwiY29uZmlybWF0aW9uRm9ybVwiIGNsYXNzPVwiZmxleCBnYXAtNCB3LWZ1bGxcIj5cclxuICA8ZGl2IGNsYXNzPVwiZmxleC0xIHctZnVsbFwiPlxyXG4gICAgPCEtLSBUaXRsZSAtLT5cclxuICA8bGFiZWwgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtZ3JheS04MDBcIj5cclxuICAgIHt7IHNldHRpbmcoJ3NlbGVjdC1sYWJlbCcpIH19XHJcbiAgPC9sYWJlbD5cclxuXHJcbiAgPCEtLSBUV08gQ09MVU1OIExBWU9VVCAtLT5cclxuICBcclxuXHJcbiAgICA8IS0tIExFRlQgQ09MVU1OIChSQURJTyBHUk9VUCkgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMyBteS0yXCI+IFxyXG4gICAgICAgIDwhLS0gc3RhY2sgdmVydGljYWxseSBzbyBoZWlnaHQgaXMgY29ycmVjdCAtLT5cclxuICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHQgb2Ygb3B0aW9uc1wiXHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIGN1cnNvci1wb2ludGVyIHRleHQtZ3JheS03MDBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb25maXJtYXRpb25cIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwib3B0LnZhbHVlXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZShvcHQudmFsdWUpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ3LTQgaC00IGFjY2VudC1ibHVlLTYwMCBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNwYW4+e3sgb3B0Lm9wdGlvbiB9fTwvc3Bhbj5cclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gUmFkaW8gZXJyb3IgLS0+XHJcbiAgICAgIDxzbWFsbFxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICBjb25maXJtYXRpb25Gb3JtLmdldCgnY29uZmlybWF0aW9uJyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgIGNvbmZpcm1hdGlvbkZvcm0uZ2V0KCdjb25maXJtYXRpb24nKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cclxuICAgICAgICBcIlxyXG4gICAgICAgIGNsYXNzPVwidGV4dC1yZWQtNTAwIG10LTFcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgc2V0dGluZygnZXJyb3ItbXNnJykgfX1cclxuICAgICAgPC9zbWFsbD5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcbiAgXHJcbiAgICA8IS0tIFJJR0hUIENPTFVNTiAoVEVYVEFSRUEpIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dUZXh0QXJlYVwiIGNsYXNzPVwiZmxleC0xXCI+XHJcblxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJtYi0yIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDBcIj5cclxuICAgICAgICB7eyBzZXR0aW5nKCdhZGRpdGlvbmFsLWZpZWxkLWxhYmVsJykgfX1cclxuICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlbWFya3NcIlxyXG4gICAgICAgIHJvd3M9XCIzXCJcclxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHNldHRpbmcoJ2FkZGl0aW9uYWwtZmllbGQtbGFiZWwnKSB9fVwiXHJcbiAgICAgICAgY2xhc3M9XCJib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbGcgcC0zIHctZnVsbCByZXNpemUtbm9uZSBzaGFkb3ctc21cclxuICAgICAgICAgICAgICAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwXCJcclxuICAgICAgPjwvdGV4dGFyZWE+XHJcblxyXG4gICAgICA8IS0tIFRleHRhcmVhIGVycm9yIC0tPlxyXG4gICAgICA8c21hbGxcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgY29uZmlybWF0aW9uRm9ybS5nZXQoJ3JlbWFya3MnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgY29uZmlybWF0aW9uRm9ybS5nZXQoJ3JlbWFya3MnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cclxuICAgICAgICBcIlxyXG4gICAgICAgIGNsYXNzPVwidGV4dC1yZWQtNTAwIG10LTFcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgc2V0dGluZygnYWRkaXRpb25hbC1maWVsZC1lcnJvci1tc2cnKSB9fVxyXG4gICAgICA8L3NtYWxsPlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG48L2Zvcm0+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwvZngtY29tcG9uZW50PlxyXG4iXX0=