@fundamental-ngx/platform 0.45.1-rc.9 → 0.45.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.
Files changed (67) hide show
  1. package/esm2022/form/form-generator/controls/dynamic-form-generator-checkbox/dynamic-form-generator-checkbox.component.mjs +6 -4
  2. package/esm2022/form/form-generator/controls/dynamic-form-generator-datepicker/dynamic-form-generator-datepicker.component.mjs +6 -4
  3. package/esm2022/form/form-generator/controls/dynamic-form-generator-editor/dynamic-form-generator-editor.component.mjs +6 -4
  4. package/esm2022/form/form-generator/controls/dynamic-form-generator-input/dynamic-form-generator-input.component.mjs +8 -6
  5. package/esm2022/form/form-generator/controls/dynamic-form-generator-multi-input/dynamic-form-generator-multi-input.component.mjs +6 -4
  6. package/esm2022/form/form-generator/controls/dynamic-form-generator-object-status/dynamic-form-generator-object-status.component.mjs +5 -3
  7. package/esm2022/form/form-generator/controls/dynamic-form-generator-radio/dynamic-form-generator-radio.component.mjs +6 -4
  8. package/esm2022/form/form-generator/controls/dynamic-form-generator-select/dynamic-form-generator-select.component.mjs +6 -4
  9. package/esm2022/form/form-generator/controls/dynamic-form-generator-switch/dynamic-form-generator-switch.component.mjs +6 -4
  10. package/esm2022/form/form-generator/dynamic-form-control-field.directive.mjs +4 -3
  11. package/esm2022/form/form-generator/dynamic-form-control.directive.mjs +4 -3
  12. package/esm2022/form/form-generator/dynamic-form-control.mjs +1 -1
  13. package/esm2022/form/form-generator/fdp-form-generator.module.mjs +23 -89
  14. package/esm2022/form/form-generator/form-generator/form-generator.component.mjs +130 -40
  15. package/esm2022/form/form-generator/form-generator-field/form-generator-field.component.mjs +20 -14
  16. package/esm2022/form/form-generator/form-generator.service.mjs +62 -19
  17. package/esm2022/form/form-generator/helpers.mjs +53 -0
  18. package/esm2022/form/form-generator/interfaces/dynamic-form-item.mjs +1 -1
  19. package/esm2022/form/form-generator/pipes/get-hint-options.pipe.mjs +46 -0
  20. package/esm2022/form/form-generator/pipes/get-ordered-form-controls.pipe.mjs +7 -3
  21. package/esm2022/form/form-generator/providers/providers.mjs +1 -1
  22. package/esm2022/form/form-group/form-field/form-field.component.mjs +1 -1
  23. package/esm2022/form/form-group/form-group-header/form-group-header.component.mjs +1 -1
  24. package/esm2022/form/form-group/form-group.component.mjs +3 -2
  25. package/esm2022/form/form-group/pipes/field-group-row-value.pipe.mjs +2 -2
  26. package/esm2022/form/form-helpers.mjs +2 -18
  27. package/esm2022/form/index.mjs +3 -1
  28. package/esm2022/form/input-message-group-with-template/input-message-group-with-template.component.mjs +26 -5
  29. package/esm2022/form/models/field.model.mjs +18 -0
  30. package/esm2022/shared/form/base.input.mjs +9 -3
  31. package/fesm2022/fundamental-ngx-platform-form.mjs +4445 -4240
  32. package/fesm2022/fundamental-ngx-platform-form.mjs.map +1 -1
  33. package/fesm2022/fundamental-ngx-platform-shared.mjs +9 -3
  34. package/fesm2022/fundamental-ngx-platform-shared.mjs.map +1 -1
  35. package/form/form-generator/controls/dynamic-form-generator-checkbox/dynamic-form-generator-checkbox.component.d.ts +1 -1
  36. package/form/form-generator/controls/dynamic-form-generator-datepicker/dynamic-form-generator-datepicker.component.d.ts +1 -1
  37. package/form/form-generator/controls/dynamic-form-generator-editor/dynamic-form-generator-editor.component.d.ts +1 -1
  38. package/form/form-generator/controls/dynamic-form-generator-input/dynamic-form-generator-input.component.d.ts +1 -1
  39. package/form/form-generator/controls/dynamic-form-generator-multi-input/dynamic-form-generator-multi-input.component.d.ts +1 -1
  40. package/form/form-generator/controls/dynamic-form-generator-object-status/dynamic-form-generator-object-status.component.d.ts +1 -1
  41. package/form/form-generator/controls/dynamic-form-generator-radio/dynamic-form-generator-radio.component.d.ts +1 -1
  42. package/form/form-generator/controls/dynamic-form-generator-select/dynamic-form-generator-select.component.d.ts +1 -1
  43. package/form/form-generator/controls/dynamic-form-generator-switch/dynamic-form-generator-switch.component.d.ts +1 -1
  44. package/form/form-generator/dynamic-form-control-field.directive.d.ts +1 -1
  45. package/form/form-generator/dynamic-form-control.d.ts +3 -3
  46. package/form/form-generator/dynamic-form-control.directive.d.ts +1 -1
  47. package/form/form-generator/fdp-form-generator.module.d.ts +3 -20
  48. package/form/form-generator/form-generator/form-generator.component.d.ts +41 -13
  49. package/form/form-generator/form-generator-field/form-generator-field.component.d.ts +7 -2
  50. package/form/form-generator/form-generator.service.d.ts +17 -8
  51. package/form/form-generator/helpers.d.ts +23 -0
  52. package/form/form-generator/interfaces/dynamic-form-item.d.ts +18 -7
  53. package/form/form-generator/pipes/get-hint-options.pipe.d.ts +17 -0
  54. package/form/form-generator/pipes/get-ordered-form-controls.pipe.d.ts +1 -1
  55. package/form/form-generator/providers/providers.d.ts +3 -3
  56. package/form/form-group/form-group-header/form-group-header.component.d.ts +1 -1
  57. package/form/form-group/form-group.component.d.ts +1 -1
  58. package/form/form-group/pipes/field-group-row-value.pipe.d.ts +1 -1
  59. package/form/form-helpers.d.ts +2 -20
  60. package/form/index.d.ts +2 -0
  61. package/form/input-message-group-with-template/input-message-group-with-template.component.d.ts +7 -1
  62. package/form/models/field.model.d.ts +20 -0
  63. package/fundamental-ngx-platform-v0.45.1.tgz +0 -0
  64. package/package.json +4 -4
  65. package/schematics/ng-add/index.js +1 -1
  66. package/shared/form/base.input.d.ts +13 -10
  67. package/fundamental-ngx-platform-v0.45.1-rc.9.tgz +0 -0
@@ -5,15 +5,17 @@ import { FORM_GROUP_CHILD_FIELD_TOKEN } from '../../form-group/constants';
5
5
  import { FormFieldComponent } from '../../form-group/form-field/form-field.component';
6
6
  import { DynamicFormControl } from '../dynamic-form-control';
7
7
  import { FormGeneratorService } from '../form-generator.service';
8
+ import { DynamicFormControlDirective } from '../dynamic-form-control.directive';
9
+ import { NgFor, NgIf } from '@angular/common';
10
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
11
+ import { FdpFormGroupModule } from '../../form-group/fdp-form.module';
8
12
  import * as i0 from "@angular/core";
9
13
  import * as i1 from "../form-generator.service";
10
- import * as i2 from "@angular/common";
11
- import * as i3 from "../../form-group/form-field/form-field.component";
12
- import * as i4 from "../../form-group/form-field-error/form-field-error.directive";
13
- import * as i5 from "../../form-group/form-field-error/form-field-error-heading.directive";
14
- import * as i6 from "../../form-group/form-field-error/form-field-error-description.directive";
15
- import * as i7 from "@angular/forms";
16
- import * as i8 from "../dynamic-form-control.directive";
14
+ import * as i2 from "../../form-group/form-field/form-field.component";
15
+ import * as i3 from "../../form-group/form-field-error/form-field-error.directive";
16
+ import * as i4 from "../../form-group/form-field-error/form-field-error-heading.directive";
17
+ import * as i5 from "../../form-group/form-field-error/form-field-error-description.directive";
18
+ import * as i6 from "@angular/forms";
17
19
  const formFieldProvider = {
18
20
  provide: FD_FORM_FIELD,
19
21
  useExisting: forwardRef(() => FormGeneratorFieldComponent)
@@ -49,6 +51,14 @@ export class FormGeneratorFieldComponent {
49
51
  this._cdr.detectChanges();
50
52
  }
51
53
  /** @hidden */
54
+ _errorsTrackBy(_, error) {
55
+ return error.type;
56
+ }
57
+ /** @hidden */
58
+ _isAdvancedError(error) {
59
+ return error.heading && error.description && error.type;
60
+ }
61
+ /** @hidden */
52
62
  _getErrors() {
53
63
  const registeredErrors = this._fgService.validationErrorHints;
54
64
  const returnErrors = [
@@ -66,16 +76,12 @@ export class FormGeneratorFieldComponent {
66
76
  });
67
77
  return returnErrors;
68
78
  }
69
- /** @hidden */
70
- _isAdvancedError(error) {
71
- return error.heading && error.description && error.type;
72
- }
73
79
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: FormGeneratorFieldComponent, deps: [{ token: i1.FormGeneratorService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
74
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.0", type: FormGeneratorFieldComponent, selector: "fdp-form-generator-field", inputs: { field: "field", form: "form", i18n: "i18n", formFieldName: "formFieldName", formGroupNamePath: "formGroupNamePath", rank: "rank", shouldShow: "shouldShow", hintOptions: "hintOptions" }, providers: [formFieldProvider, formGroupChildProvider], viewQueries: [{ propertyName: "fieldRenderer", first: true, predicate: i0.forwardRef(function () { return FormFieldComponent; }), descendants: true }], ngImport: i0, template: "<fdp-form-field\n [hint]=\"hintOptions\"\n [placeholder]=\"_placeholder\"\n [id]=\"field.formItem.id || formFieldName\"\n [column]=\"field.formItem.guiOptions?.column || 1\"\n [columnLayout]=\"field.formItem.guiOptions?.columnLayout\"\n [colon]=\"field.formItem.guiOptions?.appendColon === true\"\n [label]=\"field.formItem.message\"\n [validators]=\"field.formItem.validators || []\"\n [required]=\"field.formItem.required\"\n [rank]=\"rank\"\n [labelColumnLayout]=\"field.formItem.guiOptions?.labelColumnLayout\"\n [fieldColumnLayout]=\"field.formItem.guiOptions?.fieldColumnLayout\"\n [gapColumnLayout]=\"field.formItem.guiOptions?.gapColumnLayout\"\n [noLabelLayout]=\"field.formItem.guiOptions?.noLabelLayout || false\"\n [formGroup]=\"form\"\n #formField\n>\n <ng-container *ngFor=\"let error of _errorModels\">\n <span *fdpFormFieldError=\"error.type; let directiveError\">\n <ng-container *ngIf=\"_isAdvancedError(directiveError)\">\n <ng-container *ngIf=\"directiveError.heading\">\n <span *fdpFormFieldErrorHeading=\"let validationError; type: directiveError.type\">\n {{ validationError.heading }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"directiveError.description\">\n <span *fdpFormFieldErrorDescription=\"let validationError\">\n {{ validationError.description }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!_isAdvancedError(directiveError)\">\n <span *fdpFormFieldErrorHeading=\"let validationError\">\n {{ error.value ? error.value : validationError }}\n </span>\n </ng-container>\n </span>\n </ng-container>\n <ng-container\n [formField]=\"formField\"\n [form]=\"form\"\n [formGroupNamePath]=\"formGroupNamePath\"\n fdpDynamicFormControl\n [id]=\"field.formItem.id || formFieldName\"\n [name]=\"formFieldName\"\n [formItem]=\"field.formItem\"\n >\n </ng-container>\n</fdp-form-field>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.FormFieldComponent, selector: "fdp-form-field", inputs: ["label", "id", "hint", "noLabelLayout", "validators", "rank", "placeholder", "column", "columnLayout", "labelColumnLayout", "fieldColumnLayout", "gapColumnLayout", "i18Strings", "required", "editable", "columns", "disabled", "colon", "formGroupContainer"], outputs: ["onChange", "onColumnChange"] }, { kind: "directive", type: i4.FormFieldErrorDirective, selector: "[fdpFormFieldError]", inputs: ["fdpFormFieldErrorAs", "fdpFormFieldError", "fdpFormFieldErrorType"] }, { kind: "directive", type: i5.FormFieldErrorHeadingDirective, selector: "[fdpFormFieldErrorHeading]", inputs: ["fdpFormFieldErrorHeadingAs", "fdpFormFieldErrorHeadingType"] }, { kind: "directive", type: i6.FormFieldErrorDescriptionDirective, selector: "[fdpFormFieldErrorDescription]", inputs: ["fdpFormFieldErrorDescriptionAs"] }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.DynamicFormControlDirective, selector: "[fdpDynamicFormControl]", inputs: ["formItem", "id", "name", "form", "formGroupNamePath", "formField"] }], encapsulation: i0.ViewEncapsulation.None }); }
80
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.0", type: FormGeneratorFieldComponent, isStandalone: true, selector: "fdp-form-generator-field", inputs: { field: "field", form: "form", i18n: "i18n", formFieldName: "formFieldName", formGroupNamePath: "formGroupNamePath", rank: "rank", shouldShow: "shouldShow", hintOptions: "hintOptions" }, providers: [formFieldProvider, formGroupChildProvider], viewQueries: [{ propertyName: "fieldRenderer", first: true, predicate: i0.forwardRef(function () { return FormFieldComponent; }), descendants: true }], ngImport: i0, template: "<fdp-form-field\n [hint]=\"hintOptions\"\n [placeholder]=\"_placeholder\"\n [id]=\"field.formItem.id || formFieldName\"\n [column]=\"field.formItem.guiOptions?.column || 1\"\n [columnLayout]=\"field.formItem.guiOptions?.columnLayout\"\n [colon]=\"field.formItem.guiOptions?.appendColon === true\"\n [label]=\"field.formItem.message\"\n [validators]=\"field.formItem.validators || []\"\n [required]=\"field.formItem.required\"\n [rank]=\"rank\"\n [labelColumnLayout]=\"field.formItem.guiOptions?.labelColumnLayout\"\n [fieldColumnLayout]=\"field.formItem.guiOptions?.fieldColumnLayout\"\n [gapColumnLayout]=\"field.formItem.guiOptions?.gapColumnLayout\"\n [noLabelLayout]=\"field.formItem.guiOptions?.noLabelLayout || false\"\n [formGroup]=\"form\"\n #formField\n>\n <ng-container *ngFor=\"let error of _errorModels; trackBy: _errorsTrackBy\">\n <span *fdpFormFieldError=\"error.type; let directiveError\">\n <ng-container *ngIf=\"_isAdvancedError(directiveError); else simpleErrorTemplate\">\n <ng-container *ngIf=\"directiveError.heading\">\n <span *fdpFormFieldErrorHeading=\"let validationError; type: directiveError.type\">\n {{ validationError.heading }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"directiveError.description\">\n <span *fdpFormFieldErrorDescription=\"let validationError\">\n {{ validationError.description }}\n </span>\n </ng-container>\n </ng-container>\n <ng-template #simpleErrorTemplate>\n <span *fdpFormFieldErrorHeading=\"let validationError\">\n {{ error.value ? error.value : validationError }}\n </span>\n </ng-template>\n </span>\n </ng-container>\n <ng-container\n [formField]=\"formField\"\n [form]=\"form\"\n [formGroupNamePath]=\"formGroupNamePath\"\n fdpDynamicFormControl\n [id]=\"field.formItem.id || formFieldName\"\n [name]=\"formFieldName\"\n [formItem]=\"field.formItem\"\n >\n </ng-container>\n</fdp-form-field>\n", dependencies: [{ kind: "ngmodule", type: FdpFormGroupModule }, { kind: "component", type: i2.FormFieldComponent, selector: "fdp-form-field", inputs: ["label", "id", "hint", "noLabelLayout", "validators", "rank", "placeholder", "column", "columnLayout", "labelColumnLayout", "fieldColumnLayout", "gapColumnLayout", "i18Strings", "required", "editable", "columns", "disabled", "colon", "formGroupContainer"], outputs: ["onChange", "onColumnChange"] }, { kind: "directive", type: i3.FormFieldErrorDirective, selector: "[fdpFormFieldError]", inputs: ["fdpFormFieldErrorAs", "fdpFormFieldError", "fdpFormFieldErrorType"] }, { kind: "directive", type: i4.FormFieldErrorHeadingDirective, selector: "[fdpFormFieldErrorHeading]", inputs: ["fdpFormFieldErrorHeadingAs", "fdpFormFieldErrorHeadingType"] }, { kind: "directive", type: i5.FormFieldErrorDescriptionDirective, selector: "[fdpFormFieldErrorDescription]", inputs: ["fdpFormFieldErrorDescriptionAs"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: DynamicFormControlDirective, selector: "[fdpDynamicFormControl]", inputs: ["formItem", "id", "name", "form", "formGroupNamePath", "formField"] }], encapsulation: i0.ViewEncapsulation.None }); }
75
81
  }
76
82
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: FormGeneratorFieldComponent, decorators: [{
77
83
  type: Component,
78
- args: [{ selector: 'fdp-form-generator-field', providers: [formFieldProvider, formGroupChildProvider], encapsulation: ViewEncapsulation.None, template: "<fdp-form-field\n [hint]=\"hintOptions\"\n [placeholder]=\"_placeholder\"\n [id]=\"field.formItem.id || formFieldName\"\n [column]=\"field.formItem.guiOptions?.column || 1\"\n [columnLayout]=\"field.formItem.guiOptions?.columnLayout\"\n [colon]=\"field.formItem.guiOptions?.appendColon === true\"\n [label]=\"field.formItem.message\"\n [validators]=\"field.formItem.validators || []\"\n [required]=\"field.formItem.required\"\n [rank]=\"rank\"\n [labelColumnLayout]=\"field.formItem.guiOptions?.labelColumnLayout\"\n [fieldColumnLayout]=\"field.formItem.guiOptions?.fieldColumnLayout\"\n [gapColumnLayout]=\"field.formItem.guiOptions?.gapColumnLayout\"\n [noLabelLayout]=\"field.formItem.guiOptions?.noLabelLayout || false\"\n [formGroup]=\"form\"\n #formField\n>\n <ng-container *ngFor=\"let error of _errorModels\">\n <span *fdpFormFieldError=\"error.type; let directiveError\">\n <ng-container *ngIf=\"_isAdvancedError(directiveError)\">\n <ng-container *ngIf=\"directiveError.heading\">\n <span *fdpFormFieldErrorHeading=\"let validationError; type: directiveError.type\">\n {{ validationError.heading }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"directiveError.description\">\n <span *fdpFormFieldErrorDescription=\"let validationError\">\n {{ validationError.description }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!_isAdvancedError(directiveError)\">\n <span *fdpFormFieldErrorHeading=\"let validationError\">\n {{ error.value ? error.value : validationError }}\n </span>\n </ng-container>\n </span>\n </ng-container>\n <ng-container\n [formField]=\"formField\"\n [form]=\"form\"\n [formGroupNamePath]=\"formGroupNamePath\"\n fdpDynamicFormControl\n [id]=\"field.formItem.id || formFieldName\"\n [name]=\"formFieldName\"\n [formItem]=\"field.formItem\"\n >\n </ng-container>\n</fdp-form-field>\n" }]
84
+ args: [{ selector: 'fdp-form-generator-field', providers: [formFieldProvider, formGroupChildProvider], encapsulation: ViewEncapsulation.None, standalone: true, imports: [FdpFormGroupModule, FormsModule, ReactiveFormsModule, NgFor, NgIf, DynamicFormControlDirective], template: "<fdp-form-field\n [hint]=\"hintOptions\"\n [placeholder]=\"_placeholder\"\n [id]=\"field.formItem.id || formFieldName\"\n [column]=\"field.formItem.guiOptions?.column || 1\"\n [columnLayout]=\"field.formItem.guiOptions?.columnLayout\"\n [colon]=\"field.formItem.guiOptions?.appendColon === true\"\n [label]=\"field.formItem.message\"\n [validators]=\"field.formItem.validators || []\"\n [required]=\"field.formItem.required\"\n [rank]=\"rank\"\n [labelColumnLayout]=\"field.formItem.guiOptions?.labelColumnLayout\"\n [fieldColumnLayout]=\"field.formItem.guiOptions?.fieldColumnLayout\"\n [gapColumnLayout]=\"field.formItem.guiOptions?.gapColumnLayout\"\n [noLabelLayout]=\"field.formItem.guiOptions?.noLabelLayout || false\"\n [formGroup]=\"form\"\n #formField\n>\n <ng-container *ngFor=\"let error of _errorModels; trackBy: _errorsTrackBy\">\n <span *fdpFormFieldError=\"error.type; let directiveError\">\n <ng-container *ngIf=\"_isAdvancedError(directiveError); else simpleErrorTemplate\">\n <ng-container *ngIf=\"directiveError.heading\">\n <span *fdpFormFieldErrorHeading=\"let validationError; type: directiveError.type\">\n {{ validationError.heading }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"directiveError.description\">\n <span *fdpFormFieldErrorDescription=\"let validationError\">\n {{ validationError.description }}\n </span>\n </ng-container>\n </ng-container>\n <ng-template #simpleErrorTemplate>\n <span *fdpFormFieldErrorHeading=\"let validationError\">\n {{ error.value ? error.value : validationError }}\n </span>\n </ng-template>\n </span>\n </ng-container>\n <ng-container\n [formField]=\"formField\"\n [form]=\"form\"\n [formGroupNamePath]=\"formGroupNamePath\"\n fdpDynamicFormControl\n [id]=\"field.formItem.id || formFieldName\"\n [name]=\"formFieldName\"\n [formItem]=\"field.formItem\"\n >\n </ng-container>\n</fdp-form-field>\n" }]
79
85
  }], ctorParameters: function () { return [{ type: i1.FormGeneratorService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { field: [{
80
86
  type: Input
81
87
  }], form: [{
@@ -96,4 +102,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
96
102
  type: ViewChild,
97
103
  args: [forwardRef(() => FormFieldComponent)]
98
104
  }] } });
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1nZW5lcmF0b3ItZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL2Zvcm0vZm9ybS1nZW5lcmF0b3IvZm9ybS1nZW5lcmF0b3ItZmllbGQvZm9ybS1nZW5lcmF0b3ItZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL2Zvcm0vZm9ybS1nZW5lcmF0b3IvZm9ybS1nZW5lcmF0b3ItZmllbGQvZm9ybS1nZW5lcmF0b3ItZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFHTCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7O0FBSWpFLE1BQU0saUJBQWlCLEdBQWE7SUFDaEMsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztDQUM3RCxDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FBYTtJQUNyQyxPQUFPLEVBQUUsNEJBQTRCO0lBQ3JDLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7Q0FDN0QsQ0FBQztBQVFGLE1BQU0sT0FBTywyQkFBMkI7SUErQ3BDLGNBQWM7SUFDZCxJQUFJLFlBQVk7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNiLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFdBQXFCLENBQUM7U0FDckQ7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLHVCQUF1QixFQUFFO1lBQzlDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBaUIsQ0FBQztTQUNqRDtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUtELGNBQWM7SUFDZCxZQUFvQixVQUFnQyxFQUFVLElBQXVCO1FBQWpFLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFKckYsY0FBYztRQUNkLGlCQUFZLEdBQW1DLEVBQUUsQ0FBQztJQUdzQyxDQUFDO0lBRXpGLGNBQWM7SUFDZCxRQUFRO1FBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsY0FBYztJQUNOLFVBQVU7UUFDZCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUM7UUFFOUQsTUFBTSxZQUFZLEdBQW1DO1lBQ2pEO2dCQUNJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksV0FBVztnQkFDNUMsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKLENBQUM7UUFFRixNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDOUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7WUFFckMsWUFBWSxDQUFDLElBQUksQ0FBQztnQkFDZCxJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUUsVUFBVTthQUNwQixDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxjQUFjO0lBQ2QsZ0JBQWdCLENBQUMsS0FBVTtRQUN2QixPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzVELENBQUM7OEdBbkdRLDJCQUEyQjtrR0FBM0IsMkJBQTJCLHVQQUh6QixDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLDRHQWdEMUIsa0JBQWtCLG9EQ2pGbEQsb3NFQWtEQTs7MkZEZGEsMkJBQTJCO2tCQU52QyxTQUFTOytCQUNJLDBCQUEwQixhQUV6QixDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLGlCQUN2QyxpQkFBaUIsQ0FBQyxJQUFJOzJJQU01QixLQUFLO3NCQUFiLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFNRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQUsyQyxhQUFhO3NCQUE3RCxTQUFTO3VCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIGZvcndhcmRSZWYsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxuICAgIFByb3ZpZGVyLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZEX0ZPUk1fRklFTEQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZEhpbnRPcHRpb25zLCBQbGF0Zm9ybUZvcm1GaWVsZCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvcGxhdGZvcm0vc2hhcmVkJztcbmltcG9ydCB7IEZPUk1fR1JPVVBfQ0hJTERfRklFTERfVE9LRU4gfSBmcm9tICcuLi8uLi9mb3JtLWdyb3VwL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9mb3JtLWdyb3VwL2Zvcm0tZmllbGQvZm9ybS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1Db250cm9sIH0gZnJvbSAnLi4vZHluYW1pYy1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHsgRm9ybUdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuLi9mb3JtLWdlbmVyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNGb3JtR3JvdXAgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1ncm91cCc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUl0ZW1WYWxpZGF0aW9uT2JqZWN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9keW5hbWljLWZvcm0taXRlbSc7XG5cbmNvbnN0IGZvcm1GaWVsZFByb3ZpZGVyOiBQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBGRF9GT1JNX0ZJRUxELFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZvcm1HZW5lcmF0b3JGaWVsZENvbXBvbmVudClcbn07XG5cbmNvbnN0IGZvcm1Hcm91cENoaWxkUHJvdmlkZXI6IFByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IEZPUk1fR1JPVVBfQ0hJTERfRklFTERfVE9LRU4sXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9ybUdlbmVyYXRvckZpZWxkQ29tcG9uZW50KVxufTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZHAtZm9ybS1nZW5lcmF0b3ItZmllbGQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWdlbmVyYXRvci1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbZm9ybUZpZWxkUHJvdmlkZXIsIGZvcm1Hcm91cENoaWxkUHJvdmlkZXJdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUdlbmVyYXRvckZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICAvKipcbiAgICAgKiBGb3JtIGNvbnRyb2wuXG4gICAgICovXG4gICAgQElucHV0KCkgZmllbGQ6IER5bmFtaWNGb3JtQ29udHJvbDtcblxuICAgIC8qKlxuICAgICAqIEZvcm0gZ2VuZXJhdG9yJ3MgZm9ybS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBmb3JtOiBEeW5hbWljRm9ybUdyb3VwO1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRpb25zIHRlbXBsYXRlIHJlZmVyZW5jZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBpMThuOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogRm9ybSBjb250cm9sIG5hbWVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBmb3JtRmllbGROYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQYXRoIG9mIHRoZSBmb3JtIGdyb3VwLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZvcm1Hcm91cE5hbWVQYXRoOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBSYW5rIGlzIHVzZWQgZm9yIG9yZGVyaW5nLlxuICAgICAqIFRoZSBsb3dlciBudW1iZXIgdGhlIGhpZ2hlciBwcmlvcml0eS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSByYW5rOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgZmllbGQgc2hvdWxkIGJlIHZpc2libGUuXG4gICAgICovXG4gICAgQElucHV0KCkgc2hvdWxkU2hvdzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIERlc2NyaWJlcyBoaW50IG9wdGlvbnMgZm9yIGZpZWxkIGxhYmVsXG4gICAgICovXG4gICAgQElucHV0KCkgaGludE9wdGlvbnM/OiBGaWVsZEhpbnRPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogRm9ybSBmaWVsZCBjb21wb25lbnQuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChmb3J3YXJkUmVmKCgpID0+IEZvcm1GaWVsZENvbXBvbmVudCkpIGZpZWxkUmVuZGVyZXI6IFBsYXRmb3JtRm9ybUZpZWxkO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXQgX3BsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5maWVsZCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpZWxkLmZvcm1JdGVtPy5wbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQuZm9ybUl0ZW0/LnBsYWNlaG9sZGVyIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWVsZC5mb3JtSXRlbT8udXNlTWVzc2FnZUFzUGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpZWxkLmZvcm1JdGVtPy5tZXNzYWdlIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZXJyb3JNb2RlbHM6IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55IH1bXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9mZ1NlcnZpY2U6IEZvcm1HZW5lcmF0b3JTZXJ2aWNlLCBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZXJyb3JNb2RlbHMgPSB0aGlzLl9nZXRFcnJvcnMoKTtcbiAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldEVycm9ycygpOiB7IHR5cGU6IHN0cmluZzsgdmFsdWU6IGFueSB9W10ge1xuICAgICAgICBjb25zdCByZWdpc3RlcmVkRXJyb3JzID0gdGhpcy5fZmdTZXJ2aWNlLnZhbGlkYXRpb25FcnJvckhpbnRzO1xuXG4gICAgICAgIGNvbnN0IHJldHVybkVycm9yczogeyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IGAke3RoaXMuZmllbGQuZm9ybUl0ZW0ubmFtZX1WYWxpZGF0b3JgLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVnaXN0ZXJlZEVycm9ycykuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Vycm9yVHlwZSwgZXJyb3JWYWx1ZV0gPSB0eXBlO1xuXG4gICAgICAgICAgICByZXR1cm5FcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogZXJyb3JUeXBlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBlcnJvclZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJldHVybkVycm9ycztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9pc0FkdmFuY2VkRXJyb3IoZXJyb3I6IGFueSk6IGVycm9yIGlzIER5bmFtaWNGb3JtSXRlbVZhbGlkYXRpb25PYmplY3Qge1xuICAgICAgICByZXR1cm4gZXJyb3IuaGVhZGluZyAmJiBlcnJvci5kZXNjcmlwdGlvbiAmJiBlcnJvci50eXBlO1xuICAgIH1cbn1cbiIsIjxmZHAtZm9ybS1maWVsZFxuICAgIFtoaW50XT1cImhpbnRPcHRpb25zXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwiX3BsYWNlaG9sZGVyXCJcbiAgICBbaWRdPVwiZmllbGQuZm9ybUl0ZW0uaWQgfHwgZm9ybUZpZWxkTmFtZVwiXG4gICAgW2NvbHVtbl09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5jb2x1bW4gfHwgMVwiXG4gICAgW2NvbHVtbkxheW91dF09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5jb2x1bW5MYXlvdXRcIlxuICAgIFtjb2xvbl09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5hcHBlbmRDb2xvbiA9PT0gdHJ1ZVwiXG4gICAgW2xhYmVsXT1cImZpZWxkLmZvcm1JdGVtLm1lc3NhZ2VcIlxuICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkLmZvcm1JdGVtLnZhbGlkYXRvcnMgfHwgW11cIlxuICAgIFtyZXF1aXJlZF09XCJmaWVsZC5mb3JtSXRlbS5yZXF1aXJlZFwiXG4gICAgW3JhbmtdPVwicmFua1wiXG4gICAgW2xhYmVsQ29sdW1uTGF5b3V0XT1cImZpZWxkLmZvcm1JdGVtLmd1aU9wdGlvbnM/LmxhYmVsQ29sdW1uTGF5b3V0XCJcbiAgICBbZmllbGRDb2x1bW5MYXlvdXRdPVwiZmllbGQuZm9ybUl0ZW0uZ3VpT3B0aW9ucz8uZmllbGRDb2x1bW5MYXlvdXRcIlxuICAgIFtnYXBDb2x1bW5MYXlvdXRdPVwiZmllbGQuZm9ybUl0ZW0uZ3VpT3B0aW9ucz8uZ2FwQ29sdW1uTGF5b3V0XCJcbiAgICBbbm9MYWJlbExheW91dF09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5ub0xhYmVsTGF5b3V0IHx8IGZhbHNlXCJcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgICNmb3JtRmllbGRcbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlcnJvciBvZiBfZXJyb3JNb2RlbHNcIj5cbiAgICAgICAgPHNwYW4gKmZkcEZvcm1GaWVsZEVycm9yPVwiZXJyb3IudHlwZTsgbGV0IGRpcmVjdGl2ZUVycm9yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX2lzQWR2YW5jZWRFcnJvcihkaXJlY3RpdmVFcnJvcilcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlyZWN0aXZlRXJyb3IuaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqZmRwRm9ybUZpZWxkRXJyb3JIZWFkaW5nPVwibGV0IHZhbGlkYXRpb25FcnJvcjsgdHlwZTogZGlyZWN0aXZlRXJyb3IudHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdmFsaWRhdGlvbkVycm9yLmhlYWRpbmcgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXJlY3RpdmVFcnJvci5kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqZmRwRm9ybUZpZWxkRXJyb3JEZXNjcmlwdGlvbj1cImxldCB2YWxpZGF0aW9uRXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHZhbGlkYXRpb25FcnJvci5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhX2lzQWR2YW5jZWRFcnJvcihkaXJlY3RpdmVFcnJvcilcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqZmRwRm9ybUZpZWxkRXJyb3JIZWFkaW5nPVwibGV0IHZhbGlkYXRpb25FcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBlcnJvci52YWx1ZSA/IGVycm9yLnZhbHVlIDogdmFsaWRhdGlvbkVycm9yIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgIFtmb3JtR3JvdXBOYW1lUGF0aF09XCJmb3JtR3JvdXBOYW1lUGF0aFwiXG4gICAgICAgIGZkcER5bmFtaWNGb3JtQ29udHJvbFxuICAgICAgICBbaWRdPVwiZmllbGQuZm9ybUl0ZW0uaWQgfHwgZm9ybUZpZWxkTmFtZVwiXG4gICAgICAgIFtuYW1lXT1cImZvcm1GaWVsZE5hbWVcIlxuICAgICAgICBbZm9ybUl0ZW1dPVwiZmllbGQuZm9ybUl0ZW1cIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZmRwLWZvcm0tZmllbGQ+XG4iXX0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1nZW5lcmF0b3ItZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL2Zvcm0vZm9ybS1nZW5lcmF0b3IvZm9ybS1nZW5lcmF0b3ItZmllbGQvZm9ybS1nZW5lcmF0b3ItZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL2Zvcm0vZm9ybS1nZW5lcmF0b3IvZm9ybS1nZW5lcmF0b3ItZmllbGQvZm9ybS1nZW5lcmF0b3ItZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFHTCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR2pFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQkFBa0Is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QUNQLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsMkJBQTJCLENBQUM7MklBTWhHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQU1HLElBQUk7c0JBQVosS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSzJDLGFBQWE7c0JBQTdELFNBQVM7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgUHJvdmlkZXIsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRkRfRk9STV9GSUVMRCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL2Zvcm1zJztcbmltcG9ydCB7IEZpZWxkSGludE9wdGlvbnMsIFBsYXRmb3JtRm9ybUZpZWxkIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9wbGF0Zm9ybS9zaGFyZWQnO1xuaW1wb3J0IHsgRk9STV9HUk9VUF9DSElMRF9GSUVMRF9UT0tFTiB9IGZyb20gJy4uLy4uL2Zvcm0tZ3JvdXAvY29uc3RhbnRzJztcbmltcG9ydCB7IEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm0tZ3JvdXAvZm9ybS1maWVsZC9mb3JtLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9keW5hbWljLWZvcm0tY29udHJvbCc7XG5pbXBvcnQgeyBGb3JtR2VuZXJhdG9yU2VydmljZSB9IGZyb20gJy4uL2Zvcm0tZ2VuZXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1Hcm91cCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZHluYW1pYy1mb3JtLWdyb3VwJztcbmltcG9ydCB7IER5bmFtaWNGb3JtSXRlbVZhbGlkYXRpb25PYmplY3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1pdGVtJztcbmltcG9ydCB7IER5bmFtaWNGb3JtQ29udHJvbERpcmVjdGl2ZSB9IGZyb20gJy4uL2R5bmFtaWMtZm9ybS1jb250cm9sLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZkcEZvcm1Hcm91cE1vZHVsZSB9IGZyb20gJy4uLy4uL2Zvcm0tZ3JvdXAvZmRwLWZvcm0ubW9kdWxlJztcblxuY29uc3QgZm9ybUZpZWxkUHJvdmlkZXI6IFByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IEZEX0ZPUk1fRklFTEQsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9ybUdlbmVyYXRvckZpZWxkQ29tcG9uZW50KVxufTtcblxuY29uc3QgZm9ybUdyb3VwQ2hpbGRQcm92aWRlcjogUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogRk9STV9HUk9VUF9DSElMRF9GSUVMRF9UT0tFTixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGb3JtR2VuZXJhdG9yRmllbGRDb21wb25lbnQpXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkcC1mb3JtLWdlbmVyYXRvci1maWVsZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZ2VuZXJhdG9yLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtmb3JtRmllbGRQcm92aWRlciwgZm9ybUdyb3VwQ2hpbGRQcm92aWRlcl0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtGZHBGb3JtR3JvdXBNb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBOZ0ZvciwgTmdJZiwgRHluYW1pY0Zvcm1Db250cm9sRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtR2VuZXJhdG9yRmllbGRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIEZvcm0gY29udHJvbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBmaWVsZDogRHluYW1pY0Zvcm1Db250cm9sO1xuXG4gICAgLyoqXG4gICAgICogRm9ybSBnZW5lcmF0b3IncyBmb3JtLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZvcm06IER5bmFtaWNGb3JtR3JvdXA7XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGlvbnMgdGVtcGxhdGUgcmVmZXJlbmNlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGkxOG46IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBGb3JtIGNvbnRyb2wgbmFtZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZvcm1GaWVsZE5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFBhdGggb2YgdGhlIGZvcm0gZ3JvdXAuXG4gICAgICovXG4gICAgQElucHV0KCkgZm9ybUdyb3VwTmFtZVBhdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFJhbmsgaXMgdXNlZCBmb3Igb3JkZXJpbmcuXG4gICAgICogVGhlIGxvd2VyIG51bWJlciB0aGUgaGlnaGVyIHByaW9yaXR5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHJhbms6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhpcyBmaWVsZCBzaG91bGQgYmUgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBzaG91bGRTaG93OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogRGVzY3JpYmVzIGhpbnQgb3B0aW9ucyBmb3IgZmllbGQgbGFiZWxcbiAgICAgKi9cbiAgICBASW5wdXQoKSBoaW50T3B0aW9ucz86IEZpZWxkSGludE9wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBGb3JtIGZpZWxkIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKGZvcndhcmRSZWYoKCkgPT4gRm9ybUZpZWxkQ29tcG9uZW50KSkgZmllbGRSZW5kZXJlcjogUGxhdGZvcm1Gb3JtRmllbGQ7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGdldCBfcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmllbGQuZm9ybUl0ZW0/LnBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZC5mb3JtSXRlbT8ucGxhY2Vob2xkZXIgYXMgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpZWxkLmZvcm1JdGVtPy51c2VNZXNzYWdlQXNQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQuZm9ybUl0ZW0/Lm1lc3NhZ2UgYXMgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9lcnJvck1vZGVsczogeyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdID0gW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZnU2VydmljZTogRm9ybUdlbmVyYXRvclNlcnZpY2UsIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9lcnJvck1vZGVscyA9IHRoaXMuX2dldEVycm9ycygpO1xuICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2Vycm9yc1RyYWNrQnkoXzogbnVtYmVyLCBlcnJvcjogeyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBhbnkgfSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBlcnJvci50eXBlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2lzQWR2YW5jZWRFcnJvcihlcnJvcjogYW55KTogZXJyb3IgaXMgRHluYW1pY0Zvcm1JdGVtVmFsaWRhdGlvbk9iamVjdCB7XG4gICAgICAgIHJldHVybiBlcnJvci5oZWFkaW5nICYmIGVycm9yLmRlc2NyaXB0aW9uICYmIGVycm9yLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRFcnJvcnMoKTogeyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdIHtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZEVycm9ycyA9IHRoaXMuX2ZnU2VydmljZS52YWxpZGF0aW9uRXJyb3JIaW50cztcblxuICAgICAgICBjb25zdCByZXR1cm5FcnJvcnM6IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55IH1bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBgJHt0aGlzLmZpZWxkLmZvcm1JdGVtLm5hbWV9VmFsaWRhdG9yYCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlZ2lzdGVyZWRFcnJvcnMpLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtlcnJvclR5cGUsIGVycm9yVmFsdWVdID0gdHlwZTtcblxuICAgICAgICAgICAgcmV0dXJuRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IGVycm9yVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXJyb3JWYWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5FcnJvcnM7XG4gICAgfVxufVxuIiwiPGZkcC1mb3JtLWZpZWxkXG4gICAgW2hpbnRdPVwiaGludE9wdGlvbnNcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJfcGxhY2Vob2xkZXJcIlxuICAgIFtpZF09XCJmaWVsZC5mb3JtSXRlbS5pZCB8fCBmb3JtRmllbGROYW1lXCJcbiAgICBbY29sdW1uXT1cImZpZWxkLmZvcm1JdGVtLmd1aU9wdGlvbnM/LmNvbHVtbiB8fCAxXCJcbiAgICBbY29sdW1uTGF5b3V0XT1cImZpZWxkLmZvcm1JdGVtLmd1aU9wdGlvbnM/LmNvbHVtbkxheW91dFwiXG4gICAgW2NvbG9uXT1cImZpZWxkLmZvcm1JdGVtLmd1aU9wdGlvbnM/LmFwcGVuZENvbG9uID09PSB0cnVlXCJcbiAgICBbbGFiZWxdPVwiZmllbGQuZm9ybUl0ZW0ubWVzc2FnZVwiXG4gICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQuZm9ybUl0ZW0udmFsaWRhdG9ycyB8fCBbXVwiXG4gICAgW3JlcXVpcmVkXT1cImZpZWxkLmZvcm1JdGVtLnJlcXVpcmVkXCJcbiAgICBbcmFua109XCJyYW5rXCJcbiAgICBbbGFiZWxDb2x1bW5MYXlvdXRdPVwiZmllbGQuZm9ybUl0ZW0uZ3VpT3B0aW9ucz8ubGFiZWxDb2x1bW5MYXlvdXRcIlxuICAgIFtmaWVsZENvbHVtbkxheW91dF09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5maWVsZENvbHVtbkxheW91dFwiXG4gICAgW2dhcENvbHVtbkxheW91dF09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5nYXBDb2x1bW5MYXlvdXRcIlxuICAgIFtub0xhYmVsTGF5b3V0XT1cImZpZWxkLmZvcm1JdGVtLmd1aU9wdGlvbnM/Lm5vTGFiZWxMYXlvdXQgfHwgZmFsc2VcIlxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgI2Zvcm1GaWVsZFxuPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVycm9yIG9mIF9lcnJvck1vZGVsczsgdHJhY2tCeTogX2Vycm9yc1RyYWNrQnlcIj5cbiAgICAgICAgPHNwYW4gKmZkcEZvcm1GaWVsZEVycm9yPVwiZXJyb3IudHlwZTsgbGV0IGRpcmVjdGl2ZUVycm9yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX2lzQWR2YW5jZWRFcnJvcihkaXJlY3RpdmVFcnJvcik7IGVsc2Ugc2ltcGxlRXJyb3JUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXJlY3RpdmVFcnJvci5oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpmZHBGb3JtRmllbGRFcnJvckhlYWRpbmc9XCJsZXQgdmFsaWRhdGlvbkVycm9yOyB0eXBlOiBkaXJlY3RpdmVFcnJvci50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB2YWxpZGF0aW9uRXJyb3IuaGVhZGluZyB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpcmVjdGl2ZUVycm9yLmRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpmZHBGb3JtRmllbGRFcnJvckRlc2NyaXB0aW9uPVwibGV0IHZhbGlkYXRpb25FcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdmFsaWRhdGlvbkVycm9yLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW1wbGVFcnJvclRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxzcGFuICpmZHBGb3JtRmllbGRFcnJvckhlYWRpbmc9XCJsZXQgdmFsaWRhdGlvbkVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGVycm9yLnZhbHVlID8gZXJyb3IudmFsdWUgOiB2YWxpZGF0aW9uRXJyb3IgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgICBbZm9ybUdyb3VwTmFtZVBhdGhdPVwiZm9ybUdyb3VwTmFtZVBhdGhcIlxuICAgICAgICBmZHBEeW5hbWljRm9ybUNvbnRyb2xcbiAgICAgICAgW2lkXT1cImZpZWxkLmZvcm1JdGVtLmlkIHx8IGZvcm1GaWVsZE5hbWVcIlxuICAgICAgICBbbmFtZV09XCJmb3JtRmllbGROYW1lXCJcbiAgICAgICAgW2Zvcm1JdGVtXT1cImZpZWxkLmZvcm1JdGVtXCJcbiAgICA+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2ZkcC1mb3JtLWZpZWxkPlxuIl19
@@ -8,6 +8,7 @@ import { DynamicFormControl, DynamicFormControlGroup } from './dynamic-form-cont
8
8
  import { FormGeneratorComponentsAccessorService } from './form-generator-components-accessor.service';
9
9
  import { DEFAULT_VALIDATION_ERRORS } from './config/default-validation-errors';
10
10
  import { defaultFormGeneratorConfig, FORM_GENERATOR_CONFIG, FORM_GENERATOR_ITEM_CONFIG } from './providers/providers';
11
+ import { isFormFieldItem } from './helpers';
11
12
  import * as i0 from "@angular/core";
12
13
  import * as i1 from "@angular/forms";
13
14
  import * as i2 from "./form-generator-components-accessor.service";
@@ -53,14 +54,16 @@ export class FormGeneratorService {
53
54
  * @returns `FormGroup` class with the list of `DynamicFormControl` control classes.
54
55
  */
55
56
  async generateForm(formName, formItems) {
57
+ const existingForm = this.forms.get(formName);
56
58
  const form = this._fb.group({});
57
59
  const defaultFormGroup = new DynamicFormControlGroup({
58
60
  name: this._config.ungroupedControlsName
59
61
  }, {});
62
+ defaultFormGroup.formItem.items = new Map();
60
63
  formItems = this._transformFormItems(formItems);
61
64
  formItems.forEach((formItem) => {
62
- if (!this.isFormFieldItem(formItem)) {
63
- if (!formItem.items?.length) {
65
+ if (!isFormFieldItem(formItem)) {
66
+ if (!formItem.items || formItem.items.size === 0) {
64
67
  return;
65
68
  }
66
69
  const group = new DynamicFormControlGroup(formItem, {});
@@ -80,15 +83,15 @@ export class FormGeneratorService {
80
83
  return;
81
84
  }
82
85
  defaultFormGroup.addControl(formItem.name, formControl);
83
- defaultFormGroup.formItem.items = [...[formItem]];
86
+ defaultFormGroup.formItem.items?.set(formItem.name, formItem);
84
87
  formControl.updateValueAndValidity({ emitEvent: false });
85
88
  });
86
89
  const formControlNames = Object.keys(defaultFormGroup.controls);
87
90
  form.addControl(this._config.ungroupedControlsName, defaultFormGroup);
88
91
  // After we created initial form, we need to get dynamic labels, choices and value
89
92
  for (const key of formControlNames) {
90
- const formItem = formItems.find((fi) => fi.name === key);
91
- if (!this.isFormFieldItem(formItem)) {
93
+ const formItem = formItems.get(key);
94
+ if (!isFormFieldItem(formItem)) {
92
95
  continue;
93
96
  }
94
97
  const [[message, placeholder, defaultValue], choices] = await Promise.all([
@@ -107,9 +110,39 @@ export class FormGeneratorService {
107
110
  defaultFormGroup.controls[formItem.name].setValue(formItem.default);
108
111
  defaultFormGroup.controls[key].formItem = formItem;
109
112
  }
113
+ Object.keys(form.controls).forEach((controlName) => {
114
+ const newControl = form.get(controlName);
115
+ const oldControl = existingForm?.get(controlName);
116
+ this._cloneOldFormGroup(newControl, oldControl);
117
+ });
110
118
  this.forms.set(formName, form);
111
119
  return form;
112
120
  }
121
+ /**
122
+ * Adds new control to a form.
123
+ * @param control Control to add
124
+ * @param form Form of the control to be added.
125
+ * @param path Group path.
126
+ */
127
+ async addControl(control, form, path = []) {
128
+ const formGroup = this.getFormControl(form, ...path);
129
+ if (formGroup instanceof DynamicFormControlGroup) {
130
+ const formControl = this._generateDynamicFormItem(control, form);
131
+ formGroup.addControl(control.name, formControl);
132
+ return;
133
+ }
134
+ }
135
+ /**
136
+ * Removes the control with given name from the form.
137
+ * @param controlName
138
+ * @param path
139
+ */
140
+ removeControl(controlName, form, path = []) {
141
+ const formGroup = this.getFormControl(form, ...path);
142
+ if (formGroup instanceof DynamicFormControlGroup) {
143
+ formGroup.removeControl(controlName);
144
+ }
145
+ }
113
146
  /**
114
147
  * @description Returns form value with applied filters and transformers.
115
148
  * @param form Form generator form
@@ -121,7 +154,7 @@ export class FormGeneratorService {
121
154
  const formValue = cloneDeep(form.value);
122
155
  for (const [i, control] of Object.entries(form.controls)) {
123
156
  const formItem = control.formItem;
124
- if (!this.isFormFieldItem(formItem)) {
157
+ if (!isFormFieldItem(formItem)) {
125
158
  formValue[i] = await this.getFormValue(control, renderValue);
126
159
  continue;
127
160
  }
@@ -184,14 +217,6 @@ export class FormGeneratorService {
184
217
  const formValue = this._getFormValueWithoutUngrouped(cloneDeep(form.value));
185
218
  return await this._checkFormControlsVisibility(form, formValue);
186
219
  }
187
- /**
188
- * Is current form item is a field item.
189
- * @param item form item.
190
- * @returns is current form item is a field.
191
- */
192
- isFormFieldItem(item) {
193
- return !!item.type;
194
- }
195
220
  /**
196
221
  * Method for searching a form control inside form group. Can also search inside ungrouped form group.
197
222
  * @param form Form group.
@@ -283,7 +308,7 @@ export class FormGeneratorService {
283
308
  form = form instanceof DynamicFormControlGroup ? form : form;
284
309
  for (const [key, control] of Object.entries(form.controls)) {
285
310
  const formItem = control.formItem;
286
- if (!this.isFormFieldItem(formItem)) {
311
+ if (!isFormFieldItem(formItem)) {
287
312
  const groupVisibleItems = await this._checkFormControlsVisibility(control, formValue);
288
313
  shouldShowFields = Object.assign(shouldShowFields, groupVisibleItems);
289
314
  continue;
@@ -361,10 +386,10 @@ export class FormGeneratorService {
361
386
  /** @hidden */
362
387
  _transformFormItems(formItems) {
363
388
  formItems.forEach((item, index) => {
364
- if (!this.isFormFieldItem(item)) {
389
+ if (!isFormFieldItem(item)) {
365
390
  return;
366
391
  }
367
- formItems[index] = this._getMergedFormFieldItemConfig(item);
392
+ formItems.set(index, this._getMergedFormFieldItemConfig(item));
368
393
  });
369
394
  return formItems;
370
395
  }
@@ -372,7 +397,7 @@ export class FormGeneratorService {
372
397
  async _triggerFieldsOnchange(form) {
373
398
  for (const control of Object.values(form.controls)) {
374
399
  const formItem = control.formItem;
375
- if (!this.isFormFieldItem(formItem)) {
400
+ if (!isFormFieldItem(formItem)) {
376
401
  await this._triggerFieldsOnchange(control);
377
402
  continue;
378
403
  }
@@ -382,6 +407,24 @@ export class FormGeneratorService {
382
407
  }
383
408
  }
384
409
  }
410
+ /** @hidden */
411
+ _cloneOldFormGroup(newGroup, oldGroup) {
412
+ Object.keys(newGroup.controls).forEach((controlName) => {
413
+ const control = newGroup.get(controlName);
414
+ const oldControl = oldGroup?.get(controlName);
415
+ if (!oldControl) {
416
+ return;
417
+ }
418
+ if (control instanceof DynamicFormControlGroup) {
419
+ this._cloneOldFormGroup(control, oldControl);
420
+ return;
421
+ }
422
+ control?.setValue(oldControl.value, { emitEvent: false });
423
+ if (oldControl.touched) {
424
+ control?.markAsTouched();
425
+ }
426
+ });
427
+ }
385
428
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: FormGeneratorService, deps: [{ token: i1.FormBuilder }, { token: i2.FormGeneratorComponentsAccessorService }, { token: FORM_GENERATOR_ITEM_CONFIG, optional: true, skipSelf: true }, { token: FORM_GENERATOR_CONFIG, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
386
429
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: FormGeneratorService }); }
387
430
  }
@@ -402,4 +445,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
402
445
  type: Inject,
403
446
  args: [FORM_GENERATOR_CONFIG]
404
447
  }] }]; } });
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1nZW5lcmF0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vc3JjL2xpYi9mb3JtL2Zvcm0tZ2VuZXJhdG9yL2Zvcm0tZ2VuZXJhdG9yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFFLFFBQVEsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQW9CLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQTJCLE1BQU0sd0JBQXdCLENBQUM7QUFDOUcsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFTdEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFJL0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7QUFFdEg7O0dBRUc7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBb0I3QixjQUFjO0lBQ2QsWUFDWSxHQUFnQixFQUNoQixtQkFBMkQsRUFJM0Qsa0JBQWlELEVBSWpELGVBQTZDO1FBVDdDLFFBQUcsR0FBSCxHQUFHLENBQWE7UUFDaEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUF3QztRQUkzRCx1QkFBa0Is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R0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQTZCLENBQUMsQ0FBQztnQkFDL0YsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDckM7U0FDSjtJQUNMLENBQUM7OEdBOWZRLG9CQUFvQixtR0EwQmpCLDBCQUEwQiw2Q0FJMUIscUJBQXFCO2tIQTlCeEIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkF5QkYsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQywwQkFBMEI7OzBCQUVqQyxRQUFROzswQkFDUixRQUFROzswQkFDUixNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCwgU2tpcFNlbGYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzeW5jVmFsaWRhdG9yRm4sIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgc2VsZWN0U3RyYXRlZ3kgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay91dGlscyc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIG1lcmdlIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNlbGVjdEl0ZW0gfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L3BsYXRmb3JtL3NoYXJlZCc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbnRyb2wsIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLCBEeW5hbWljRm9ybUdyb3VwQ29udHJvbCB9IGZyb20gJy4vZHluYW1pYy1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHsgRm9ybUdlbmVyYXRvckNvbXBvbmVudHNBY2Nlc3NvclNlcnZpY2UgfSBmcm9tICcuL2Zvcm0tZ2VuZXJhdG9yLWNvbXBvbmVudHMtYWNjZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgIER5bmFtaWNGb3JtSXRlbSxcbiAgICBEeW5hbWljRm9ybUl0ZW1DaG9pY2VUeXBlcyxcbiAgICBEeW5hbWljRm9ybVZhbHVlLFxuICAgIFByZXBhcmVkRHluYW1pY0Zvcm1GaWVsZEl0ZW1cbn0gZnJvbSAnLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1pdGVtJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Zvcm0tY29tcG9uZW50LWRlZmluaXRpb24nO1xuaW1wb3J0IHsgREVGQVVMVF9WQUxJREFUSU9OX0VSUk9SUyB9IGZyb20gJy4vY29uZmlnL2RlZmF1bHQtdmFsaWRhdGlvbi1lcnJvcnMnO1xuaW1wb3J0IHsgQmFzZUR5bmFtaWNGb3JtR2VuZXJhdG9yQ29udHJvbCB9IGZyb20gJy4vYmFzZS1keW5hbWljLWZvcm0tZ2VuZXJhdG9yLWNvbnRyb2wnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1Hcm91cCB9IGZyb20gJy4vaW50ZXJmYWNlcy9keW5hbWljLWZvcm0tZ3JvdXAnO1xuaW1wb3J0IHsgRm9ybUdlbmVyYXRvckNvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9mb3JtLWdlbmVyYXRvci1tb2R1bGUtY29uZmlnJztcbmltcG9ydCB7IGRlZmF1bHRGb3JtR2VuZXJhdG9yQ29uZmlnLCBGT1JNX0dFTkVSQVRPUl9DT05GSUcsIEZPUk1fR0VORVJBVE9SX0lURU1fQ09ORklHIH0gZnJvbSAnLi9wcm92aWRlcnMvcHJvdmlkZXJzJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRm9ybSBnZW5lcmF0b3Igc2VydmljZVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRm9ybUdlbmVyYXRvclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIE1hcCBvZiBnZW5lcmF0ZWQgZm9ybXMgdG8gYWNjZXNzIGxhdGVyLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcm1zOiBNYXA8c3RyaW5nLCBEeW5hbWljRm9ybUdyb3VwPiA9IG5ldyBNYXA8c3RyaW5nLCBEeW5hbWljRm9ybUdyb3VwPigpO1xuXG4gICAgLyoqXG4gICAgICogUHJlZGVmaW5lZCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIHZhbGlkYXRpb25FcnJvckhpbnRzID0gREVGQVVMVF9WQUxJREFUSU9OX0VSUk9SUztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBGb3JtR2VuZXJhdG9yQ29uZmlnID0gZGVmYXVsdEZvcm1HZW5lcmF0b3JDb25maWc7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQW4gUnhKUyBTdWJqZWN0IHRoYXQgd2lsbCBraWxsIHRoZSBkYXRhIHN0cmVhbSB1cG9uIGNvbXBvbmVudOKAmXMgZGVzdHJ1Y3Rpb24gKGZvciB1bnN1YnNjcmliaW5nKVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRzQWNjZXNzb3I6IEZvcm1HZW5lcmF0b3JDb21wb25lbnRzQWNjZXNzb3JTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBAU2tpcFNlbGYoKVxuICAgICAgICBASW5qZWN0KEZPUk1fR0VORVJBVE9SX0lURU1fQ09ORklHKVxuICAgICAgICBwcml2YXRlIF9kZWZhdWx0SXRlbUNvbmZpZzogUGFydGlhbDxEeW5hbWljRm9ybUZpZWxkSXRlbT4sXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBTa2lwU2VsZigpXG4gICAgICAgIEBJbmplY3QoRk9STV9HRU5FUkFUT1JfQ09ORklHKVxuICAgICAgICBwcml2YXRlIF9wcm92aWRlZENvbmZpZzogUGFydGlhbDxGb3JtR2VuZXJhdG9yQ29uZmlnPlxuICAgICkge1xuICAgICAgICB0aGlzLl9jb25maWcgPSBtZXJnZShjbG9uZURlZXAodGhpcy5fY29uZmlnKSwgY2xvbmVEZWVwKHRoaXMuX3Byb3ZpZGVkQ29uZmlnKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYEZvcm1Hcm91cGAgY2xhc3Mgd2l0aCB0aGUgbGlzdCBvZiBgRHluYW1pY0Zvcm1Db250cm9sYCBjb250cm9sIGNsYXNzZXNcbiAgICAgKiBkZWZpbmVkIGluIGBmb3JtSXRlbXNgIGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSBmb3JtTmFtZSBGb3JtIG5hbWUuXG4gICAgICogQHBhcmFtIGZvcm1JdGVtcyB0aGUgbGlzdCBvZiBmb3JtIGl0ZW1zIHdoaWNoIHVzZWQgZm9yIGZvcm0gY29udHJvbCBnZW5lcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIGBGb3JtR3JvdXBgIGNsYXNzIHdpdGggdGhlIGxpc3Qgb2YgYER5bmFtaWNGb3JtQ29udHJvbGAgY29udHJvbCBjbGFzc2VzLlxuICAgICAqL1xuICAgIGFzeW5jIGdlbmVyYXRlRm9ybShmb3JtTmFtZTogc3RyaW5nLCBmb3JtSXRlbXM6IER5bmFtaWNGb3JtSXRlbVtdKTogUHJvbWlzZTxEeW5hbWljRm9ybUdyb3VwPiB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLl9mYi5ncm91cCh7fSkgYXMgRHluYW1pY0Zvcm1Hcm91cDtcblxuICAgICAgICBjb25zdCBkZWZhdWx0Rm9ybUdyb3VwID0gbmV3IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7fVxuICAgICAgICApO1xuXG4gICAgICAgIGZvcm1JdGVtcyA9IHRoaXMuX3RyYW5zZm9ybUZvcm1JdGVtcyhmb3JtSXRlbXMpO1xuXG4gICAgICAgIGZvcm1JdGVtcy5mb3JFYWNoKChmb3JtSXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybUZpZWxkSXRlbShmb3JtSXRlbSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1JdGVtLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbmV3IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKGZvcm1JdGVtLCB7fSk7XG5cbiAgICAgICAgICAgICAgICBmb3JtSXRlbS5pdGVtcy5mb3JFYWNoKChncm91cEZvcm1JdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRm9ybUNvbnRyb2wgPSB0aGlzLl9nZW5lcmF0ZUR5bmFtaWNGb3JtSXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwRm9ybUl0ZW0gYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyb3VwRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZENvbnRyb2woZ3JvdXBGb3JtSXRlbS5uYW1lLCBncm91cEZvcm1Db250cm9sKTtcblxuICAgICAgICAgICAgICAgICAgICBncm91cEZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZm9ybS5hZGRDb250cm9sKGZvcm1JdGVtLm5hbWUsIGdyb3VwKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5fZ2VuZXJhdGVEeW5hbWljRm9ybUl0ZW0oZm9ybUl0ZW0gYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSwgZm9ybSk7XG5cbiAgICAgICAgICAgIGlmICghZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuYWRkQ29udHJvbChmb3JtSXRlbS5uYW1lLCBmb3JtQ29udHJvbCk7XG5cbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuZm9ybUl0ZW0uaXRlbXMgPSBbLi4uW2Zvcm1JdGVtXV07XG5cbiAgICAgICAgICAgIGZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbE5hbWVzID0gT2JqZWN0LmtleXMoZGVmYXVsdEZvcm1Hcm91cC5jb250cm9scyk7XG5cbiAgICAgICAgZm9ybS5hZGRDb250cm9sKHRoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWUsIGRlZmF1bHRGb3JtR3JvdXApO1xuXG4gICAgICAgIC8vIEFmdGVyIHdlIGNyZWF0ZWQgaW5pdGlhbCBmb3JtLCB3ZSBuZWVkIHRvIGdldCBkeW5hbWljIGxhYmVscywgY2hvaWNlcyBhbmQgdmFsdWVcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZm9ybUNvbnRyb2xOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBmb3JtSXRlbXMuZmluZCgoZmkpID0+IGZpLm5hbWUgPT09IGtleSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Zvcm1GaWVsZEl0ZW0oZm9ybUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtbbWVzc2FnZSwgcGxhY2Vob2xkZXIsIGRlZmF1bHRWYWx1ZV0sIGNob2ljZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuX2dldEZvcm1JdGVtUHJvcGVydGllczxbc3RyaW5nLCBzdHJpbmcsIGFueV0+KGZvcm1JdGVtLCBkZWZhdWx0Rm9ybUdyb3VwLCBbXG4gICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQnXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0Rm9ybUl0ZW1DaG9pY2VzKGZvcm1JdGVtLCBkZWZhdWx0Rm9ybUdyb3VwKVxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGZvcm1JdGVtLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICAgICAgZm9ybUl0ZW0ucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIGZvcm1JdGVtLmRlZmF1bHQgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICBmb3JtSXRlbS5jaG9pY2VzID0gY2hvaWNlcztcblxuICAgICAgICAgICAgLy8gVXBkYXRlIGZvcm0gdmFsdWUgc2luY2UgaXQgbWlnaHQgYmUgY2hhbmdlZFxuICAgICAgICAgICAgZGVmYXVsdEZvcm1Hcm91cC5jb250cm9sc1tmb3JtSXRlbS5uYW1lXS5zZXRWYWx1ZShmb3JtSXRlbS5kZWZhdWx0KTtcblxuICAgICAgICAgICAgZGVmYXVsdEZvcm1Hcm91cC5jb250cm9sc1trZXldLmZvcm1JdGVtID0gZm9ybUl0ZW0gYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybXMuc2V0KGZvcm1OYW1lLCBmb3JtKTtcblxuICAgICAgICByZXR1cm4gZm9ybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBmb3JtIHZhbHVlIHdpdGggYXBwbGllZCBmaWx0ZXJzIGFuZCB0cmFuc2Zvcm1lcnMuXG4gICAgICogQHBhcmFtIGZvcm0gRm9ybSBnZW5lcmF0b3IgZm9ybVxuICAgICAqIEBwYXJhbSByZW5kZXJWYWx1ZSBXaGV0aGVyIG9yIG5vdCBmb3JtIHZhbHVlIHdpbGwgYmUgdXNlZCBmb3IgcmVuZGVyaW5nIHB1cnBvc2VzLlxuICAgICAqIEByZXR1cm5zIGZvcm0gdmFsdWUgb2JqZWN0LlxuICAgICAqL1xuICAgIGFzeW5jIGdldEZvcm1WYWx1ZShcbiAgICAgICAgZm9ybTogRHluYW1pY0Zvcm1Hcm91cCB8IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLFxuICAgICAgICByZW5kZXJWYWx1ZSA9IGZhbHNlXG4gICAgKTogUHJvbWlzZTxEeW5hbWljRm9ybVZhbHVlPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3RyaWdnZXJGaWVsZHNPbmNoYW5nZShmb3JtKTtcblxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBjbG9uZURlZXAoZm9ybS52YWx1ZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbaSwgY29udHJvbF0gb2YgT2JqZWN0LmVudHJpZXMoZm9ybS5jb250cm9scykpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1JdGVtID0gY29udHJvbC5mb3JtSXRlbTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybUZpZWxkSXRlbShmb3JtSXRlbSkpIHtcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbaV0gPSBhd2FpdCB0aGlzLmdldEZvcm1WYWx1ZShjb250cm9sIGFzIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLCByZW5kZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtSXRlbS5zaG91bGRTaG93ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBmb3JtVmFsdWVbaV07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtSXRlbS50cmFuc2Zvcm1lcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGZvcm1JdGVtLnRyYW5zZm9ybWVyKGZvcm1WYWx1ZVtpXSwgZm9ybVZhbHVlLCBmb3JtSXRlbSk7XG4gICAgICAgICAgICAgICAgZm9ybVZhbHVlW2ldID0gYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVuZGVyVmFsdWUgJiYgZm9ybUl0ZW0udmFsdWVSZW5kZXJlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGZvcm1JdGVtLnZhbHVlUmVuZGVyZXIoZm9ybVZhbHVlW2ldLCBmb3JtVmFsdWUsIGZvcm1JdGVtKTtcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbaV0gPSBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJWYWx1ZSAmJiBmb3JtSXRlbVsnY29udHJvbFR5cGUnXSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtpXSA9IHRoaXMuX2Zvcm1hdFBhc3N3b3JkVmFsdWUoZm9ybVZhbHVlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtVmFsdWVXaXRob3V0VW5ncm91cGVkKGZvcm1WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgY3VzdG9tIGNvbXBvbmVudCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBmb3IgdGhlIGZvcm0gZ2VuZXJhdG9yIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBjb21wb25lbnQgQW5ndWxhciBjb21wb25lbnQuXG4gICAgICogQHBhcmFtIHR5cGVzIHR5cGVzIG9mIHRoZSBmb3JtIGl0ZW0uXG4gICAgICovXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTxCYXNlRHluYW1pY0Zvcm1HZW5lcmF0b3JDb250cm9sPiwgdHlwZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzQWNjZXNzb3IuYWRkQ29tcG9uZW50KGNvbXBvbmVudCwgdHlwZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGJlc3QtbWF0Y2hlZCBjb21wb25lbnQgYmFzZWQgb24gcHJvdmlkZWQgYHR5cGVgIGFyZ3VtZW50XG4gICAgICogQHBhcmFtIHR5cGUgZm9ybSBpdGVtIHR5cGVcbiAgICAgKiBAcmV0dXJucyBAc2VlIEZvcm1Db21wb25lbnREZWZpbml0aW9uIENvbXBvbmVudCBkZWZpbml0aW9uIGZvciB0aGUgZm9ybSBpdGVtXG4gICAgICovXG4gICAgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkJ5VHlwZSh0eXBlOiBzdHJpbmcpOiBGb3JtQ29tcG9uZW50RGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzQWNjZXNzb3IuZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkJ5VHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBPYmplY3Qgb2YgYXZhaWxhYmxlIGVycm9ycywgd2hlcmUga2V5IGlzIGFuIGVycm9yIHR5cGUsXG4gICAgICogYW5kIGl0J3MgdmFsdWUgaXMgYSBkaXNwbGF5IHRleHQuXG4gICAgICovXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9ySGludHMoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uRXJyb3JIaW50c1trZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIGN1c3RvbSBlcnJvciBoaW50IGRlZmluZWQgYnkgdXNlci5cbiAgICAgKiBAcGFyYW0gdHlwZSBlcnJvciB0eXBlIGZyb20gdmFsaWRhdG9yLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBkaXNwbGF5IHRleHQuXG4gICAgICovXG4gICAgYWRkVmFsaWRhdGlvbkVycm9ySGludCh0eXBlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JIaW50c1t0eXBlXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgc29tZSBpdGVtcyBvZiB0aGUgZm9ybSBzaG91bGQgYmUgaGlkZGVuLFxuICAgICAqIG9yIHZpc2libGUgYmFzZWQgb24gYHdoZW5gIG1ldGhvZCByZXN1bHQuXG4gICAgICogQHBhcmFtIGZvcm1cbiAgICAgKiBAcmV0dXJucyBgU2V0YCB3aGVyZSBrZXkgaXMgaXRlbSBuYW1lLCBhbmQgYm9vbGVhbiB2YWx1ZSBpZiBmaWVsZCBuZWVkcyB0byBiZSBzaG93bi5cbiAgICAgKi9cbiAgICBhc3luYyBjaGVja1Zpc2libGVGb3JtSXRlbXMoZm9ybTogRHluYW1pY0Zvcm1Hcm91cCk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5fZ2V0Rm9ybVZhbHVlV2l0aG91dFVuZ3JvdXBlZChjbG9uZURlZXAoZm9ybS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fY2hlY2tGb3JtQ29udHJvbHNWaXNpYmlsaXR5KGZvcm0sIGZvcm1WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY3VycmVudCBmb3JtIGl0ZW0gaXMgYSBmaWVsZCBpdGVtLlxuICAgICAqIEBwYXJhbSBpdGVtIGZvcm0gaXRlbS5cbiAgICAgKiBAcmV0dXJucyBpcyBjdXJyZW50IGZvcm0gaXRlbSBpcyBhIGZpZWxkLlxuICAgICAqL1xuICAgIGlzRm9ybUZpZWxkSXRlbShpdGVtOiBhbnkpOiBpdGVtIGlzIER5bmFtaWNGb3JtRmllbGRJdGVtIHtcbiAgICAgICAgcmV0dXJuICEhKGl0ZW0gYXMgRHluYW1pY0Zvcm1GaWVsZEl0ZW0pLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIGZvciBzZWFyY2hpbmcgYSBmb3JtIGNvbnRyb2wgaW5zaWRlIGZvcm0gZ3JvdXAuIENhbiBhbHNvIHNlYXJjaCBpbnNpZGUgdW5ncm91cGVkIGZvcm0gZ3JvdXAuXG4gICAgICogQHBhcmFtIGZvcm0gRm9ybSBncm91cC5cbiAgICAgKiBAcGFyYW0gY29udHJvbE5hbWVzIE5hbWUgb2YgdGhlIGZvcm0gY29udHJvbC5cbiAgICAgKiBAcmV0dXJucyBGb3VuZCBmb3JtIGNvbnRyb2wuXG4gICAgICovXG4gICAgZ2V0Rm9ybUNvbnRyb2woZm9ybTogRHluYW1pY0Zvcm1Hcm91cCwgLi4uY29udHJvbE5hbWVzOiBzdHJpbmdbXSk6IER5bmFtaWNGb3JtR3JvdXBDb250cm9sIHtcbiAgICAgICAgY29udHJvbE5hbWVzID0gY29udHJvbE5hbWVzLnJlZHVjZSgobmFtZXM6IHN0cmluZ1tdLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICBuYW1lcyA9IFsuLi5uYW1lcywgLi4ubmFtZS5zcGxpdCh0aGlzLl9jb25maWcuY29udHJvbE5hbWVTZXBhcmF0b3IpXTtcblxuICAgICAgICAgICAgcmV0dXJuIG5hbWVzO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgbGV0IGNvbnRyb2wgPSBmb3JtPy5nZXQoY29udHJvbE5hbWVzKTtcblxuICAgICAgICAvLyBJZiBubyBjb250cm9sIGZvdW5kLCB0cnkgdG8gZmluZCBpdCBpbiB1bmdyb3VwZWQgZ3JvdXBcbiAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICBjb250cm9sID0gZm9ybT8uZ2V0KFt0aGlzLl9jb25maWcudW5ncm91cGVkQ29udHJvbHNOYW1lLCAuLi5jb250cm9sTmFtZXNdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250cm9sIGFzIER5bmFtaWNGb3JtR3JvdXBDb250cm9sO1xuICAgIH1cblxuICAgIC8qKiBSZXNldHMgdGhlIGZvcm0gdG8gaXQncyBpbml0aWFsIHN0YXRlLiAqL1xuICAgIHJlc2V0Rm9ybShmb3JtOiBEeW5hbWljRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBPYmplY3QudmFsdWVzKGZvcm0uY29udHJvbHMpKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oY29udHJvbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGRlZmF1bHQgdmFsdWVcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoY29udHJvbC5mb3JtSXRlbS5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2dldEZvcm1WYWx1ZVdpdGhvdXRVbmdyb3VwZWQodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh2YWx1ZVt0aGlzLl9jb25maWcudW5ncm91cGVkQ29udHJvbHNOYW1lXSkge1xuICAgICAgICAgICAgY29uc3QgdW5ncm91cGVkR3JvdXBWYWx1ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IHZhbHVlW3RoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWVdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBmaWVsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1bmdyb3VwZWRHcm91cFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB2YWx1ZVt0aGlzLl9jb25maWcudW5ncm91cGVkQ29udHJvbHNOYW1lXTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9hc3NpZ25Gb3JtSXRlbVZhbGlkYXRvcnMoXG4gICAgICAgIGZvcm1JdGVtOiBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgICAgICBmb3JtOiBEeW5hbWljRm9ybUdyb3VwXG4gICAgKTogUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSB7XG4gICAgICAgIGxldCB2YWxpZGF0b3I6IEFzeW5jVmFsaWRhdG9yRm4gfCBudWxsID0gbnVsbDtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihmb3JtSXRlbS52YWxpZGF0ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvciA9IGFzeW5jIChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gZm9ybUl0ZW0udmFsaWRhdGUhKGNvbnRyb2wudmFsdWUsIHRoaXMuX2dldEZvcm1WYWx1ZVdpdGhvdXRVbmdyb3VwZWQoZm9ybSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuT2JqID0ge307XG5cbiAgICAgICAgICAgICAgICByZXR1cm5PYmpbYCR7KDxEeW5hbWljRm9ybUNvbnRyb2w+Y29udHJvbCkuZm9ybUl0ZW0ubmFtZX1WYWxpZGF0b3JgXSA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJyA/IHRydWUgOiByZXN1bHQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBudWxsID8gcmVzdWx0IDogcmV0dXJuT2JqO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzID0gZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzIHx8IFtdO1xuICAgICAgICAgICAgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzID09PSAnZnVuY3Rpb24nID8gW2Zvcm1JdGVtLmFzeW5jVmFsaWRhdG9yc10gOiBmb3JtSXRlbS5hc3luY1ZhbGlkYXRvcnM7XG5cbiAgICAgICAgICAgIGZvcm1JdGVtLmFzeW5jVmFsaWRhdG9ycy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtSXRlbS52YWxpZGF0b3JzID0gZm9ybUl0ZW0udmFsaWRhdG9ycyB8fCBbVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yXTtcblxuICAgICAgICBmb3JtSXRlbS5yZXF1aXJlZCA9IGZvcm1JdGVtLnJlcXVpcmVkIHx8IGZvcm1JdGVtLnZhbGlkYXRvcnMuaW5jbHVkZXMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1JdGVtO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2VuZXJhdGVEeW5hbWljRm9ybUl0ZW0oXG4gICAgICAgIGZvcm1JdGVtOiBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgICAgICBmb3JtOiBEeW5hbWljRm9ybUdyb3VwXG4gICAgKTogRHluYW1pY0Zvcm1Db250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZm9ybUl0ZW1Db21wb25lbnRUeXBlID0gdGhpcy5nZXRDb21wb25lbnREZWZpbml0aW9uQnlUeXBlKGZvcm1JdGVtLnR5cGUpO1xuXG4gICAgICAgIGlmICghZm9ybUl0ZW1Db21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZvcm0gaXRlbSAnJHtmb3JtSXRlbS5uYW1lfScgd2l0aCB0eXBlICcke2Zvcm1JdGVtLnR5cGV9JyBoYXMgbm8gZGVmaW5lZCBjb21wb25lbnQuXG4gICAgICAgICAgICBQbGVhc2UgdXNlICdhZGRDb21wb25lbnQnIG1ldGhvZCBpbiAke0Zvcm1HZW5lcmF0b3JTZXJ2aWNlLm5hbWV9IHRvIGRlZmluZSBhcHByb3ByaWF0ZSByZWxhdGlvbnMuYCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1JdGVtID0gdGhpcy5fYXNzaWduRm9ybUl0ZW1WYWxpZGF0b3JzKGZvcm1JdGVtLCBmb3JtKTtcblxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IG5ldyBEeW5hbWljRm9ybUNvbnRyb2woZm9ybUl0ZW0uZGVmYXVsdCwge1xuICAgICAgICAgICAgdmFsaWRhdG9yczogZm9ybUl0ZW0udmFsaWRhdG9ycyxcbiAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9yczogZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzLFxuICAgICAgICAgICAgZHluYW1pY0Zvcm1JdGVtOiBmb3JtSXRlbSxcbiAgICAgICAgICAgIHVwZGF0ZU9uOiAnY2hhbmdlJ1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihmb3JtSXRlbS5vbmNoYW5nZSkpIHtcbiAgICAgICAgICAgIGZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg1MCksIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGZvcm1JdGVtLm9uY2hhbmdlISh2YWx1ZSwgdGhpcy5mb3JtcywgZm9ybUNvbnRyb2wpO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9jaGVja0Zvcm1Db250cm9sc1Zpc2liaWxpdHkoXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXAgfCBEeW5hbWljRm9ybUNvbnRyb2xHcm91cCxcbiAgICAgICAgZm9ybVZhbHVlOiBhbnlcbiAgICApOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9PiB7XG4gICAgICAgIGxldCBzaG91bGRTaG93RmllbGRzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICAgICAgICBmb3JtID0gZm9ybSBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwID8gZm9ybSA6IGZvcm07XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBjb250cm9sXSBvZiBPYmplY3QuZW50cmllcyhmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBjb250cm9sLmZvcm1JdGVtO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNGb3JtRmllbGRJdGVtKGZvcm1JdGVtKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwVmlzaWJsZUl0ZW1zID0gYXdhaXQgdGhpcy5fY2hlY2tGb3JtQ29udHJvbHNWaXNpYmlsaXR5KFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sIGFzIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLFxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgc2hvdWxkU2hvd0ZpZWxkcyA9IE9iamVjdC5hc3NpZ24oc2hvdWxkU2hvd0ZpZWxkcywgZ3JvdXBWaXNpYmxlSXRlbXMpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWZvcm1JdGVtLndoZW4pIHtcbiAgICAgICAgICAgICAgICBzaG91bGRTaG93RmllbGRzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvYmogPSBmb3JtSXRlbS53aGVuKGZvcm1WYWx1ZSwgdGhpcy5mb3JtcywgY29udHJvbCk7XG4gICAgICAgICAgICBzaG91bGRTaG93RmllbGRzW2tleV0gPSBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2hvdWxkU2hvd0ZpZWxkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQHBhcmFtIGZvcm1JdGVtXG4gICAgICogQHBhcmFtIGZvcm1cbiAgICAgKiBAcGFyYW0ga2V5XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRGb3JtSXRlbVByb3BlcnR5VmFsdWU8VCA9IHN0cmluZz4oXG4gICAgICAgIGZvcm1JdGVtOiBEeW5hbWljRm9ybUZpZWxkSXRlbSxcbiAgICAgICAgZm9ybTogRHluYW1pY0Zvcm1Hcm91cCxcbiAgICAgICAga2V5OiBrZXlvZiBEeW5hbWljRm9ybUZpZWxkSXRlbVxuICAgICk6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBmb3JtSXRlbVtrZXldO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHZhbHVlKHRoaXMuX2dldEZvcm1WYWx1ZVdpdGhvdXRVbmdyb3VwZWQoZm9ybSkpO1xuXG4gICAgICAgICAgICB2YWx1ZSA9IGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZSh2YWx1ZSkpIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRGb3JtSXRlbVByb3BlcnRpZXM8VFR5cGVzIGV4dGVuZHMgYW55W10gPSBhbnlbXT4oXG4gICAgICAgIGZvcm1JdGVtOiBEeW5hbWljRm9ybUZpZWxkSXRlbSxcbiAgICAgICAgZm9ybTogRHluYW1pY0Zvcm1Hcm91cCxcbiAgICAgICAga2V5czogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPFRUeXBlcz4ge1xuICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fZ2V0Rm9ybUl0ZW1Qcm9wZXJ0eVZhbHVlKGZvcm1JdGVtLCBmb3JtLCBrZXkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKSBhcyBUVHlwZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBwYXJhbSBmb3JtSXRlbVxuICAgICAqIEBwYXJhbSBmb3JtXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRGb3JtSXRlbUNob2ljZXMoZm9ybUl0ZW06IER5bmFtaWNGb3JtRmllbGRJdGVtLCBmb3JtOiBEeW5hbWljRm9ybUdyb3VwKTogUHJvbWlzZTxTZWxlY3RJdGVtW10+IHtcbiAgICAgICAgY29uc3QgZGVmYXVsdENob2ljZXMgPSBhd2FpdCB0aGlzLl9nZXRGb3JtSXRlbVByb3BlcnR5VmFsdWU8RHluYW1pY0Zvcm1JdGVtQ2hvaWNlVHlwZXNbXT4oXG4gICAgICAgICAgICBmb3JtSXRlbSxcbiAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICAnY2hvaWNlcydcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWRlZmF1bHRDaG9pY2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdENob2ljZXMubWFwKChjOiBzdHJpbmcgfCBudW1iZXIgfCBTZWxlY3RJdGVtKSA9PlxuICAgICAgICAgICAgdHlwZW9mIGMgPT09ICdvYmplY3QnID8gYyA6ICh7IGxhYmVsOiBjLCB2YWx1ZTogYyB9IGFzIFNlbGVjdEl0ZW0pXG4gICAgICAgICkgYXMgU2VsZWN0SXRlbVtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB2YWx1ZSBmcm9tIFByb21pc2UtbGlrZSwgT2JzZXJ2YWJsZS1saWtlLCBzaW1wbGUgZnVuY3Rpb24gb3IganVzdCBzb21lIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gb2JqXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRGdW5jdGlvblZhbHVlKG9iajogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBzZWxlY3RTdHJhdGVneShvYmopO1xuXG4gICAgICAgIGxldCByZXN1bHQ6IGFueTtcblxuICAgICAgICBhd2FpdCBzdHJhdGVneS5jcmVhdGVTdWJzY3JpcHRpb24ob2JqLCAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUocmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb3JtYXRQYXNzd29yZFZhbHVlKHBhc3N3b3JkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJyonLnJlcGVhdChwYXNzd29yZD8ubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldE1lcmdlZEZvcm1GaWVsZEl0ZW1Db25maWcoZm9ybUl0ZW06IER5bmFtaWNGb3JtRmllbGRJdGVtKTogRHluYW1pY0Zvcm1GaWVsZEl0ZW0ge1xuICAgICAgICByZXR1cm4gbWVyZ2UoY2xvbmVEZWVwKHRoaXMuX2RlZmF1bHRJdGVtQ29uZmlnKSwgZm9ybUl0ZW0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdHJhbnNmb3JtRm9ybUl0ZW1zKGZvcm1JdGVtczogRHluYW1pY0Zvcm1JdGVtW10pOiBEeW5hbWljRm9ybUl0ZW1bXSB7XG4gICAgICAgIGZvcm1JdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybUZpZWxkSXRlbShpdGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybUl0ZW1zW2luZGV4XSA9IHRoaXMuX2dldE1lcmdlZEZvcm1GaWVsZEl0ZW1Db25maWcoaXRlbSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmb3JtSXRlbXM7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF90cmlnZ2VyRmllbGRzT25jaGFuZ2UoZm9ybTogRHluYW1pY0Zvcm1Hcm91cCB8IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBPYmplY3QudmFsdWVzKGZvcm0uY29udHJvbHMpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtSXRlbSA9IGNvbnRyb2wuZm9ybUl0ZW07XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Zvcm1GaWVsZEl0ZW0oZm9ybUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fdHJpZ2dlckZpZWxkc09uY2hhbmdlKGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZm9ybUl0ZW0ub25jaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBmb3JtSXRlbS5vbmNoYW5nZShjb250cm9sLnZhbHVlIGFzIGFueSwgdGhpcy5mb3JtcywgY29udHJvbCBhcyBEeW5hbWljRm9ybUNvbnRyb2wpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUob2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
448
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1nZW5lcmF0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vc3JjL2xpYi9mb3JtL2Zvcm0tZ2VuZXJhdG9yL2Zvcm0tZ2VuZXJhdG9yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFFLFFBQVEsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQW9CLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQTJCLE1BQU0sd0JBQXdCLENBQUM7QUFDOUcsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFVdEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFJL0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7OztBQUU1Qzs7R0FFRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFvQjdCLGNBQWM7SUFDZCxZQUNZLEdBQWdCLEVBQ2hCLG1CQUEyRCxFQUkzRCxrQkFBaUQsRUFJakQsZUFBNkM7UUFUN0MsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQUNoQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXdDO1FBSTNELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBK0I7UUFJakQsb0JBQWUsR0FBZixlQUFlLENBQThCO1FBOUJ6RDs7V0FFRztRQUNNLFVBQUssR0FBa0MsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFFcEY7O1dBRUc7UUFDSCx5QkFBb0IsR0FBRyx5QkFBeUIsQ0FBQztRQUVqRCxjQUFjO1FBQ0csWUFBTyxHQUF3QiwwQkFBMEIsQ0FBQztRQUUzRTs7O1dBR0c7UUFDYyxnQkFBVyxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBZTlELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDUCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBZ0IsRUFBRSxTQUEwQztRQUMzRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQXFCLENBQUM7UUFFcEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLHVCQUF1QixDQUNoRDtZQUNJLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQjtTQUMzQyxFQUNELEVBQUUsQ0FDTCxDQUFDO1FBRUYsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTVDLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFaEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtvQkFDOUMsT0FBTztpQkFDVjtnQkFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFeEQsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtvQkFDckMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQ2xELGFBQTZDLEVBQzdDLElBQUksQ0FDUCxDQUFDO29CQUVGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTt3QkFDbkIsT0FBTztxQkFDVjtvQkFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztvQkFFdkQsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN0QyxPQUFPO2FBQ1Y7WUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBd0MsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVsRyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNkLE9BQU87YUFDVjtZQUVELGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRXhELGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFOUQsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFdEUsa0ZBQWtGO1FBQ2xGLEtBQUssTUFBTSxHQUFHLElBQUksZ0JBQWdCLEVBQUU7WUFDaEMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM1QixTQUFTO2FBQ1o7WUFFRCxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLHNCQUFzQixDQUF3QixRQUFRLEVBQUUsZ0JBQWdCLEVBQUU7b0JBQzNFLFNBQVM7b0JBQ1QsYUFBYTtvQkFDYixTQUFTO2lCQUNaLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQzthQUN2RCxDQUFDLENBQUM7WUFFSCxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUMzQixRQUFRLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUNuQyxRQUFRLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQztZQUNoQyxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUUzQiw4Q0FBOEM7WUFDOUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXBFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBd0MsQ0FBQztTQUN0RjtRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQy9DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUE0QixDQUFDO1lBQ3BFLE1BQU0sVUFBVSxHQUFHLFlBQVksRUFBRSxHQUFHLENBQUMsV0FBVyxDQUE0QixDQUFDO1lBQzdFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFL0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUF3QixFQUFFLElBQXNCLEVBQUUsT0FBaUIsRUFBRTtRQUNsRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRXJELElBQUksU0FBUyxZQUFZLHVCQUF1QixFQUFFO1lBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUF1QyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pHLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNoRCxPQUFPO1NBQ1Y7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxXQUFtQixFQUFFLElBQXNCLEVBQUUsT0FBaUIsRUFBRTtRQUMxRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRXJELElBQUksU0FBUyxZQUFZLHVCQUF1QixFQUFFO1lBQzlDLFNBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDeEM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUNkLElBQWdELEVBQ2hELFdBQVcsR0FBRyxLQUFLO1FBRW5CLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3RELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFFbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDNUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFrQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUN4RixTQUFTO2FBQ1o7WUFFRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssS0FBSyxFQUFFO2dCQUMvQixPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsU0FBUzthQUNaO1lBRUQsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFO2dCQUN0QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3BFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNwRDtZQUVELElBQUksV0FBVyxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUU7Z0JBQ3ZDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDdEUsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3BEO1lBRUQsSUFBSSxXQUFXLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLFVBQVUsRUFBRTtnQkFDdkQsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxRDtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsU0FBZ0QsRUFBRSxLQUFlO1FBQzFFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCw0QkFBNEIsQ0FBQyxJQUFZO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7O09BR0c7SUFDSCx1QkFBdUIsQ0FBQyxHQUFXO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsc0JBQXNCLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDOUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBc0I7UUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM1RSxPQUFPLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxjQUFjLENBQUMsSUFBc0IsRUFBRSxHQUFHLFlBQXNCO1FBQzVELFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBZSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3pELEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztZQUVyRSxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxJQUFJLE9BQU8sR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXRDLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsT0FBTyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUM5RTtRQUVELE9BQU8sT0FBa0MsQ0FBQztJQUM5QyxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLFNBQVMsQ0FBQyxJQUFzQjtRQUM1QixLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hELElBQUksT0FBTyxZQUFZLHVCQUF1QixFQUFFO2dCQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4QixPQUFPO2FBQ1Y7WUFDRCxvQkFBb0I7WUFDcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVELGNBQWM7SUFDZCw2QkFBNkIsQ0FBQyxLQUFVO1FBQ3BDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUMzQyxNQUFNLG1CQUFtQixHQUF3QixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzNGLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7Z0JBQ3ZFLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUM7YUFDakM7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVqRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsY0FBYztJQUNOLHlCQUF5QixDQUM3QixRQUFzQyxFQUN0QyxJQUFzQjtRQUV0QixJQUFJLFNBQVMsR0FBNEIsSUFBSSxDQUFDO1FBRTlDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMvQixTQUFTLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUMxQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBRXhGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUVqRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBRXJCLFNBQVMsQ0FBQyxHQUF3QixPQUFRLENBQUMsUUFBUSxDQUFDLElBQUksV0FBVyxDQUFDO29CQUNoRSxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUVoRCxPQUFPLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hELENBQUMsQ0FBQztZQUVGLFFBQVEsQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUM7WUFDMUQsUUFBUSxDQUFDLGVBQWU7Z0JBQ3BCLE9BQU8sUUFBUSxDQUFDLGVBQWUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1lBRTNHLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsUUFBUSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXhFLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFM0YsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVELGNBQWM7SUFDTix3QkFBd0IsQ0FDNUIsUUFBc0MsRUFDdEMsSUFBc0I7UUFFdEIsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9FLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsUUFBUSxDQUFDLElBQUksZ0JBQWdCLFFBQVEsQ0FBQyxJQUFJO2tEQUMvQixvQkFBb0IsQ0FBQyxJQUFJLG1DQUFtQyxDQUFDLENBQUM7WUFFcEcsT0FBTztTQUNWO1FBRUQsUUFBUSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFMUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQ3pELFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtZQUMvQixlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7WUFDekMsZUFBZSxFQUFFLFFBQVE7WUFDekIsUUFBUSxFQUFFLFFBQVE7U0FDckIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQy9CLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDbkcsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFFL0QsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXpELE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxjQUFjO0lBQ04sS0FBSyxDQUFDLDRCQUE0QixDQUN0QyxJQUFnRCxFQUNoRCxTQUFjO1FBRWQsSUFBSSxnQkFBZ0IsR0FBK0IsRUFBRSxDQUFDO1FBQ3RELElBQUksR0FBRyxJQUFJLFlBQVksdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTdELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBRWxDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzVCLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQzdELE9BQWtDLEVBQ2xDLFNBQVMsQ0FDWixDQUFDO2dCQUVGLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDdEUsU0FBUzthQUNaO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDN0IsU0FBUzthQUNaO1lBRUQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxRCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3RDtRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLEtBQUssQ0FBQyx5QkFBeUIsQ0FDbkMsUUFBOEIsRUFDOUIsSUFBc0IsRUFDdEIsR0FBK0I7UUFFL0IsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTFCLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO1lBQzdCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUU1RCxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDN0M7UUFFRCxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQU0sQ0FBQztJQUN0RCxDQUFDO0lBRUQsY0FBYztJQUNOLEtBQUssQ0FBQyxzQkFBc0IsQ0FDaEMsUUFBOEIsRUFDOUIsSUFBc0IsRUFDdEIsSUFBYztRQUVkLE1BQU0sUUFBUSxHQUFtQixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQVcsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBOEIsRUFBRSxJQUFzQjtRQUNwRixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FDdkQsUUFBUSxFQUNSLElBQUksRUFDSixTQUFTLENBQ1osQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDakIsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQStCLEVBQUUsRUFBRSxDQUMxRCxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQWlCLENBQ3JELENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQVE7UUFDcEMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXJDLElBQUksTUFBVyxDQUFDO1FBRWhCLE1BQU0sUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ2xELE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNwQixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxjQUFjO0lBQ04sb0JBQW9CLENBQUMsUUFBZ0I7UUFDekMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsY0FBYztJQUNOLDZCQUE2QixDQUFDLFFBQTRCO1FBQzlELE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsY0FBYztJQUNOLG1CQUFtQixDQUFDLFNBQTBDO1FBQ2xFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDeEIsT0FBTzthQUNWO1lBRUQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsY0FBYztJQUNOLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFnRDtRQUNqRixLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFFbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDNUIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBa0MsQ0FBQyxDQUFDO2dCQUN0RSxTQUFTO2FBQ1o7WUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7Z0JBQ25CLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQTZCLENBQUMsQ0FBQztnQkFDL0YsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDckM7U0FDSjtJQUNMLENBQUM7SUFFRCxjQUFjO0lBQ04sa0JBQWtCLENBQUMsUUFBaUMsRUFBRSxRQUFrQztRQUM1RixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNuRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sVUFBVSxHQUFHLFFBQVEsRUFBRSxHQUFHLENBQUMsV0FBVyxDQUE0QixDQUFDO1lBQ3pFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2IsT0FBTzthQUNWO1lBQ0QsSUFBSSxPQUFPLFlBQVksdUJBQXVCLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzdDLE9BQU87YUFDVjtZQUVELE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRTFELElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtnQkFDcEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO2FBQzVCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzhHQWhqQlEsb0JBQW9CLG1HQTBCakIsMEJBQTBCLDZDQUkxQixxQkFBcUI7a0hBOUJ4QixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVU7OzBCQXlCRixRQUFROzswQkFDUixRQUFROzswQkFDUixNQUFNOzJCQUFDLDBCQUEwQjs7MEJBRWpDLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBTa2lwU2VsZiwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXN5bmNWYWxpZGF0b3JGbiwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBzZWxlY3RTdHJhdGVneSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7IGNsb25lRGVlcCwgbWVyZ2UgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2VsZWN0SXRlbSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvcGxhdGZvcm0vc2hhcmVkJztcbmltcG9ydCB7IER5bmFtaWNGb3JtQ29udHJvbCwgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAsIER5bmFtaWNGb3JtR3JvdXBDb250cm9sIH0gZnJvbSAnLi9keW5hbWljLWZvcm0tY29udHJvbCc7XG5pbXBvcnQgeyBGb3JtR2VuZXJhdG9yQ29tcG9uZW50c0FjY2Vzc29yU2VydmljZSB9IGZyb20gJy4vZm9ybS1nZW5lcmF0b3ItY29tcG9uZW50cy1hY2Nlc3Nvci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgRHluYW1pY0Zvcm1GaWVsZEl0ZW0sXG4gICAgRHluYW1pY0Zvcm1JdGVtLFxuICAgIER5bmFtaWNGb3JtSXRlbUNob2ljZVR5cGVzLFxuICAgIER5bmFtaWNGb3JtSXRlbU1hcCxcbiAgICBEeW5hbWljRm9ybVZhbHVlLFxuICAgIFByZXBhcmVkRHluYW1pY0Zvcm1GaWVsZEl0ZW1cbn0gZnJvbSAnLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1pdGVtJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Zvcm0tY29tcG9uZW50LWRlZmluaXRpb24nO1xuaW1wb3J0IHsgREVGQVVMVF9WQUxJREFUSU9OX0VSUk9SUyB9IGZyb20gJy4vY29uZmlnL2RlZmF1bHQtdmFsaWRhdGlvbi1lcnJvcnMnO1xuaW1wb3J0IHsgQmFzZUR5bmFtaWNGb3JtR2VuZXJhdG9yQ29udHJvbCB9IGZyb20gJy4vYmFzZS1keW5hbWljLWZvcm0tZ2VuZXJhdG9yLWNvbnRyb2wnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1Hcm91cCB9IGZyb20gJy4vaW50ZXJmYWNlcy9keW5hbWljLWZvcm0tZ3JvdXAnO1xuaW1wb3J0IHsgRm9ybUdlbmVyYXRvckNvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9mb3JtLWdlbmVyYXRvci1tb2R1bGUtY29uZmlnJztcbmltcG9ydCB7IGRlZmF1bHRGb3JtR2VuZXJhdG9yQ29uZmlnLCBGT1JNX0dFTkVSQVRPUl9DT05GSUcsIEZPUk1fR0VORVJBVE9SX0lURU1fQ09ORklHIH0gZnJvbSAnLi9wcm92aWRlcnMvcHJvdmlkZXJzJztcbmltcG9ydCB7IGlzRm9ybUZpZWxkSXRlbSB9IGZyb20gJy4vaGVscGVycyc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZvcm0gZ2VuZXJhdG9yIHNlcnZpY2VcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvcm1HZW5lcmF0b3JTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAgKiBNYXAgb2YgZ2VuZXJhdGVkIGZvcm1zIHRvIGFjY2VzcyBsYXRlci5cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3JtczogTWFwPHN0cmluZywgRHluYW1pY0Zvcm1Hcm91cD4gPSBuZXcgTWFwPHN0cmluZywgRHluYW1pY0Zvcm1Hcm91cD4oKTtcblxuICAgIC8qKlxuICAgICAqIFByZWRlZmluZWQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICB2YWxpZGF0aW9uRXJyb3JIaW50cyA9IERFRkFVTFRfVkFMSURBVElPTl9FUlJPUlM7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogRm9ybUdlbmVyYXRvckNvbmZpZyA9IGRlZmF1bHRGb3JtR2VuZXJhdG9yQ29uZmlnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFuIFJ4SlMgU3ViamVjdCB0aGF0IHdpbGwga2lsbCB0aGUgZGF0YSBzdHJlYW0gdXBvbiBjb21wb25lbnTigJlzIGRlc3RydWN0aW9uIChmb3IgdW5zdWJzY3JpYmluZylcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2ZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50c0FjY2Vzc29yOiBGb3JtR2VuZXJhdG9yQ29tcG9uZW50c0FjY2Vzc29yU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQFNraXBTZWxmKClcbiAgICAgICAgQEluamVjdChGT1JNX0dFTkVSQVRPUl9JVEVNX0NPTkZJRylcbiAgICAgICAgcHJpdmF0ZSBfZGVmYXVsdEl0ZW1Db25maWc6IFBhcnRpYWw8RHluYW1pY0Zvcm1GaWVsZEl0ZW0+LFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBAU2tpcFNlbGYoKVxuICAgICAgICBASW5qZWN0KEZPUk1fR0VORVJBVE9SX0NPTkZJRylcbiAgICAgICAgcHJpdmF0ZSBfcHJvdmlkZWRDb25maWc6IFBhcnRpYWw8Rm9ybUdlbmVyYXRvckNvbmZpZz5cbiAgICApIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gbWVyZ2UoY2xvbmVEZWVwKHRoaXMuX2NvbmZpZyksIGNsb25lRGVlcCh0aGlzLl9wcm92aWRlZENvbmZpZykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGBGb3JtR3JvdXBgIGNsYXNzIHdpdGggdGhlIGxpc3Qgb2YgYER5bmFtaWNGb3JtQ29udHJvbGAgY29udHJvbCBjbGFzc2VzXG4gICAgICogZGVmaW5lZCBpbiBgZm9ybUl0ZW1zYCBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0gZm9ybU5hbWUgRm9ybSBuYW1lLlxuICAgICAqIEBwYXJhbSBmb3JtSXRlbXMgdGhlIGxpc3Qgb2YgZm9ybSBpdGVtcyB3aGljaCB1c2VkIGZvciBmb3JtIGNvbnRyb2wgZ2VuZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBgRm9ybUdyb3VwYCBjbGFzcyB3aXRoIHRoZSBsaXN0IG9mIGBEeW5hbWljRm9ybUNvbnRyb2xgIGNvbnRyb2wgY2xhc3Nlcy5cbiAgICAgKi9cbiAgICBhc3luYyBnZW5lcmF0ZUZvcm0oZm9ybU5hbWU6IHN0cmluZywgZm9ybUl0ZW1zOiBNYXA8c3RyaW5nLCBEeW5hbWljRm9ybUl0ZW1NYXA+KTogUHJvbWlzZTxEeW5hbWljRm9ybUdyb3VwPiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRm9ybSA9IHRoaXMuZm9ybXMuZ2V0KGZvcm1OYW1lKTtcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuX2ZiLmdyb3VwKHt9KSBhcyBEeW5hbWljRm9ybUdyb3VwO1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRGb3JtR3JvdXAgPSBuZXcgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5fY29uZmlnLnVuZ3JvdXBlZENvbnRyb2xzTmFtZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgZGVmYXVsdEZvcm1Hcm91cC5mb3JtSXRlbS5pdGVtcyA9IG5ldyBNYXAoKTtcblxuICAgICAgICBmb3JtSXRlbXMgPSB0aGlzLl90cmFuc2Zvcm1Gb3JtSXRlbXMoZm9ybUl0ZW1zKTtcblxuICAgICAgICBmb3JtSXRlbXMuZm9yRWFjaCgoZm9ybUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNGb3JtRmllbGRJdGVtKGZvcm1JdGVtKSkge1xuICAgICAgICAgICAgICAgIGlmICghZm9ybUl0ZW0uaXRlbXMgfHwgZm9ybUl0ZW0uaXRlbXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAoZm9ybUl0ZW0sIHt9KTtcblxuICAgICAgICAgICAgICAgIGZvcm1JdGVtLml0ZW1zLmZvckVhY2goKGdyb3VwRm9ybUl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBGb3JtQ29udHJvbCA9IHRoaXMuX2dlbmVyYXRlRHluYW1pY0Zvcm1JdGVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGb3JtSXRlbSBhcyBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZ3JvdXBGb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYWRkQ29udHJvbChncm91cEZvcm1JdGVtLm5hbWUsIGdyb3VwRm9ybUNvbnRyb2wpO1xuXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwRm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBmb3JtLmFkZENvbnRyb2woZm9ybUl0ZW0ubmFtZSwgZ3JvdXApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLl9nZW5lcmF0ZUR5bmFtaWNGb3JtSXRlbShmb3JtSXRlbSBhcyBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtLCBmb3JtKTtcblxuICAgICAgICAgICAgaWYgKCFmb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdEZvcm1Hcm91cC5hZGRDb250cm9sKGZvcm1JdGVtLm5hbWUsIGZvcm1Db250cm9sKTtcblxuICAgICAgICAgICAgZGVmYXVsdEZvcm1Hcm91cC5mb3JtSXRlbS5pdGVtcz8uc2V0KGZvcm1JdGVtLm5hbWUsIGZvcm1JdGVtKTtcblxuICAgICAgICAgICAgZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sTmFtZXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0Rm9ybUdyb3VwLmNvbnRyb2xzKTtcblxuICAgICAgICBmb3JtLmFkZENvbnRyb2wodGhpcy5fY29uZmlnLnVuZ3JvdXBlZENvbnRyb2xzTmFtZSwgZGVmYXVsdEZvcm1Hcm91cCk7XG5cbiAgICAgICAgLy8gQWZ0ZXIgd2UgY3JlYXRlZCBpbml0aWFsIGZvcm0sIHdlIG5lZWQgdG8gZ2V0IGR5bmFtaWMgbGFiZWxzLCBjaG9pY2VzIGFuZCB2YWx1ZVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmb3JtQ29udHJvbE5hbWVzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtSXRlbSA9IGZvcm1JdGVtcy5nZXQoa2V5KTtcblxuICAgICAgICAgICAgaWYgKCFpc0Zvcm1GaWVsZEl0ZW0oZm9ybUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtbbWVzc2FnZSwgcGxhY2Vob2xkZXIsIGRlZmF1bHRWYWx1ZV0sIGNob2ljZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuX2dldEZvcm1JdGVtUHJvcGVydGllczxbc3RyaW5nLCBzdHJpbmcsIGFueV0+KGZvcm1JdGVtLCBkZWZhdWx0Rm9ybUdyb3VwLCBbXG4gICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQnXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0Rm9ybUl0ZW1DaG9pY2VzKGZvcm1JdGVtLCBkZWZhdWx0Rm9ybUdyb3VwKVxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGZvcm1JdGVtLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICAgICAgZm9ybUl0ZW0ucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIGZvcm1JdGVtLmRlZmF1bHQgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICBmb3JtSXRlbS5jaG9pY2VzID0gY2hvaWNlcztcblxuICAgICAgICAgICAgLy8gVXBkYXRlIGZvcm0gdmFsdWUgc2luY2UgaXQgbWlnaHQgYmUgY2hhbmdlZFxuICAgICAgICAgICAgZGVmYXVsdEZvcm1Hcm91cC5jb250cm9sc1tmb3JtSXRlbS5uYW1lXS5zZXRWYWx1ZShmb3JtSXRlbS5kZWZhdWx0KTtcblxuICAgICAgICAgICAgZGVmYXVsdEZvcm1Hcm91cC5jb250cm9sc1trZXldLmZvcm1JdGVtID0gZm9ybUl0ZW0gYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpLmZvckVhY2goKGNvbnRyb2xOYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250cm9sID0gZm9ybS5nZXQoY29udHJvbE5hbWUpIGFzIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwO1xuICAgICAgICAgICAgY29uc3Qgb2xkQ29udHJvbCA9IGV4aXN0aW5nRm9ybT8uZ2V0KGNvbnRyb2xOYW1lKSBhcyBEeW5hbWljRm9ybUNvbnRyb2xHcm91cDtcbiAgICAgICAgICAgIHRoaXMuX2Nsb25lT2xkRm9ybUdyb3VwKG5ld0NvbnRyb2wsIG9sZENvbnRyb2wpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm1zLnNldChmb3JtTmFtZSwgZm9ybSk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgY29udHJvbCB0byBhIGZvcm0uXG4gICAgICogQHBhcmFtIGNvbnRyb2wgQ29udHJvbCB0byBhZGRcbiAgICAgKiBAcGFyYW0gZm9ybSBGb3JtIG9mIHRoZSBjb250cm9sIHRvIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBwYXRoIEdyb3VwIHBhdGguXG4gICAgICovXG4gICAgYXN5bmMgYWRkQ29udHJvbChjb250cm9sOiBEeW5hbWljRm9ybUl0ZW0sIGZvcm06IER5bmFtaWNGb3JtR3JvdXAsIHBhdGg6IHN0cmluZ1tdID0gW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRGb3JtQ29udHJvbChmb3JtLCAuLi5wYXRoKTtcblxuICAgICAgICBpZiAoZm9ybUdyb3VwIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5fZ2VuZXJhdGVEeW5hbWljRm9ybUl0ZW0oY29udHJvbCBhcyBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtLCBmb3JtKTtcbiAgICAgICAgICAgIGZvcm1Hcm91cC5hZGRDb250cm9sKGNvbnRyb2wubmFtZSwgZm9ybUNvbnRyb2wpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY29udHJvbCB3aXRoIGdpdmVuIG5hbWUgZnJvbSB0aGUgZm9ybS5cbiAgICAgKiBAcGFyYW0gY29udHJvbE5hbWVcbiAgICAgKiBAcGFyYW0gcGF0aFxuICAgICAqL1xuICAgIHJlbW92ZUNvbnRyb2woY29udHJvbE5hbWU6IHN0cmluZywgZm9ybTogRHluYW1pY0Zvcm1Hcm91cCwgcGF0aDogc3RyaW5nW10gPSBbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmdldEZvcm1Db250cm9sKGZvcm0sIC4uLnBhdGgpO1xuXG4gICAgICAgIGlmIChmb3JtR3JvdXAgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUNvbnRyb2xHcm91cCkge1xuICAgICAgICAgICAgZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woY29udHJvbE5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgZm9ybSB2YWx1ZSB3aXRoIGFwcGxpZWQgZmlsdGVycyBhbmQgdHJhbnNmb3JtZXJzLlxuICAgICAqIEBwYXJhbSBmb3JtIEZvcm0gZ2VuZXJhdG9yIGZvcm1cbiAgICAgKiBAcGFyYW0gcmVuZGVyVmFsdWUgV2hldGhlciBvciBub3QgZm9ybSB2YWx1ZSB3aWxsIGJlIHVzZWQgZm9yIHJlbmRlcmluZyBwdXJwb3Nlcy5cbiAgICAgKiBAcmV0dXJucyBmb3JtIHZhbHVlIG9iamVjdC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRGb3JtVmFsdWUoXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXAgfCBEeW5hbWljRm9ybUNvbnRyb2xHcm91cCxcbiAgICAgICAgcmVuZGVyVmFsdWUgPSBmYWxzZVxuICAgICk6IFByb21pc2U8RHluYW1pY0Zvcm1WYWx1ZT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl90cmlnZ2VyRmllbGRzT25jaGFuZ2UoZm9ybSk7XG5cbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gY2xvbmVEZWVwKGZvcm0udmFsdWUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2ksIGNvbnRyb2xdIG9mIE9iamVjdC5lbnRyaWVzKGZvcm0uY29udHJvbHMpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtSXRlbSA9IGNvbnRyb2wuZm9ybUl0ZW07XG5cbiAgICAgICAgICAgIGlmICghaXNGb3JtRmllbGRJdGVtKGZvcm1JdGVtKSkge1xuICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtpXSA9IGF3YWl0IHRoaXMuZ2V0Rm9ybVZhbHVlKGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAsIHJlbmRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZvcm1JdGVtLnNob3VsZFNob3cgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGZvcm1WYWx1ZVtpXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZvcm1JdGVtLnRyYW5zZm9ybWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gZm9ybUl0ZW0udHJhbnNmb3JtZXIoZm9ybVZhbHVlW2ldLCBmb3JtVmFsdWUsIGZvcm1JdGVtKTtcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbaV0gPSBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJWYWx1ZSAmJiBmb3JtSXRlbS52YWx1ZVJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gZm9ybUl0ZW0udmFsdWVSZW5kZXJlcihmb3JtVmFsdWVbaV0sIGZvcm1WYWx1ZSwgZm9ybUl0ZW0pO1xuICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtpXSA9IGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUob2JqKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbmRlclZhbHVlICYmIGZvcm1JdGVtWydjb250cm9sVHlwZSddID09PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICAgICAgZm9ybVZhbHVlW2ldID0gdGhpcy5fZm9ybWF0UGFzc3dvcmRWYWx1ZShmb3JtVmFsdWVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZvcm1WYWx1ZVdpdGhvdXRVbmdyb3VwZWQoZm9ybVZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyBjdXN0b20gY29tcG9uZW50IHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGZvciB0aGUgZm9ybSBnZW5lcmF0b3IgaXRlbXMuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudCBBbmd1bGFyIGNvbXBvbmVudC5cbiAgICAgKiBAcGFyYW0gdHlwZXMgdHlwZXMgb2YgdGhlIGZvcm0gaXRlbS5cbiAgICAgKi9cbiAgICBhZGRDb21wb25lbnQoY29tcG9uZW50OiBUeXBlPEJhc2VEeW5hbWljRm9ybUdlbmVyYXRvckNvbnRyb2w+LCB0eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudHNBY2Nlc3Nvci5hZGRDb21wb25lbnQoY29tcG9uZW50LCB0eXBlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYmVzdC1tYXRjaGVkIGNvbXBvbmVudCBiYXNlZCBvbiBwcm92aWRlZCBgdHlwZWAgYXJndW1lbnRcbiAgICAgKiBAcGFyYW0gdHlwZSBmb3JtIGl0ZW0gdHlwZVxuICAgICAqIEByZXR1cm5zIEBzZWUgRm9ybUNvbXBvbmVudERlZmluaXRpb24gQ29tcG9uZW50IGRlZmluaXRpb24gZm9yIHRoZSBmb3JtIGl0ZW1cbiAgICAgKi9cbiAgICBnZXRDb21wb25lbnREZWZpbml0aW9uQnlUeXBlKHR5cGU6IHN0cmluZyk6IEZvcm1Db21wb25lbnREZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudHNBY2Nlc3Nvci5nZXRDb21wb25lbnREZWZpbml0aW9uQnlUeXBlKHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIE9iamVjdCBvZiBhdmFpbGFibGUgZXJyb3JzLCB3aGVyZSBrZXkgaXMgYW4gZXJyb3IgdHlwZSxcbiAgICAgKiBhbmQgaXQncyB2YWx1ZSBpcyBhIGRpc3BsYXkgdGV4dC5cbiAgICAgKi9cbiAgICBnZXRWYWxpZGF0aW9uRXJyb3JIaW50cyhrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25FcnJvckhpbnRzW2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgY3VzdG9tIGVycm9yIGhpbnQgZGVmaW5lZCBieSB1c2VyLlxuICAgICAqIEBwYXJhbSB0eXBlIGVycm9yIHR5cGUgZnJvbSB2YWxpZGF0b3IuXG4gICAgICogQHBhcmFtIHZhbHVlIGRpc3BsYXkgdGV4dC5cbiAgICAgKi9cbiAgICBhZGRWYWxpZGF0aW9uRXJyb3JIaW50KHR5cGU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25FcnJvckhpbnRzW3R5cGVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBzb21lIGl0ZW1zIG9mIHRoZSBmb3JtIHNob3VsZCBiZSBoaWRkZW4sXG4gICAgICogb3IgdmlzaWJsZSBiYXNlZCBvbiBgd2hlbmAgbWV0aG9kIHJlc3VsdC5cbiAgICAgKiBAcGFyYW0gZm9ybVxuICAgICAqIEByZXR1cm5zIGBTZXRgIHdoZXJlIGtleSBpcyBpdGVtIG5hbWUsIGFuZCBib29sZWFuIHZhbHVlIGlmIGZpZWxkIG5lZWRzIHRvIGJlIHNob3duLlxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrVmlzaWJsZUZvcm1JdGVtcyhmb3JtOiBEeW5hbWljRm9ybUdyb3VwKTogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLl9nZXRGb3JtVmFsdWVXaXRob3V0VW5ncm91cGVkKGNsb25lRGVlcChmb3JtLnZhbHVlKSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9jaGVja0Zvcm1Db250cm9sc1Zpc2liaWxpdHkoZm9ybSwgZm9ybVZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgZm9yIHNlYXJjaGluZyBhIGZvcm0gY29udHJvbCBpbnNpZGUgZm9ybSBncm91cC4gQ2FuIGFsc28gc2VhcmNoIGluc2lkZSB1bmdyb3VwZWQgZm9ybSBncm91cC5cbiAgICAgKiBAcGFyYW0gZm9ybSBGb3JtIGdyb3VwLlxuICAgICAqIEBwYXJhbSBjb250cm9sTmFtZXMgTmFtZSBvZiB0aGUgZm9ybSBjb250cm9sLlxuICAgICAqIEByZXR1cm5zIEZvdW5kIGZvcm0gY29udHJvbC5cbiAgICAgKi9cbiAgICBnZXRGb3JtQ29udHJvbChmb3JtOiBEeW5hbWljRm9ybUdyb3VwLCAuLi5jb250cm9sTmFtZXM6IHN0cmluZ1tdKTogRHluYW1pY0Zvcm1Hcm91cENvbnRyb2wge1xuICAgICAgICBjb250cm9sTmFtZXMgPSBjb250cm9sTmFtZXMucmVkdWNlKChuYW1lczogc3RyaW5nW10sIG5hbWUpID0+IHtcbiAgICAgICAgICAgIG5hbWVzID0gWy4uLm5hbWVzLCAuLi5uYW1lLnNwbGl0KHRoaXMuX2NvbmZpZy5jb250cm9sTmFtZVNlcGFyYXRvcildO1xuXG4gICAgICAgICAgICByZXR1cm4gbmFtZXM7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICBsZXQgY29udHJvbCA9IGZvcm0/LmdldChjb250cm9sTmFtZXMpO1xuXG4gICAgICAgIC8vIElmIG5vIGNvbnRyb2wgZm91bmQsIHRyeSB0byBmaW5kIGl0IGluIHVuZ3JvdXBlZCBncm91cFxuICAgICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wgPSBmb3JtPy5nZXQoW3RoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWUsIC4uLmNvbnRyb2xOYW1lc10pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Hcm91cENvbnRyb2w7XG4gICAgfVxuXG4gICAgLyoqIFJlc2V0cyB0aGUgZm9ybSB0byBpdCdzIGluaXRpYWwgc3RhdGUuICovXG4gICAgcmVzZXRGb3JtKGZvcm06IER5bmFtaWNGb3JtR3JvdXApOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIE9iamVjdC52YWx1ZXMoZm9ybS5jb250cm9scykpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybShjb250cm9sKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShjb250cm9sLmZvcm1JdGVtLmRlZmF1bHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZ2V0Rm9ybVZhbHVlV2l0aG91dFVuZ3JvdXBlZCh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHZhbHVlW3RoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWVdKSB7XG4gICAgICAgICAgICBjb25zdCB1bmdyb3VwZWRHcm91cFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gdmFsdWVbdGhpcy5fY29uZmlnLnVuZ3JvdXBlZENvbnRyb2xzTmFtZV07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGZpZWxkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHVuZ3JvdXBlZEdyb3VwVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVbZmllbGROYW1lXSA9IGZpZWxkVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHZhbHVlW3RoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWVdO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2Fzc2lnbkZvcm1JdGVtVmFsaWRhdG9ycyhcbiAgICAgICAgZm9ybUl0ZW06IFByZXBhcmVkRHluYW1pY0Zvcm1GaWVsZEl0ZW0sXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXBcbiAgICApOiBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtIHtcbiAgICAgICAgbGV0IHZhbGlkYXRvcjogQXN5bmNWYWxpZGF0b3JGbiB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGZvcm1JdGVtLnZhbGlkYXRlKSkge1xuICAgICAgICAgICAgdmFsaWRhdG9yID0gYXN5bmMgKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBmb3JtSXRlbS52YWxpZGF0ZSEoY29udHJvbC52YWx1ZSwgdGhpcy5fZ2V0Rm9ybVZhbHVlV2l0aG91dFVuZ3JvdXBlZChmb3JtKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5PYmogPSB7fTtcblxuICAgICAgICAgICAgICAgIHJldHVybk9ialtgJHsoPER5bmFtaWNGb3JtQ29udHJvbD5jb250cm9sKS5mb3JtSXRlbS5uYW1lfVZhbGlkYXRvcmBdID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nID8gdHJ1ZSA6IHJlc3VsdDtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IG51bGwgPyByZXN1bHQgOiByZXR1cm5PYmo7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3JtSXRlbS5hc3luY1ZhbGlkYXRvcnMgPSBmb3JtSXRlbS5hc3luY1ZhbGlkYXRvcnMgfHwgW107XG4gICAgICAgICAgICBmb3JtSXRlbS5hc3luY1ZhbGlkYXRvcnMgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBmb3JtSXRlbS5hc3luY1ZhbGlkYXRvcnMgPT09ICdmdW5jdGlvbicgPyBbZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzXSA6IGZvcm1JdGVtLmFzeW5jVmFsaWRhdG9ycztcblxuICAgICAgICAgICAgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1JdGVtLnZhbGlkYXRvcnMgPSBmb3JtSXRlbS52YWxpZGF0b3JzIHx8IFtWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3JdO1xuXG4gICAgICAgIGZvcm1JdGVtLnJlcXVpcmVkID0gZm9ybUl0ZW0ucmVxdWlyZWQgfHwgZm9ybUl0ZW0udmFsaWRhdG9ycy5pbmNsdWRlcyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcblxuICAgICAgICByZXR1cm4gZm9ybUl0ZW07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZW5lcmF0ZUR5bmFtaWNGb3JtSXRlbShcbiAgICAgICAgZm9ybUl0ZW06IFByZXBhcmVkRHluYW1pY0Zvcm1GaWVsZEl0ZW0sXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXBcbiAgICApOiBEeW5hbWljRm9ybUNvbnRyb2wgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBmb3JtSXRlbUNvbXBvbmVudFR5cGUgPSB0aGlzLmdldENvbXBvbmVudERlZmluaXRpb25CeVR5cGUoZm9ybUl0ZW0udHlwZSk7XG5cbiAgICAgICAgaWYgKCFmb3JtSXRlbUNvbXBvbmVudFR5cGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRm9ybSBpdGVtICcke2Zvcm1JdGVtLm5hbWV9JyB3aXRoIHR5cGUgJyR7Zm9ybUl0ZW0udHlwZX0nIGhhcyBubyBkZWZpbmVkIGNvbXBvbmVudC5cbiAgICAgICAgICAgIFBsZWFzZSB1c2UgJ2FkZENvbXBvbmVudCcgbWV0aG9kIGluICR7Rm9ybUdlbmVyYXRvclNlcnZpY2UubmFtZX0gdG8gZGVmaW5lIGFwcHJvcHJpYXRlIHJlbGF0aW9ucy5gKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybUl0ZW0gPSB0aGlzLl9hc3NpZ25Gb3JtSXRlbVZhbGlkYXRvcnMoZm9ybUl0ZW0sIGZvcm0pO1xuXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gbmV3IER5bmFtaWNGb3JtQ29udHJvbChmb3JtSXRlbS5kZWZhdWx0LCB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzOiBmb3JtSXRlbS52YWxpZGF0b3JzLFxuICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzOiBmb3JtSXRlbS5hc3luY1ZhbGlkYXRvcnMsXG4gICAgICAgICAgICBkeW5hbWljRm9ybUl0ZW06IGZvcm1JdGVtLFxuICAgICAgICAgICAgdXBkYXRlT246ICdjaGFuZ2UnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGZvcm1JdGVtLm9uY2hhbmdlKSkge1xuICAgICAgICAgICAgZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDUwKSwgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gZm9ybUl0ZW0ub25jaGFuZ2UhKHZhbHVlLCB0aGlzLmZvcm1zLCBmb3JtQ29udHJvbCk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIHJldHVybiBmb3JtQ29udHJvbDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgYXN5bmMgX2NoZWNrRm9ybUNvbnRyb2xzVmlzaWJpbGl0eShcbiAgICAgICAgZm9ybTogRHluYW1pY0Zvcm1Hcm91cCB8IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLFxuICAgICAgICBmb3JtVmFsdWU6IGFueVxuICAgICk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0+IHtcbiAgICAgICAgbGV0IHNob3VsZFNob3dGaWVsZHM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gICAgICAgIGZvcm0gPSBmb3JtIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAgPyBmb3JtIDogZm9ybTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGNvbnRyb2xdIG9mIE9iamVjdC5lbnRyaWVzKGZvcm0uY29udHJvbHMpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtSXRlbSA9IGNvbnRyb2wuZm9ybUl0ZW07XG5cbiAgICAgICAgICAgIGlmICghaXNGb3JtRmllbGRJdGVtKGZvcm1JdGVtKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwVmlzaWJsZUl0ZW1zID0gYXdhaXQgdGhpcy5fY2hlY2tGb3JtQ29udHJvbHNWaXNpYmlsaXR5KFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sIGFzIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLFxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgc2hvdWxkU2hvd0ZpZWxkcyA9IE9iamVjdC5hc3NpZ24oc2hvdWxkU2hvd0ZpZWxkcywgZ3JvdXBWaXNpYmxlSXRlbXMpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWZvcm1JdGVtLndoZW4pIHtcbiAgICAgICAgICAgICAgICBzaG91bGRTaG93RmllbGRzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvYmogPSBmb3JtSXRlbS53aGVuKGZvcm1WYWx1ZSwgdGhpcy5mb3JtcywgY29udHJvbCk7XG4gICAgICAgICAgICBzaG91bGRTaG93RmllbGRzW2tleV0gPSBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2hvdWxkU2hvd0ZpZWxkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQHBhcmFtIGZvcm1JdGVtXG4gICAgICogQHBhcmFtIGZvcm1cbiAgICAgKiBAcGFyYW0ga2V5XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRGb3JtSXRlbVByb3BlcnR5VmFsdWU8VCA9IHN0cmluZz4oXG4gICAgICAgIGZvcm1JdGVtOiBEeW5hbWljRm9ybUZpZWxkSXRlbSxcbiAgICAgICAgZm9ybTogRHluYW1pY0Zvcm1Hcm91cCxcbiAgICAgICAga2V5OiBrZXlvZiBEeW5hbWljRm9ybUZpZWxkSXRlbVxuICAgICk6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBmb3JtSXRlbVtrZXldO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHZhbHVlKHRoaXMuX2dldEZvcm1WYWx1ZVdpdGhvdXRVbmdyb3VwZWQoZm9ybSkpO1xuXG4gICAgICAgICAgICB2YWx1ZSA9IGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZSh2YWx1ZSkpIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRGb3JtSXRlbVByb3BlcnRpZXM8VFR5cGVzIGV4dGVuZHMgYW55W10gPSBhbnlbXT4oXG4gICAgICAgIGZvcm1JdGVtOiBEeW5hbWljRm9ybUZpZWxkSXRlbSxcbiAgICAgICAgZm9ybTogRHluYW1pY0Zvcm1Hcm91cCxcbiAgICAgICAga2V5czogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPFRUeXBlcz4ge1xuICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fZ2V0Rm9ybUl0ZW1Qcm9wZXJ0eVZhbHVlKGZvcm1JdGVtLCBmb3JtLCBrZXkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKSBhcyBUVHlwZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBwYXJhbSBmb3JtSXRlbVxuICAgICAqIEBwYXJhbSBmb3JtXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRGb3JtSXRlbUNob2ljZXMoZm9ybUl0ZW06IER5bmFtaWNGb3JtRmllbGRJdGVtLCBmb3JtOiBEeW5hbWljRm9ybUdyb3VwKTogUHJvbWlzZTxTZWxlY3RJdGVtW10+IHtcbiAgICAgICAgY29uc3QgZGVmYXVsdENob2ljZXMgPSBhd2FpdCB0aGlzLl9nZXRGb3JtSXRlbVByb3BlcnR5VmFsdWU8RHluYW1pY0Zvcm1JdGVtQ2hvaWNlVHlwZXNbXT4oXG4gICAgICAgICAgICBmb3JtSXRlbSxcbiAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICAnY2hvaWNlcydcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWRlZmF1bHRDaG9pY2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdENob2ljZXMubWFwKChjOiBzdHJpbmcgfCBudW1iZXIgfCBTZWxlY3RJdGVtKSA9PlxuICAgICAgICAgICAgdHlwZW9mIGMgPT09ICdvYmplY3QnID8gYyA6ICh7IGxhYmVsOiBjLCB2YWx1ZTogYyB9IGFzIFNlbGVjdEl0ZW0pXG4gICAgICAgICkgYXMgU2VsZWN0SXRlbVtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB2YWx1ZSBmcm9tIFByb21pc2UtbGlrZSwgT2JzZXJ2YWJsZS1saWtlLCBzaW1wbGUgZnVuY3Rpb24gb3IganVzdCBzb21lIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gb2JqXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRGdW5jdGlvblZhbHVlKG9iajogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBzZWxlY3RTdHJhdGVneShvYmopO1xuXG4gICAgICAgIGxldCByZXN1bHQ6IGFueTtcblxuICAgICAgICBhd2FpdCBzdHJhdGVneS5jcmVhdGVTdWJzY3JpcHRpb24ob2JqLCAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUocmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb3JtYXRQYXNzd29yZFZhbHVlKHBhc3N3b3JkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJyonLnJlcGVhdChwYXNzd29yZD8ubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldE1lcmdlZEZvcm1GaWVsZEl0ZW1Db25maWcoZm9ybUl0ZW06IER5bmFtaWNGb3JtSXRlbU1hcCk6IER5bmFtaWNGb3JtSXRlbU1hcCB7XG4gICAgICAgIHJldHVybiBtZXJnZShjbG9uZURlZXAodGhpcy5fZGVmYXVsdEl0ZW1Db25maWcpLCBmb3JtSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF90cmFuc2Zvcm1Gb3JtSXRlbXMoZm9ybUl0ZW1zOiBNYXA8c3RyaW5nLCBEeW5hbWljRm9ybUl0ZW1NYXA+KTogTWFwPHN0cmluZywgRHluYW1pY0Zvcm1JdGVtTWFwPiB7XG4gICAgICAgIGZvcm1JdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc0Zvcm1GaWVsZEl0ZW0oaXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1JdGVtcy5zZXQoaW5kZXgsIHRoaXMuX2dldE1lcmdlZEZvcm1GaWVsZEl0ZW1Db25maWcoaXRlbSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybUl0ZW1zO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBhc3luYyBfdHJpZ2dlckZpZWxkc09uY2hhbmdlKGZvcm06IER5bmFtaWNGb3JtR3JvdXAgfCBEeW5hbWljRm9ybUNvbnRyb2xHcm91cCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgT2JqZWN0LnZhbHVlcyhmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBjb250cm9sLmZvcm1JdGVtO1xuXG4gICAgICAgICAgICBpZiAoIWlzRm9ybUZpZWxkSXRlbShmb3JtSXRlbSkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl90cmlnZ2VyRmllbGRzT25jaGFuZ2UoY29udHJvbCBhcyBEeW5hbWljRm9ybUNvbnRyb2xHcm91cCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtSXRlbS5vbmNoYW5nZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGZvcm1JdGVtLm9uY2hhbmdlKGNvbnRyb2wudmFsdWUgYXMgYW55LCB0aGlzLmZvcm1zLCBjb250cm9sIGFzIER5bmFtaWNGb3JtQ29udHJvbCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9jbG9uZU9sZEZvcm1Hcm91cChuZXdHcm91cDogRHluYW1pY0Zvcm1Db250cm9sR3JvdXAsIG9sZEdyb3VwPzogRHluYW1pY0Zvcm1Db250cm9sR3JvdXApOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmtleXMobmV3R3JvdXAuY29udHJvbHMpLmZvckVhY2goKGNvbnRyb2xOYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gbmV3R3JvdXAuZ2V0KGNvbnRyb2xOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbnRyb2wgPSBvbGRHcm91cD8uZ2V0KGNvbnRyb2xOYW1lKSBhcyBEeW5hbWljRm9ybUNvbnRyb2xHcm91cDtcbiAgICAgICAgICAgIGlmICghb2xkQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9uZU9sZEZvcm1Hcm91cChjb250cm9sLCBvbGRDb250cm9sKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRyb2w/LnNldFZhbHVlKG9sZENvbnRyb2wudmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgaWYgKG9sZENvbnRyb2wudG91Y2hlZCkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,53 @@
1
+ /** @hidden */
2
+ export function isHintOptions(opts) {
3
+ return !!opts && typeof opts !== 'string';
4
+ }
5
+ /** @hidden */
6
+ export function mapFormItems(formItems) {
7
+ const mappedItems = new Map();
8
+ if (!formItems) {
9
+ return mappedItems;
10
+ }
11
+ formItems.forEach((item, index) => {
12
+ const mappedItem = transformFormItem(item, index);
13
+ mappedItems.set(mappedItem.name, mappedItem);
14
+ });
15
+ return mappedItems;
16
+ }
17
+ /** @hidden */
18
+ export function transformFormItem(item, index) {
19
+ if (isFormGroupItem(item)) {
20
+ const mappedItem = Object.assign({}, item, { items: mapFormItems(item.items) });
21
+ mappedItem.rank = mappedItem.rank || index;
22
+ return mappedItem;
23
+ }
24
+ else {
25
+ item.rank = item.rank || index;
26
+ }
27
+ return item;
28
+ }
29
+ /**
30
+ * Is current form item is a field item.
31
+ * @param item form item.
32
+ * @returns is current form item is a field.
33
+ */
34
+ export function isFormFieldItem(item) {
35
+ return !!item.type;
36
+ }
37
+ /**
38
+ * Is current form item is a group item.
39
+ * @param item form item.
40
+ * @returns is current form item is a group.
41
+ */
42
+ /** @hidden */
43
+ export function isFormGroupItem(item) {
44
+ return !!item.items;
45
+ }
46
+ /** @hidden */
47
+ export function getParentItem(path, rootItems) {
48
+ return path.reduce((acc, chunk) => {
49
+ const parent = acc === null ? rootItems : acc.items;
50
+ return parent.get(chunk) || null;
51
+ }, null);
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vc3JjL2xpYi9mb3JtL2Zvcm0tZ2VuZXJhdG9yL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsY0FBYztBQUNkLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBMEI7SUFDcEQsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUM5QyxDQUFDO0FBRUQsY0FBYztBQUNkLE1BQU0sVUFBVSxZQUFZLENBQUMsU0FBNkI7SUFDdEQsTUFBTSxXQUFXLEdBQW9DLElBQUksR0FBRyxFQUFFLENBQUM7SUFFL0QsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNaLE9BQU8sV0FBVyxDQUFDO0tBQ3RCO0lBRUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM5QixNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxXQUFXLENBQUM7QUFDdkIsQ0FBQztBQUVELGNBQWM7QUFDZCxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLElBQXFCLEVBQ3JCLEtBQWE7SUFFYixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN2QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEYsVUFBVSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztRQUMzQyxPQUFPLFVBQVUsQ0FBQztLQUNyQjtTQUFNO1FBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztLQUNsQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFTO0lBQ3JDLE9BQU8sQ0FBQyxDQUFFLElBQTZCLENBQUMsSUFBSSxDQUFDO0FBQ2pELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsY0FBYztBQUNkLE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBUztJQUNyQyxPQUFPLENBQUMsQ0FBRSxJQUE4QixDQUFDLEtBQUssQ0FBQztBQUNuRCxDQUFDO0FBRUQsY0FBYztBQUNkLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBYyxFQUFFLFNBQTBDO0lBQ3BGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQThCLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDekQsTUFBTSxNQUFNLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ3BELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDckMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhpbnRPcHRpb25zIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9wbGF0Zm9ybS9zaGFyZWQnO1xuaW1wb3J0IHtcbiAgICBEeW5hbWljRm9ybUZpZWxkR3JvdXAsXG4gICAgRHluYW1pY0Zvcm1GaWVsZEdyb3VwTWFwLFxuICAgIER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgIER5bmFtaWNGb3JtSXRlbSxcbiAgICBEeW5hbWljRm9ybUl0ZW1NYXBcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1pdGVtJztcblxuLyoqIEBoaWRkZW4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0hpbnRPcHRpb25zKG9wdHM6IHN0cmluZyB8IEhpbnRPcHRpb25zKTogb3B0cyBpcyBIaW50T3B0aW9ucyB7XG4gICAgcmV0dXJuICEhb3B0cyAmJiB0eXBlb2Ygb3B0cyAhPT0gJ3N0cmluZyc7XG59XG5cbi8qKiBAaGlkZGVuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwRm9ybUl0ZW1zKGZvcm1JdGVtcz86IER5bmFtaWNGb3JtSXRlbVtdKTogTWFwPHN0cmluZywgRHluYW1pY0Zvcm1JdGVtTWFwPiB7XG4gICAgY29uc3QgbWFwcGVkSXRlbXM6IE1hcDxzdHJpbmcsIER5bmFtaWNGb3JtSXRlbU1hcD4gPSBuZXcgTWFwKCk7XG5cbiAgICBpZiAoIWZvcm1JdGVtcykge1xuICAgICAgICByZXR1cm4gbWFwcGVkSXRlbXM7XG4gICAgfVxuXG4gICAgZm9ybUl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcHBlZEl0ZW0gPSB0cmFuc2Zvcm1Gb3JtSXRlbShpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgbWFwcGVkSXRlbXMuc2V0KG1hcHBlZEl0ZW0ubmFtZSwgbWFwcGVkSXRlbSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFwcGVkSXRlbXM7XG59XG5cbi8qKiBAaGlkZGVuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtRm9ybUl0ZW0oXG4gICAgaXRlbTogRHluYW1pY0Zvcm1JdGVtLFxuICAgIGluZGV4OiBudW1iZXJcbik6IER5bmFtaWNGb3JtRmllbGRHcm91cE1hcCB8IER5bmFtaWNGb3JtRmllbGRJdGVtIHtcbiAgICBpZiAoaXNGb3JtR3JvdXBJdGVtKGl0ZW0pKSB7XG4gICAgICAgIGNvbnN0IG1hcHBlZEl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7IGl0ZW1zOiBtYXBGb3JtSXRlbXMoaXRlbS5pdGVtcykgfSk7XG4gICAgICAgIG1hcHBlZEl0ZW0ucmFuayA9IG1hcHBlZEl0ZW0ucmFuayB8fCBpbmRleDtcbiAgICAgICAgcmV0dXJuIG1hcHBlZEl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5yYW5rID0gaXRlbS5yYW5rIHx8IGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbn1cblxuLyoqXG4gKiBJcyBjdXJyZW50IGZvcm0gaXRlbSBpcyBhIGZpZWxkIGl0ZW0uXG4gKiBAcGFyYW0gaXRlbSBmb3JtIGl0ZW0uXG4gKiBAcmV0dXJucyBpcyBjdXJyZW50IGZvcm0gaXRlbSBpcyBhIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGb3JtRmllbGRJdGVtKGl0ZW06IGFueSk6IGl0ZW0gaXMgRHluYW1pY0Zvcm1GaWVsZEl0ZW0ge1xuICAgIHJldHVybiAhIShpdGVtIGFzIER5bmFtaWNGb3JtRmllbGRJdGVtKS50eXBlO1xufVxuXG4vKipcbiAqIElzIGN1cnJlbnQgZm9ybSBpdGVtIGlzIGEgZ3JvdXAgaXRlbS5cbiAqIEBwYXJhbSBpdGVtIGZvcm0gaXRlbS5cbiAqIEByZXR1cm5zIGlzIGN1cnJlbnQgZm9ybSBpdGVtIGlzIGEgZ3JvdXAuXG4gKi9cbi8qKiBAaGlkZGVuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGb3JtR3JvdXBJdGVtKGl0ZW06IGFueSk6IGl0ZW0gaXMgRHluYW1pY0Zvcm1GaWVsZEdyb3VwIHtcbiAgICByZXR1cm4gISEoaXRlbSBhcyBEeW5hbWljRm9ybUZpZWxkR3JvdXApLml0ZW1zO1xufVxuXG4vKiogQGhpZGRlbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudEl0ZW0ocGF0aDogc3RyaW5nW10sIHJvb3RJdGVtczogTWFwPHN0cmluZywgRHluYW1pY0Zvcm1JdGVtTWFwPik6IER5bmFtaWNGb3JtSXRlbU1hcCB8IG51bGwge1xuICAgIHJldHVybiBwYXRoLnJlZHVjZSgoYWNjOiBEeW5hbWljRm9ybUl0ZW1NYXAgfCBudWxsLCBjaHVuaykgPT4ge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBhY2MgPT09IG51bGwgPyByb290SXRlbXMgOiBhY2MuaXRlbXM7XG4gICAgICAgIHJldHVybiBwYXJlbnQuZ2V0KGNodW5rKSB8fCBudWxsO1xuICAgIH0sIG51bGwpO1xufVxuIl19