@ajf/material 18.4.1 → 18.5.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 (76) hide show
  1. package/README.md +167 -2
  2. package/audio/src/audio-module.d.ts +7 -6
  3. package/esm2022/audio/src/audio-module.mjs +22 -4
  4. package/esm2022/audio/src/audio.mjs +6 -6
  5. package/esm2022/barcode/barcode.mjs +3 -3
  6. package/esm2022/calendar/calendar.mjs +2 -2
  7. package/esm2022/checkbox-group/checkbox-group-item.mjs +3 -3
  8. package/esm2022/form-builder/form-builder-service.mjs +121 -32
  9. package/esm2022/form-builder/form-builder-utils.mjs +25 -1
  10. package/esm2022/form-builder/node-entry.mjs +18 -4
  11. package/esm2022/form-builder/node-properties.mjs +11 -17
  12. package/esm2022/forms/boolean-field.mjs +6 -5
  13. package/esm2022/forms/current-slide.mjs +92 -0
  14. package/esm2022/forms/date-input-field.mjs +7 -9
  15. package/esm2022/forms/display-field.mjs +2 -2
  16. package/esm2022/forms/empty-field.mjs +3 -3
  17. package/esm2022/forms/field-row.mjs +117 -0
  18. package/esm2022/forms/field.mjs +2 -2
  19. package/esm2022/forms/form.mjs +107 -13
  20. package/esm2022/forms/forms-module.mjs +26 -3
  21. package/esm2022/forms/input-field.mjs +6 -8
  22. package/esm2022/forms/multiple-choice-field.mjs +45 -10
  23. package/esm2022/forms/public_api.mjs +6 -1
  24. package/esm2022/forms/range-field.mjs +5 -6
  25. package/esm2022/forms/rep-strip.mjs +61 -0
  26. package/esm2022/forms/single-choice-field.mjs +26 -11
  27. package/esm2022/forms/slide-header.mjs +68 -0
  28. package/esm2022/forms/slide-stats.mjs +148 -0
  29. package/esm2022/forms/table-field.mjs +2 -2
  30. package/esm2022/forms/text-field.mjs +2 -2
  31. package/esm2022/forms/video-url-field.mjs +6 -8
  32. package/esm2022/geolocation/geolocation.mjs +4 -6
  33. package/esm2022/node-icon/node-icon.mjs +4 -1
  34. package/esm2022/page-slider/page-slider.mjs +3 -3
  35. package/esm2022/signature/signature.mjs +5 -6
  36. package/esm2022/time/time-module.mjs +22 -4
  37. package/esm2022/time/time.mjs +4 -4
  38. package/fesm2022/ajf-material-audio.mjs +27 -9
  39. package/fesm2022/ajf-material-audio.mjs.map +1 -1
  40. package/fesm2022/ajf-material-barcode.mjs +2 -2
  41. package/fesm2022/ajf-material-barcode.mjs.map +1 -1
  42. package/fesm2022/ajf-material-calendar.mjs +2 -2
  43. package/fesm2022/ajf-material-calendar.mjs.map +1 -1
  44. package/fesm2022/ajf-material-checkbox-group.mjs +2 -2
  45. package/fesm2022/ajf-material-checkbox-group.mjs.map +1 -1
  46. package/fesm2022/ajf-material-form-builder.mjs +168 -49
  47. package/fesm2022/ajf-material-form-builder.mjs.map +1 -1
  48. package/fesm2022/ajf-material-forms.mjs +712 -99
  49. package/fesm2022/ajf-material-forms.mjs.map +1 -1
  50. package/fesm2022/ajf-material-geolocation.mjs +5 -7
  51. package/fesm2022/ajf-material-geolocation.mjs.map +1 -1
  52. package/fesm2022/ajf-material-node-icon.mjs +3 -0
  53. package/fesm2022/ajf-material-node-icon.mjs.map +1 -1
  54. package/fesm2022/ajf-material-page-slider.mjs +2 -2
  55. package/fesm2022/ajf-material-page-slider.mjs.map +1 -1
  56. package/fesm2022/ajf-material-signature.mjs +7 -8
  57. package/fesm2022/ajf-material-signature.mjs.map +1 -1
  58. package/fesm2022/ajf-material-time.mjs +24 -6
  59. package/fesm2022/ajf-material-time.mjs.map +1 -1
  60. package/form-builder/form-builder-service.d.ts +23 -0
  61. package/form-builder/form-builder-utils.d.ts +8 -0
  62. package/form-builder/node-entry.d.ts +10 -0
  63. package/form-builder/node-properties.d.ts +5 -1
  64. package/forms/_theming.scss +142 -0
  65. package/forms/current-slide.d.ts +61 -0
  66. package/forms/field-row.d.ts +63 -0
  67. package/forms/form.d.ts +40 -3
  68. package/forms/forms-module.d.ts +57 -51
  69. package/forms/multiple-choice-field.d.ts +15 -1
  70. package/forms/public_api.d.ts +5 -0
  71. package/forms/rep-strip.d.ts +52 -0
  72. package/forms/single-choice-field.d.ts +7 -0
  73. package/forms/slide-header.d.ts +61 -0
  74. package/forms/slide-stats.d.ts +76 -0
  75. package/package.json +2 -2
  76. package/time/time-module.d.ts +4 -3
@@ -19,28 +19,83 @@
19
19
  * If not, see http://www.gnu.org/licenses/.
20
20
  *
21
21
  */
22
- import { AjfFormRenderer as CoreFormRenderer, AjfFieldType, } from '@ajf/core/forms';
22
+ import { AjfFieldType, AjfFormRenderer as CoreFormRenderer, isRepeatingSlideInstance, } from '@ajf/core/forms';
23
23
  import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, } from '@angular/core';
24
+ import { EMPTY, Subscription } from 'rxjs';
25
+ import { switchMap } from 'rxjs/operators';
24
26
  import * as i0 from "@angular/core";
25
27
  import * as i1 from "@ajf/core/forms";
26
28
  import * as i2 from "@ajf/core/page-slider";
27
29
  import * as i3 from "@ajf/material/page-slider";
28
30
  import * as i4 from "@angular/common";
29
- import * as i5 from "@angular/material/button";
30
- import * as i6 from "@angular/material/button-toggle";
31
- import * as i7 from "@angular/material/card";
32
- import * as i8 from "@angular/material/icon";
33
- import * as i9 from "@angular/material/toolbar";
34
- import * as i10 from "@angular/material/tooltip";
35
- import * as i11 from "@angular/forms";
36
- import * as i12 from "./field";
37
- import * as i13 from "@ngneat/transloco";
31
+ import * as i5 from "@angular/material/icon";
32
+ import * as i6 from "@angular/forms";
33
+ import * as i7 from "./field-row";
34
+ import * as i8 from "./rep-strip";
35
+ import * as i9 from "./slide-header";
36
+ import * as i10 from "@ngneat/transloco";
37
+ import * as i11 from "./current-slide";
38
+ import * as i12 from "./slide-stats";
38
39
  export class AjfFormRenderer extends CoreFormRenderer {
39
40
  constructor(rendererService, changeDetectorRef) {
40
41
  super(rendererService, changeDetectorRef);
42
+ /**
43
+ * @deprecated The slide strip has been replaced by the jump menu in the slide
44
+ * header, which is always available. Kept so that existing templates still
45
+ * compile.
46
+ */
41
47
  this.topBar = false;
48
+ /**
49
+ * @deprecated Field rows align their labels and controls on a shared grid, so
50
+ * there is nothing left to centre.
51
+ */
42
52
  this.centeredFieldsContent = false;
53
+ /** How many field rows sit side by side. */
43
54
  this.maxColumns = 1;
55
+ /**
56
+ * The page the slider is showing. The slide header is rendered once, above the
57
+ * slider, so it needs to know which slide is on screen; the page slider only
58
+ * reports that imperatively, hence the mirrored property.
59
+ */
60
+ this.currentPage = 0;
61
+ this._slideList = [];
62
+ this._validitySubscription = Subscription.EMPTY;
63
+ this._slidesSubscription = Subscription.EMPTY;
64
+ this._valueSubscription = Subscription.EMPTY;
65
+ this._pageSubscription = Subscription.EMPTY;
66
+ this._pageInit = false;
67
+ this._slidesSubscription = this.slides.subscribe(slides => {
68
+ this._slideList = slides || [];
69
+ });
70
+ // This component is OnPush, and children are only visited when it is
71
+ // checked. The slide header reports live state -- how many fields are
72
+ // filled, how many are failing -- so a value change anywhere in the form has
73
+ // to bring the renderer back into the check.
74
+ this._valueSubscription = this.formGroup
75
+ .pipe(switchMap(fg => (fg ? fg.valueChanges : EMPTY)))
76
+ .subscribe(() => this._changeDetectorRef.markForCheck());
77
+ // Validity moves without a value moving with it -- a visibility change or a
78
+ // recalculated formula is enough -- and the issue counts are read through
79
+ // impure pipes, so this brings the renderer back into the check too.
80
+ this._validitySubscription = this.errors.subscribe(() => this._changeDetectorRef.markForCheck());
81
+ }
82
+ ngAfterViewChecked() {
83
+ super.ngAfterViewChecked();
84
+ if (!this._pageInit && this.formSlider != null) {
85
+ this._pageInit = true;
86
+ this.currentPage = this.formSlider.currentPage;
87
+ this._pageSubscription = this.formSlider.pageScrollFinish.subscribe(() => {
88
+ this.currentPage = this.formSlider.currentPage;
89
+ this._changeDetectorRef.markForCheck();
90
+ });
91
+ }
92
+ }
93
+ ngOnDestroy() {
94
+ this._slidesSubscription.unsubscribe();
95
+ this._valueSubscription.unsubscribe();
96
+ this._validitySubscription.unsubscribe();
97
+ this._pageSubscription.unsubscribe();
98
+ super.ngOnDestroy();
44
99
  }
45
100
  fieldStyle(field) {
46
101
  if (field.node.fieldType === AjfFieldType.Formula && field.node.label === '') {
@@ -48,12 +103,51 @@ export class AjfFormRenderer extends CoreFormRenderer {
48
103
  }
49
104
  return {};
50
105
  }
106
+ /** Page to the first page of a slide, from the header's jump menu. */
107
+ goToSlide(slide) {
108
+ this._slideTo(this._pageOf(slide));
109
+ }
110
+ /** Page to one repetition of the repeating slide currently on screen. */
111
+ goToRep(slide, repIndex) {
112
+ this._slideTo(this._pageOf(slide) + repIndex);
113
+ }
114
+ goToPrevSlide() {
115
+ this.formSlider?.slide({ dir: 'up' });
116
+ }
117
+ goToNextSlide() {
118
+ this.formSlider?.slide({ dir: 'down' });
119
+ }
120
+ /**
121
+ * The slider page a slide starts on. `AjfSlideInstance.position` cannot be
122
+ * used directly here: it does not account for a start message page, and this
123
+ * has to agree with the page arithmetic used by `ajfCurrentSlide`.
124
+ */
125
+ _pageOf(slide) {
126
+ let page = this.hasStartMessage ? 1 : 0;
127
+ for (const cur of this._slideList) {
128
+ if (cur.visible === false) {
129
+ continue;
130
+ }
131
+ if (cur === slide) {
132
+ break;
133
+ }
134
+ page += isRepeatingSlideInstance(cur)
135
+ ? Math.max(1, cur.reps)
136
+ : 1;
137
+ }
138
+ return page;
139
+ }
140
+ _slideTo(page) {
141
+ if (this.formSlider != null) {
142
+ this.formSlider.slide({ to: page });
143
+ }
144
+ }
51
145
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfFormRenderer, deps: [{ token: i1.AjfFormRendererService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
52
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfFormRenderer, selector: "ajf-form", inputs: { topBar: "topBar", centeredFieldsContent: "centeredFieldsContent", maxColumns: "maxColumns" }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"formGroup|async as fg\">\n <form [class.ajf-form-readonly]=\"readonly\" novalidate [formGroup]=\"fg!\">\n <div class=\"ajf-form-container\">\n <mat-toolbar *ngIf=\"!hideTopToolbar && topBar\" class=\"ajf-btn-strip\">\n <mat-button-toggle-group>\n <ng-container\n *ngFor=\"let slideInstance of (slides|async); let idx = index; trackBy: trackNodeById\"\n >\n <mat-button-toggle\n *ngIf=\"slideInstance.node.label && slideInstance.node.label.length > 0\"\n class=\"ajf-topbar-button\"\n (click)=\"scrollToSlide(slideInstance)\"\n [checked]=\"isSlideToggleChecked(slideInstance, formSlider.currentPage)\"\n [disabled]=\"slideInstance.visible === false\"\n >\n {{slideInstance.node.label | transloco}} {{ getRepeatingSlideRepIndex(slideInstance,\n formSlider.currentPage)|async}}\n <mat-icon\n *ngIf=\"!slideInstance.valid && slideInstance.visible !== false\"\n class=\"ajf-warning\"\n >warning</mat-icon\n >\n <mat-icon\n *ngIf=\"slideInstance.valid && slideInstance.visible !== false\"\n class=\"ajf-success\"\n >check</mat-icon\n >\n </mat-button-toggle>\n </ng-container>\n </mat-button-toggle-group>\n </mat-toolbar>\n <mat-toolbar *ngIf=\"!hideTopToolbar\">\n {{ title }}\n <span class=\"ajf-spacer\"></span>\n <!-- this content projection allow to add buttons on toolbar -->\n <ng-content select=\"[ajfFormTopToolbarButtons]\"></ng-content>\n <!-- apply a default save button only when ajfFormSaveButton is empty -->\n <span *ngIf=\"!saveDisabled\" (click)=\"onSave($event)\">\n <span #saveButton><ng-content select=\"[ajfFormSaveButton]\"></ng-content></span>\n <button\n *ngIf=\"saveButton && saveButton.childNodes && saveButton.childNodes.length === 0\"\n mat-button\n default\n >\n {{'Save'|transloco}}\n </button>\n </span>\n </mat-toolbar>\n <div class=\"ajf-slider-container\">\n <ajf-page-slider\n (orientationChange)=\"orientationChangeHandler($event)\"\n [fixedOrientation]=\"fixedOrientation\"\n [hideNavigationButtons]=\"hideNavigationButtons\"\n [orientation]=\"orientation\"\n #formSlider\n >\n <ng-container *ngIf=\"(slides|async) as curSlides\">\n <ng-container *ngIf=\"curSlides!.length > 0 && hasStartMessage\">\n <ajf-page-slider-item>\n <div class=\"ajf-form-page\">\n <mat-card appearance=\"outlined\">\n <mat-card-header>\n <div class=\"ajf-page-slider-item-header\">\n <h2>\n <span class=\"ajf-form-header-number\"> 1 &rarr; </span>\n <span class=\"ajf-title\">\n <ng-content select=\"[ajfFormStartMessageTitle]\"></ng-content>\n </span>\n </h2>\n </div>\n </mat-card-header>\n <mat-card-content>\n <ng-content select=\"[ajfFormStartMessage]\"></ng-content>\n </mat-card-content>\n </mat-card>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n <ng-container *ngFor=\"let slideInstance of curSlides; trackBy:trackNodeById\">\n <!-- non repeating slides -->\n <ng-container *ngIf=\"slideInstance.visible\">\n <ng-container *ngIf=\"!(slideInstance|ajfIsRepeatingSlideInstance)\">\n <ajf-page-slider-item>\n <div class=\"ajf-form-page\">\n <mat-card appearance=\"outlined\">\n <mat-card-header>\n <div class=\"ajf-page-slider-item-header\">\n <h2>\n <span class=\"ajf-form-header-number\"\n >{{ slideInstance.position + (hasStartMessage | ajfBoolToInt) }}\n &rarr;</span\n >\n <span [innerHTML]=\"slideInstance.node.label | transloco\"></span>\n </h2>\n <mat-icon class=\"ajf-warning\" *ngIf=\"!slideInstance.valid\"\n >warning</mat-icon\n >\n <mat-icon class=\"ajf-success\" *ngIf=\"slideInstance.valid\"\n >check</mat-icon\n >\n </div>\n </mat-card-header>\n <mat-card-content>\n <ng-template\n ngFor\n let-fieldInstance\n [ngForOf]=\"slideInstance.flatNodes\"\n [ngForTrackBy]=\"trackNodeById\"\n >\n <mat-card\n appearance=\"outlined\"\n [ngClass]=\"'ajf-' + (fieldInstance|ajfAsFieldInstance).node.size +\n ' ajf-max-columns-' + maxColumns +\n (centeredFieldsContent ? ' ajf-centered-field' : '')\"\n class=\"ajf-field-entry\"\n *ngIf=\"fieldInstance.visible\"\n [ngStyle]=\"fieldStyle(fieldInstance|ajfAsFieldInstance)\"\n >\n <i\n [class]=\"(fieldInstance|ajfAsFieldInstance).node.fieldType | ajfFieldIcon\"\n item-right\n ></i>\n <p>\n {{ ((fieldInstance|ajfAsFieldInstance).node.description || '') |\n transloco }}\n </p>\n\n <mat-card-header>\n <mat-card-title>\n <label\n [attr.id]=\"fieldInstance.node.name\"\n *ngIf=\"(fieldInstance|ajfAsFieldInstance).node.fieldType !== 7\"\n [innerHTML]=\"fieldInstance.node.label | transloco\"\n ></label>\n </mat-card-title>\n <mat-icon\n class=\"ajf-tooltip-icon\"\n *ngIf=\"(fieldInstance|ajfAsFieldInstance).node?.hint as hint\"\n [matTooltip]=\"hint | transloco\"\n matTooltipPosition=\"right\"\n >\n {{(fieldInstance|ajfAsFieldInstance).node.hintIcon ||\n 'help'}}</mat-icon\n ></mat-card-header\n >\n <mat-card-content>\n <ajf-field\n [instance]=\"fieldInstance|ajfAsFieldInstance\"\n [readonly]=\"readonly || !slideInstance.editable\"\n [id]=\"'field_entry_' + fieldInstance.node.id\"\n >\n </ajf-field>\n </mat-card-content>\n <mat-card-actions\n [ngClass]=\"(fieldInstance|ajfAsFieldInstance)?.valid ?\n 'ajf-valid-field'\n : 'ajf-invalid-field'\"\n >\n <ng-container\n *ngIf=\"(fieldInstance|ajfAsFieldInstance)?.valid !== true; else ajfValidFieldTemplate\"\n >\n <span class=\"ajf-field-error-message\"\n >{{(fieldInstance|ajfAsFieldInstanceErrors|transloco)}}</span\n >\n <mat-icon class=\"ajf-warning\">warning</mat-icon>\n </ng-container>\n <ng-template #ajfValidFieldTemplate>\n <mat-icon class=\"ajf-success\">check</mat-icon>\n </ng-template>\n </mat-card-actions>\n </mat-card>\n </ng-template>\n </mat-card-content>\n </mat-card>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n <!-- repeating slides -->\n <ng-container *ngIf=\"(slideInstance|ajfIsRepeatingSlideInstance)\">\n <ajf-page-slider-item\n *ngFor=\"let curRep of ((slideInstance|ajfAsRepeatingSlideInstance).reps|ajfRange); let idx = index; let lastSlide = last\"\n [isRepeating]=\"true\"\n [isRepeatingLast]=\"lastSlide\"\n >\n <div class=\"ajf-form-page\">\n <mat-card appearance=\"outlined\">\n <mat-card-header>\n <div class=\"ajf-page-slider-item-header\">\n <h2>\n <span class=\"ajf-form-header-number\"\n >{{ slideInstance.position|ajfIncrement:idx + (hasStartMessage |\n ajfBoolToInt) }} &rarr;</span\n >\n <span [innerHTML]=\"slideInstance.node.label | transloco\"></span>\n </h2>\n <mat-icon class=\"ajf-warning\" *ngIf=\"!(slideInstance|ajfValidSlide:idx)\"\n >warning</mat-icon\n >\n <mat-icon class=\"ajf-success\" *ngIf=\"(slideInstance|ajfValidSlide:idx)\"\n >check</mat-icon\n >\n </div>\n </mat-card-header>\n <mat-card-content>\n <div *ngIf=\"!readonly\" class=\"ajf-group-actions\">\n <button\n *ngIf=\"lastSlide\"\n (click)=\"addGroup(slideInstance)\"\n [disabled]=\"!(slideInstance|ajfAsRepeatingSlideInstance).canAdd || ((slideInstance|ajfAsRepeatingSlideInstance).node.disableRemoval && !slideInstance.valid)\"\n mat-mini-fab\n >\n <mat-icon>add</mat-icon>\n </button>\n <button\n (click)=\"removeGroup(slideInstance, idx)\"\n [disabled]=\"!(slideInstance|ajfAsRepeatingSlideInstance).canRemove || (slideInstance|ajfAsRepeatingSlideInstance).node.disableRemoval\"\n mat-mini-fab\n >\n <mat-icon>remove</mat-icon>\n </button>\n </div>\n <ng-template\n ngFor\n let-fieldInstance\n [ngForOf]=\"slideInstance.slideNodes[idx]\"\n [ngForTrackBy]=\"trackNodeById\"\n >\n <mat-card\n appearance=\"outlined\"\n [ngClass]=\"'ajf-' + (fieldInstance|ajfAsFieldInstance).node.size +\n ' ajf-max-columns-' + maxColumns +\n (centeredFieldsContent ? ' ajf-centered-field' : '')\"\n class=\"ajf-field-entry\"\n *ngIf=\"fieldInstance.visible\"\n [ngStyle]=\"fieldStyle(fieldInstance|ajfAsFieldInstance)\"\n >\n <i\n [class]=\"(fieldInstance|ajfAsFieldInstance).node.fieldType | ajfFieldIcon\"\n item-right\n ></i>\n <p>\n {{ ((fieldInstance|ajfAsFieldInstance).node.description || '') |\n transloco }}\n </p>\n\n <mat-card-header>\n <mat-card-title>\n <label\n [attr.id]=\"fieldInstance.node.name\"\n *ngIf=\"(fieldInstance|ajfAsFieldInstance).node.fieldType !== 7\"\n [innerHTML]=\"fieldInstance.node.label | transloco\"\n ></label>\n </mat-card-title>\n <mat-icon\n class=\"ajf-tooltip-icon\"\n *ngIf=\"(fieldInstance|ajfAsFieldInstance).node?.hint as hint\"\n [matTooltip]=\"hint | transloco\"\n matTooltipPosition=\"right\"\n >\n {{(fieldInstance|ajfAsFieldInstance).node.hintIcon ||\n 'help'}}</mat-icon\n ></mat-card-header\n >\n <mat-card-content>\n <ajf-field\n [instance]=\"fieldInstance|ajfAsFieldInstance\"\n [readonly]=\"readonly || !slideInstance.editable\"\n [id]=\"'field_entry_' + fieldInstance.node.id\"\n >\n </ajf-field>\n </mat-card-content>\n <mat-card-actions\n [ngClass]=\"(fieldInstance|ajfAsFieldInstance)?.valid ?\n 'ajf-valid-field'\n : 'ajf-invalid-field'\"\n >\n <ng-container\n *ngIf=\"(fieldInstance|ajfAsFieldInstance)?.valid !== true; else ajfValidFieldTemplate\"\n >\n <span class=\"ajf-field-error-message\"\n >{{(fieldInstance|ajfAsFieldInstanceErrors)}}</span\n >\n <mat-icon class=\"ajf-warning\">warning</mat-icon>\n </ng-container>\n <ng-template #ajfValidFieldTemplate>\n <mat-icon class=\"ajf-success\">check</mat-icon>\n </ng-template>\n </mat-card-actions>\n </mat-card>\n </ng-template>\n </mat-card-content>\n </mat-card>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"curSlides && curSlides!.length > 0 && hasEndMessage\">\n <ajf-page-slider-item>\n <div class=\"ajf-form-page\">\n <mat-card appearance=\"outlined\">\n <mat-card-header>\n <div class=\"ajf-page-slider-item-header\">\n <h2>\n <span *ngIf=\"(slidesNum|async) as snum\" class=\"ajf-form-header-number\">\n {{ snum! + (hasStartMessage | ajfBoolToInt ) + 1 }} &rarr;\n </span>\n <span class=\"ajf-title\">\n <ng-content select=\"[ajfFormEndMessageTitle]\"></ng-content>\n </span>\n </h2>\n </div>\n </mat-card-header>\n <mat-card-content>\n <ng-content select=\"[ajfFormEndMessage]\"></ng-content>\n </mat-card-content>\n </mat-card>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n </ng-container>\n <div ajfPageSliderBar *ngIf=\"!hideBottomToolbar\">\n <div class=\"ajf-left-bar\">\n <div class=\"ajf-errors\" *ngIf=\"((errors | async) || 0) > 0\">\n <button mat-button (click)=\"goToPrevError()\" danger>\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button mat-button (click)=\"goToNextError()\" danger>\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n <div class=\"ajf-info-box ajf-error\">\n <div class=\"ajf-title\">{{'Errors'|transloco}}</div>\n <div class=\"ajf-content\">{{ errors | async }} / {{ slidesNum|async }}</div>\n </div>\n </div>\n </div>\n </ajf-page-slider>\n </div>\n </div>\n </form>\n</ng-container>\n", styles: ["ajf-form{display:block}ajf-form .ajf-form-readonly .ajf-field-entry>label{font-weight:700}ajf-form .ajf-form-container{display:flex;flex-direction:column;position:absolute;inset:0}ajf-form .ajf-form-container mat-toolbar.ajf-hidden{opacity:0}ajf-form .ajf-form-container .ajf-btn-strip .mat-button-toggle-group{overflow-x:auto}ajf-form .ajf-form-container .ajf-topbar-button{font-size:.8em}ajf-form .ajf-form-container mat-icon.ajf-warning{color:#f53d3d}ajf-form .ajf-form-container mat-icon.ajf-success{color:#32db64}ajf-form .ajf-form-container>.ajf-slider-container{flex:1;position:relative}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider{height:100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content{padding:16px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page{flex:1;max-height:100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card{margin:1em 0 3em}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content{display:flex;flex-wrap:wrap;flex-direction:row;align-content:flex-start;position:relative}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content .ajf-group-actions{position:absolute;right:0;top:-30px;padding:15px;z-index:10}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry{padding-right:10px;min-width:350px;display:flex;flex-direction:column;margin:5px;border-left:3px solid;border-radius:5px;min-height:30vh;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-icon{vertical-align:bottom;margin-left:5px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-max-columns-1{flex:1 0 100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-max-columns-2{flex:1 0 45%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-max-columns-3{flex:1 0 30%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-normal{width:100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-small{width:50%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-smaller{width:33%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-tiny{width:25%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-mini{width:20%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions{position:absolute;bottom:0;width:100%;display:flex;justify-content:flex-start;align-items:center;align-content:center;border-bottom-left-radius:5px;border-bottom-right-radius:5px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions.ajf-valid-field{background-color:#32db6433}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions.ajf-invalid-field{background-color:#f53d3d33}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions.ajf-invalid-field .ajf-field-error-message{margin-left:8px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions .mat-icon{margin-left:auto}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-radio-button,ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry ajf-checkbox-group-item .mat-mdc-button{background-color:inherit!important}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-header{margin-bottom:15px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-header .ajf-tooltip-icon{align-self:center;min-width:24px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content{position:relative;flex:1;flex-flow:row wrap;justify-content:flex-start;align-items:flex-start;padding-top:2%;padding-bottom:10%;overflow-y:auto;max-width:95%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content .mat-mdc-select{margin:20px 0}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content .mat-mdc-radio-group{display:flex;flex-flow:column wrap;justify-content:space-between}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content .mat-mdc-radio-group .mat-mdc-radio-button{flex:1 1 30%;padding:5px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content .ajf-errors .error{display:none}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-centered-field .mat-mdc-card-content,ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-centered-field .mat-mdc-card-header{justify-content:center;text-align:center}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-centered-field .ajf-choices-container .mat-mdc-radio-button{text-align:start}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .ajf-field-range{margin-top:30px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider .ajf-page-slider-item-header{display:flex;align-items:center;width:100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider .ajf-page-slider-item-header>h2{flex:1}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider .ajf-page-slider-item-header>h2>.ajf-form-header-number{margin-right:.5em}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider .ajf-page-slider-item-header h2>.ajf-title{display:inline-block;margin-right:40px;white-space:normal;vertical-align:top}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar{display:flex;align-items:flex-start;flex-direction:row;position:absolute;bottom:0}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-right-button{float:right}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-button-icon-only ion-icon{padding:0 .1em}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-info-box{height:40px;padding:4px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-info-box>div{height:16px;line-height:16px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-info-box>div.ajf-content{font-weight:700}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-info-box.ajf-error{order:2;color:red}ajf-form .ajf-form-container .ajf-spacer{flex:1 0 auto}\n"], dependencies: [{ kind: "component", type: i2.AjfPageSliderItem, selector: "ajf-page-slider-item", inputs: ["isRepeating", "isRepeatingLast"], outputs: ["scroll"] }, { kind: "component", type: i3.AjfPageSlider, selector: "ajf-page-slider" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "directive", type: i6.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i6.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i7.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i7.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i7.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i7.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i7.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i11.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i12.AjfFormField, selector: "ajf-field,ajf-form-field" }, { kind: "pipe", type: i13.TranslocoPipe, name: "transloco" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.AjfAsFieldInstancePipe, name: "ajfAsFieldInstance" }, { kind: "pipe", type: i1.AjfAsFieldInstanceErrorsPipe, name: "ajfAsFieldInstanceErrors" }, { kind: "pipe", type: i1.AjfAsRepeatingSlideInstancePipe, name: "ajfAsRepeatingSlideInstance" }, { kind: "pipe", type: i1.AjfBoolToIntPipe, name: "ajfBoolToInt" }, { kind: "pipe", type: i1.AjfFieldIconPipe, name: "ajfFieldIcon" }, { kind: "pipe", type: i1.AjfIncrementPipe, name: "ajfIncrement" }, { kind: "pipe", type: i1.AjfIsRepeatingSlideInstancePipe, name: "ajfIsRepeatingSlideInstance" }, { kind: "pipe", type: i1.AjfRangePipe, name: "ajfRange" }, { kind: "pipe", type: i1.AjfValidSlidePipe, name: "ajfValidSlide" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
146
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfFormRenderer, selector: "ajf-form", inputs: { topBar: "topBar", centeredFieldsContent: "centeredFieldsContent", maxColumns: "maxColumns" }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"formGroup | async as fg\">\n <form [class.ajf-form-readonly]=\"readonly\" novalidate [formGroup]=\"fg!\">\n <div class=\"ajf-form-container\">\n <ng-container *ngIf=\"slides | async as curSlides\">\n <ng-container\n *ngIf=\"curSlides | ajfCurrentSlide : currentPage : hasStartMessage : hasEndMessage as cur\"\n >\n <div class=\"ajf-form-bar\" *ngIf=\"!hideTopToolbar\">\n <ajf-slide-header\n [slide]=\"cur.slide\"\n [slides]=\"curSlides\"\n [displayNumber]=\"cur.displayNumber\"\n [pages]=\"cur.pages\"\n (jumpTo)=\"goToSlide($event)\"\n (prev)=\"goToPrevSlide()\"\n (next)=\"goToNextSlide()\"\n >\n <!-- this content projection allows to add buttons on the slide header -->\n <ng-content select=\"[ajfFormTopToolbarButtons]\"></ng-content>\n <!-- The renderer has nowhere to save to: clicking here only emits\n `formAction`. So it ships no button of its own and holds the\n slot open instead -- a host that handles the event projects the\n button it wants, and gets the click through this wrapper. -->\n <span class=\"ajf-form-save\" *ngIf=\"!saveDisabled\" (click)=\"onSave($event)\">\n <ng-content select=\"[ajfFormSaveButton]\"></ng-content>\n </span>\n </ajf-slide-header>\n\n <ajf-rep-strip\n *ngIf=\"cur.slide && cur.reps > 0\"\n [slide]=\"cur.slide! | ajfAsRepeatingSlideInstance\"\n [current]=\"cur.repIndex\"\n [readonly]=\"readonly\"\n (goTo)=\"goToRep(cur.slide!, $event)\"\n (add)=\"addGroup(cur.slide!)\"\n (remove)=\"removeGroup(cur.slide!, cur.repIndex)\"\n ></ajf-rep-strip>\n </div>\n </ng-container>\n\n <div class=\"ajf-slider-container\">\n <ajf-page-slider\n (orientationChange)=\"orientationChangeHandler($event)\"\n [fixedOrientation]=\"fixedOrientation\"\n [hideNavigationButtons]=\"hideNavigationButtons\"\n [orientation]=\"orientation\"\n #formSlider\n >\n <ajf-page-slider-item *ngIf=\"curSlides!.length > 0 && hasStartMessage\">\n <div class=\"ajf-form-page ajf-form-message\">\n <h2 class=\"ajf-message-title\">\n <ng-content select=\"[ajfFormStartMessageTitle]\"></ng-content>\n </h2>\n <div class=\"ajf-message-body\">\n <ng-content select=\"[ajfFormStartMessage]\"></ng-content>\n </div>\n </div>\n </ajf-page-slider-item>\n\n <ng-container *ngFor=\"let slideInstance of curSlides; trackBy: trackNodeById\">\n <ng-container *ngIf=\"slideInstance.visible\">\n <!-- non repeating slides -->\n <ng-container *ngIf=\"!(slideInstance | ajfIsRepeatingSlideInstance)\">\n <ajf-page-slider-item>\n <div class=\"ajf-form-page\" [ngClass]=\"'ajf-max-columns-' + maxColumns\">\n <ajf-field-row\n *ngFor=\"let fieldInstance of slideInstance.flatNodes; trackBy: trackNodeById\"\n [instance]=\"fieldInstance | ajfAsFieldInstance\"\n [readonly]=\"readonly || !slideInstance.editable\"\n ></ajf-field-row>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n\n <!-- repeating slides: one page per repetition -->\n <ng-container *ngIf=\"slideInstance | ajfIsRepeatingSlideInstance\">\n <ajf-page-slider-item\n *ngFor=\"\n let curRep of (slideInstance | ajfAsRepeatingSlideInstance).reps | ajfRange;\n let idx = index;\n let lastSlide = last\n \"\n [isRepeating]=\"true\"\n [isRepeatingLast]=\"lastSlide\"\n >\n <div class=\"ajf-form-page\" [ngClass]=\"'ajf-max-columns-' + maxColumns\">\n <ajf-field-row\n *ngFor=\"\n let fieldInstance of slideInstance.slideNodes[idx];\n trackBy: trackNodeById\n \"\n [instance]=\"fieldInstance | ajfAsFieldInstance\"\n [readonly]=\"readonly || !slideInstance.editable\"\n ></ajf-field-row>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ajf-page-slider-item *ngIf=\"curSlides && curSlides!.length > 0 && hasEndMessage\">\n <div class=\"ajf-form-page ajf-form-message\">\n <h2 class=\"ajf-message-title\">\n <ng-content select=\"[ajfFormEndMessageTitle]\"></ng-content>\n </h2>\n <div class=\"ajf-message-body\">\n <ng-content select=\"[ajfFormEndMessage]\"></ng-content>\n </div>\n </div>\n </ajf-page-slider-item>\n\n <div ajfPageSliderBar *ngIf=\"!hideBottomToolbar\" class=\"ajf-form-footer\">\n <ng-container *ngIf=\"curSlides | ajfFormIssues as issues\">\n <!-- The count is the control: reading that something needs\n attention and asking to be taken there is one intention, so\n it is one target rather than a label with arrows beside it. -->\n <button\n type=\"button\"\n class=\"ajf-form-footer-status\"\n *ngIf=\"issues.fields > 0\"\n (click)=\"goToNextError()\"\n >\n <mat-icon>error</mat-icon>\n <span class=\"ajf-form-footer-message\"\n >{{ '{{fields}} fields in {{slides}} slides need attention' | transloco :\n {fields: issues.fields, slides: issues.slides} }}</span\n >\n </button>\n </ng-container>\n\n <!-- Pushed to the far end of the bar by its auto margin, so it sits\n next to the slider's own paging buttons rather than next to the\n error status. -->\n <ng-container\n *ngIf=\"\n curSlides | ajfCurrentSlide : currentPage : hasStartMessage : hasEndMessage as cur\n \"\n >\n <span class=\"ajf-slide-count\" *ngIf=\"cur.pages > 1 && cur.total > 0\"\n >{{ 'slide' | transloco }} {{ cur.displayNumber }} {{ 'of' | transloco }} {{\n cur.total }}</span\n >\n </ng-container>\n </div>\n </ajf-page-slider>\n </div>\n </ng-container>\n </div>\n </form>\n</ng-container>\n", styles: ["ajf-form{display:block;height:100%}ajf-form .ajf-form-container{display:flex;flex-direction:column;box-sizing:border-box;height:100%;background:var(--ajf-bg);color:var(--ajf-text);font-family:var(--ajf-font-sans)}ajf-form .ajf-form-bar{flex:0 0 auto;border-bottom:1px solid var(--ajf-border);background:var(--ajf-surface)}ajf-form .ajf-form-save{display:inline-flex;align-items:center;gap:8px}ajf-form .ajf-form-save:empty{display:none}ajf-form>form{height:100%}ajf-form .ajf-slider-container{position:relative;flex:1 1 auto;min-height:var(--ajf-slider-min-h)}ajf-form .ajf-slider-container>ajf-page-slider{position:absolute;inset:0}ajf-form .ajf-form-page{display:flex;flex-direction:column;align-self:stretch;box-sizing:border-box;width:100%;background:var(--ajf-surface)}ajf-form .ajf-form-page.ajf-max-columns-2,ajf-form .ajf-form-page.ajf-max-columns-3{display:grid;align-content:start}ajf-form .ajf-form-page.ajf-max-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}ajf-form .ajf-form-page.ajf-max-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}@media (width <= 900px){ajf-form .ajf-form-page.ajf-max-columns-2,ajf-form .ajf-form-page.ajf-max-columns-3{grid-template-columns:minmax(0,1fr)}}ajf-form .ajf-form-message{gap:12px;padding:24px 20px}ajf-form .ajf-form-message .ajf-message-title{margin:0;font-size:20px;font-weight:600}ajf-form .ajf-form-message .ajf-message-body{color:var(--ajf-text-muted)}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar{flex-wrap:wrap;row-gap:4px;height:auto;min-height:48px;padding:6px 12px;white-space:normal;border-top:1px solid var(--ajf-border);background:var(--ajf-band);color:var(--ajf-text-muted);font-family:var(--ajf-font-sans);font-size:13px}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar .mat-mdc-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:36px;min-width:0;height:36px;min-height:0;padding:0;border:0;border-radius:50%;background:none;color:var(--ajf-text-muted);text-decoration:none}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar .mat-mdc-button .mat-icon{width:18px;height:18px;margin:0;font-size:18px}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar .mat-mdc-button:hover:not(:disabled){border-color:transparent;text-decoration:none}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar .mat-mdc-button{--mat-text-button-state-layer-color: var(--ajf-text)}ajf-form .ajf-form-footer{display:contents}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar:has(.ajf-slide-count) .ajf-spacer{flex-grow:0}ajf-form .ajf-slide-count{font-family:var(--ajf-font-mono);margin-right:8px;margin-left:auto;color:var(--ajf-text-faint)}ajf-form .ajf-form-footer-status{display:inline-flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0;padding:0;border:0;background:none;color:var(--ajf-danger);font:inherit;text-align:left;cursor:pointer}ajf-form .ajf-form-footer-status .mat-icon{width:16px;height:16px;font-size:16px}ajf-form .ajf-form-footer-status:hover .ajf-form-footer-message,ajf-form .ajf-form-footer-status:focus-visible .ajf-form-footer-message{text-decoration:underline}ajf-form .ajf-form-readonly .ajf-field-label label{font-weight:600}\n"], dependencies: [{ kind: "component", type: i2.AjfPageSliderItem, selector: "ajf-page-slider-item", inputs: ["isRepeating", "isRepeatingLast"], outputs: ["scroll"] }, { kind: "component", type: i3.AjfPageSlider, selector: "ajf-page-slider" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.AjfFieldRow, selector: "ajf-field-row", inputs: ["instance", "readonly"] }, { kind: "component", type: i8.AjfRepStrip, selector: "ajf-rep-strip", inputs: ["slide", "current", "readonly"], outputs: ["goTo", "add", "remove"] }, { kind: "component", type: i9.AjfSlideHeader, selector: "ajf-slide-header", inputs: ["slide", "displayNumber", "slides", "pages"], outputs: ["jumpTo", "prev", "next"] }, { kind: "pipe", type: i10.TranslocoPipe, name: "transloco" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.AjfAsFieldInstancePipe, name: "ajfAsFieldInstance" }, { kind: "pipe", type: i1.AjfAsRepeatingSlideInstancePipe, name: "ajfAsRepeatingSlideInstance" }, { kind: "pipe", type: i1.AjfIsRepeatingSlideInstancePipe, name: "ajfIsRepeatingSlideInstance" }, { kind: "pipe", type: i1.AjfRangePipe, name: "ajfRange" }, { kind: "pipe", type: i11.AjfCurrentSlidePipe, name: "ajfCurrentSlide" }, { kind: "pipe", type: i12.AjfFormIssuesPipe, name: "ajfFormIssues" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
53
147
  }
54
148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfFormRenderer, decorators: [{
55
149
  type: Component,
56
- args: [{ selector: 'ajf-form', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"formGroup|async as fg\">\n <form [class.ajf-form-readonly]=\"readonly\" novalidate [formGroup]=\"fg!\">\n <div class=\"ajf-form-container\">\n <mat-toolbar *ngIf=\"!hideTopToolbar && topBar\" class=\"ajf-btn-strip\">\n <mat-button-toggle-group>\n <ng-container\n *ngFor=\"let slideInstance of (slides|async); let idx = index; trackBy: trackNodeById\"\n >\n <mat-button-toggle\n *ngIf=\"slideInstance.node.label && slideInstance.node.label.length > 0\"\n class=\"ajf-topbar-button\"\n (click)=\"scrollToSlide(slideInstance)\"\n [checked]=\"isSlideToggleChecked(slideInstance, formSlider.currentPage)\"\n [disabled]=\"slideInstance.visible === false\"\n >\n {{slideInstance.node.label | transloco}} {{ getRepeatingSlideRepIndex(slideInstance,\n formSlider.currentPage)|async}}\n <mat-icon\n *ngIf=\"!slideInstance.valid && slideInstance.visible !== false\"\n class=\"ajf-warning\"\n >warning</mat-icon\n >\n <mat-icon\n *ngIf=\"slideInstance.valid && slideInstance.visible !== false\"\n class=\"ajf-success\"\n >check</mat-icon\n >\n </mat-button-toggle>\n </ng-container>\n </mat-button-toggle-group>\n </mat-toolbar>\n <mat-toolbar *ngIf=\"!hideTopToolbar\">\n {{ title }}\n <span class=\"ajf-spacer\"></span>\n <!-- this content projection allow to add buttons on toolbar -->\n <ng-content select=\"[ajfFormTopToolbarButtons]\"></ng-content>\n <!-- apply a default save button only when ajfFormSaveButton is empty -->\n <span *ngIf=\"!saveDisabled\" (click)=\"onSave($event)\">\n <span #saveButton><ng-content select=\"[ajfFormSaveButton]\"></ng-content></span>\n <button\n *ngIf=\"saveButton && saveButton.childNodes && saveButton.childNodes.length === 0\"\n mat-button\n default\n >\n {{'Save'|transloco}}\n </button>\n </span>\n </mat-toolbar>\n <div class=\"ajf-slider-container\">\n <ajf-page-slider\n (orientationChange)=\"orientationChangeHandler($event)\"\n [fixedOrientation]=\"fixedOrientation\"\n [hideNavigationButtons]=\"hideNavigationButtons\"\n [orientation]=\"orientation\"\n #formSlider\n >\n <ng-container *ngIf=\"(slides|async) as curSlides\">\n <ng-container *ngIf=\"curSlides!.length > 0 && hasStartMessage\">\n <ajf-page-slider-item>\n <div class=\"ajf-form-page\">\n <mat-card appearance=\"outlined\">\n <mat-card-header>\n <div class=\"ajf-page-slider-item-header\">\n <h2>\n <span class=\"ajf-form-header-number\"> 1 &rarr; </span>\n <span class=\"ajf-title\">\n <ng-content select=\"[ajfFormStartMessageTitle]\"></ng-content>\n </span>\n </h2>\n </div>\n </mat-card-header>\n <mat-card-content>\n <ng-content select=\"[ajfFormStartMessage]\"></ng-content>\n </mat-card-content>\n </mat-card>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n <ng-container *ngFor=\"let slideInstance of curSlides; trackBy:trackNodeById\">\n <!-- non repeating slides -->\n <ng-container *ngIf=\"slideInstance.visible\">\n <ng-container *ngIf=\"!(slideInstance|ajfIsRepeatingSlideInstance)\">\n <ajf-page-slider-item>\n <div class=\"ajf-form-page\">\n <mat-card appearance=\"outlined\">\n <mat-card-header>\n <div class=\"ajf-page-slider-item-header\">\n <h2>\n <span class=\"ajf-form-header-number\"\n >{{ slideInstance.position + (hasStartMessage | ajfBoolToInt) }}\n &rarr;</span\n >\n <span [innerHTML]=\"slideInstance.node.label | transloco\"></span>\n </h2>\n <mat-icon class=\"ajf-warning\" *ngIf=\"!slideInstance.valid\"\n >warning</mat-icon\n >\n <mat-icon class=\"ajf-success\" *ngIf=\"slideInstance.valid\"\n >check</mat-icon\n >\n </div>\n </mat-card-header>\n <mat-card-content>\n <ng-template\n ngFor\n let-fieldInstance\n [ngForOf]=\"slideInstance.flatNodes\"\n [ngForTrackBy]=\"trackNodeById\"\n >\n <mat-card\n appearance=\"outlined\"\n [ngClass]=\"'ajf-' + (fieldInstance|ajfAsFieldInstance).node.size +\n ' ajf-max-columns-' + maxColumns +\n (centeredFieldsContent ? ' ajf-centered-field' : '')\"\n class=\"ajf-field-entry\"\n *ngIf=\"fieldInstance.visible\"\n [ngStyle]=\"fieldStyle(fieldInstance|ajfAsFieldInstance)\"\n >\n <i\n [class]=\"(fieldInstance|ajfAsFieldInstance).node.fieldType | ajfFieldIcon\"\n item-right\n ></i>\n <p>\n {{ ((fieldInstance|ajfAsFieldInstance).node.description || '') |\n transloco }}\n </p>\n\n <mat-card-header>\n <mat-card-title>\n <label\n [attr.id]=\"fieldInstance.node.name\"\n *ngIf=\"(fieldInstance|ajfAsFieldInstance).node.fieldType !== 7\"\n [innerHTML]=\"fieldInstance.node.label | transloco\"\n ></label>\n </mat-card-title>\n <mat-icon\n class=\"ajf-tooltip-icon\"\n *ngIf=\"(fieldInstance|ajfAsFieldInstance).node?.hint as hint\"\n [matTooltip]=\"hint | transloco\"\n matTooltipPosition=\"right\"\n >\n {{(fieldInstance|ajfAsFieldInstance).node.hintIcon ||\n 'help'}}</mat-icon\n ></mat-card-header\n >\n <mat-card-content>\n <ajf-field\n [instance]=\"fieldInstance|ajfAsFieldInstance\"\n [readonly]=\"readonly || !slideInstance.editable\"\n [id]=\"'field_entry_' + fieldInstance.node.id\"\n >\n </ajf-field>\n </mat-card-content>\n <mat-card-actions\n [ngClass]=\"(fieldInstance|ajfAsFieldInstance)?.valid ?\n 'ajf-valid-field'\n : 'ajf-invalid-field'\"\n >\n <ng-container\n *ngIf=\"(fieldInstance|ajfAsFieldInstance)?.valid !== true; else ajfValidFieldTemplate\"\n >\n <span class=\"ajf-field-error-message\"\n >{{(fieldInstance|ajfAsFieldInstanceErrors|transloco)}}</span\n >\n <mat-icon class=\"ajf-warning\">warning</mat-icon>\n </ng-container>\n <ng-template #ajfValidFieldTemplate>\n <mat-icon class=\"ajf-success\">check</mat-icon>\n </ng-template>\n </mat-card-actions>\n </mat-card>\n </ng-template>\n </mat-card-content>\n </mat-card>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n <!-- repeating slides -->\n <ng-container *ngIf=\"(slideInstance|ajfIsRepeatingSlideInstance)\">\n <ajf-page-slider-item\n *ngFor=\"let curRep of ((slideInstance|ajfAsRepeatingSlideInstance).reps|ajfRange); let idx = index; let lastSlide = last\"\n [isRepeating]=\"true\"\n [isRepeatingLast]=\"lastSlide\"\n >\n <div class=\"ajf-form-page\">\n <mat-card appearance=\"outlined\">\n <mat-card-header>\n <div class=\"ajf-page-slider-item-header\">\n <h2>\n <span class=\"ajf-form-header-number\"\n >{{ slideInstance.position|ajfIncrement:idx + (hasStartMessage |\n ajfBoolToInt) }} &rarr;</span\n >\n <span [innerHTML]=\"slideInstance.node.label | transloco\"></span>\n </h2>\n <mat-icon class=\"ajf-warning\" *ngIf=\"!(slideInstance|ajfValidSlide:idx)\"\n >warning</mat-icon\n >\n <mat-icon class=\"ajf-success\" *ngIf=\"(slideInstance|ajfValidSlide:idx)\"\n >check</mat-icon\n >\n </div>\n </mat-card-header>\n <mat-card-content>\n <div *ngIf=\"!readonly\" class=\"ajf-group-actions\">\n <button\n *ngIf=\"lastSlide\"\n (click)=\"addGroup(slideInstance)\"\n [disabled]=\"!(slideInstance|ajfAsRepeatingSlideInstance).canAdd || ((slideInstance|ajfAsRepeatingSlideInstance).node.disableRemoval && !slideInstance.valid)\"\n mat-mini-fab\n >\n <mat-icon>add</mat-icon>\n </button>\n <button\n (click)=\"removeGroup(slideInstance, idx)\"\n [disabled]=\"!(slideInstance|ajfAsRepeatingSlideInstance).canRemove || (slideInstance|ajfAsRepeatingSlideInstance).node.disableRemoval\"\n mat-mini-fab\n >\n <mat-icon>remove</mat-icon>\n </button>\n </div>\n <ng-template\n ngFor\n let-fieldInstance\n [ngForOf]=\"slideInstance.slideNodes[idx]\"\n [ngForTrackBy]=\"trackNodeById\"\n >\n <mat-card\n appearance=\"outlined\"\n [ngClass]=\"'ajf-' + (fieldInstance|ajfAsFieldInstance).node.size +\n ' ajf-max-columns-' + maxColumns +\n (centeredFieldsContent ? ' ajf-centered-field' : '')\"\n class=\"ajf-field-entry\"\n *ngIf=\"fieldInstance.visible\"\n [ngStyle]=\"fieldStyle(fieldInstance|ajfAsFieldInstance)\"\n >\n <i\n [class]=\"(fieldInstance|ajfAsFieldInstance).node.fieldType | ajfFieldIcon\"\n item-right\n ></i>\n <p>\n {{ ((fieldInstance|ajfAsFieldInstance).node.description || '') |\n transloco }}\n </p>\n\n <mat-card-header>\n <mat-card-title>\n <label\n [attr.id]=\"fieldInstance.node.name\"\n *ngIf=\"(fieldInstance|ajfAsFieldInstance).node.fieldType !== 7\"\n [innerHTML]=\"fieldInstance.node.label | transloco\"\n ></label>\n </mat-card-title>\n <mat-icon\n class=\"ajf-tooltip-icon\"\n *ngIf=\"(fieldInstance|ajfAsFieldInstance).node?.hint as hint\"\n [matTooltip]=\"hint | transloco\"\n matTooltipPosition=\"right\"\n >\n {{(fieldInstance|ajfAsFieldInstance).node.hintIcon ||\n 'help'}}</mat-icon\n ></mat-card-header\n >\n <mat-card-content>\n <ajf-field\n [instance]=\"fieldInstance|ajfAsFieldInstance\"\n [readonly]=\"readonly || !slideInstance.editable\"\n [id]=\"'field_entry_' + fieldInstance.node.id\"\n >\n </ajf-field>\n </mat-card-content>\n <mat-card-actions\n [ngClass]=\"(fieldInstance|ajfAsFieldInstance)?.valid ?\n 'ajf-valid-field'\n : 'ajf-invalid-field'\"\n >\n <ng-container\n *ngIf=\"(fieldInstance|ajfAsFieldInstance)?.valid !== true; else ajfValidFieldTemplate\"\n >\n <span class=\"ajf-field-error-message\"\n >{{(fieldInstance|ajfAsFieldInstanceErrors)}}</span\n >\n <mat-icon class=\"ajf-warning\">warning</mat-icon>\n </ng-container>\n <ng-template #ajfValidFieldTemplate>\n <mat-icon class=\"ajf-success\">check</mat-icon>\n </ng-template>\n </mat-card-actions>\n </mat-card>\n </ng-template>\n </mat-card-content>\n </mat-card>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"curSlides && curSlides!.length > 0 && hasEndMessage\">\n <ajf-page-slider-item>\n <div class=\"ajf-form-page\">\n <mat-card appearance=\"outlined\">\n <mat-card-header>\n <div class=\"ajf-page-slider-item-header\">\n <h2>\n <span *ngIf=\"(slidesNum|async) as snum\" class=\"ajf-form-header-number\">\n {{ snum! + (hasStartMessage | ajfBoolToInt ) + 1 }} &rarr;\n </span>\n <span class=\"ajf-title\">\n <ng-content select=\"[ajfFormEndMessageTitle]\"></ng-content>\n </span>\n </h2>\n </div>\n </mat-card-header>\n <mat-card-content>\n <ng-content select=\"[ajfFormEndMessage]\"></ng-content>\n </mat-card-content>\n </mat-card>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n </ng-container>\n <div ajfPageSliderBar *ngIf=\"!hideBottomToolbar\">\n <div class=\"ajf-left-bar\">\n <div class=\"ajf-errors\" *ngIf=\"((errors | async) || 0) > 0\">\n <button mat-button (click)=\"goToPrevError()\" danger>\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button mat-button (click)=\"goToNextError()\" danger>\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n <div class=\"ajf-info-box ajf-error\">\n <div class=\"ajf-title\">{{'Errors'|transloco}}</div>\n <div class=\"ajf-content\">{{ errors | async }} / {{ slidesNum|async }}</div>\n </div>\n </div>\n </div>\n </ajf-page-slider>\n </div>\n </div>\n </form>\n</ng-container>\n", styles: ["ajf-form{display:block}ajf-form .ajf-form-readonly .ajf-field-entry>label{font-weight:700}ajf-form .ajf-form-container{display:flex;flex-direction:column;position:absolute;inset:0}ajf-form .ajf-form-container mat-toolbar.ajf-hidden{opacity:0}ajf-form .ajf-form-container .ajf-btn-strip .mat-button-toggle-group{overflow-x:auto}ajf-form .ajf-form-container .ajf-topbar-button{font-size:.8em}ajf-form .ajf-form-container mat-icon.ajf-warning{color:#f53d3d}ajf-form .ajf-form-container mat-icon.ajf-success{color:#32db64}ajf-form .ajf-form-container>.ajf-slider-container{flex:1;position:relative}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider{height:100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content{padding:16px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page{flex:1;max-height:100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card{margin:1em 0 3em}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content{display:flex;flex-wrap:wrap;flex-direction:row;align-content:flex-start;position:relative}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content .ajf-group-actions{position:absolute;right:0;top:-30px;padding:15px;z-index:10}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry{padding-right:10px;min-width:350px;display:flex;flex-direction:column;margin:5px;border-left:3px solid;border-radius:5px;min-height:30vh;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-icon{vertical-align:bottom;margin-left:5px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-max-columns-1{flex:1 0 100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-max-columns-2{flex:1 0 45%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-max-columns-3{flex:1 0 30%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-normal{width:100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-small{width:50%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-smaller{width:33%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-tiny{width:25%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-mini{width:20%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions{position:absolute;bottom:0;width:100%;display:flex;justify-content:flex-start;align-items:center;align-content:center;border-bottom-left-radius:5px;border-bottom-right-radius:5px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions.ajf-valid-field{background-color:#32db6433}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions.ajf-invalid-field{background-color:#f53d3d33}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions.ajf-invalid-field .ajf-field-error-message{margin-left:8px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-actions .mat-icon{margin-left:auto}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-radio-button,ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry ajf-checkbox-group-item .mat-mdc-button{background-color:inherit!important}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-header{margin-bottom:15px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-header .ajf-tooltip-icon{align-self:center;min-width:24px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content{position:relative;flex:1;flex-flow:row wrap;justify-content:flex-start;align-items:flex-start;padding-top:2%;padding-bottom:10%;overflow-y:auto;max-width:95%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content .mat-mdc-select{margin:20px 0}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content .mat-mdc-radio-group{display:flex;flex-flow:column wrap;justify-content:space-between}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content .mat-mdc-radio-group .mat-mdc-radio-button{flex:1 1 30%;padding:5px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .mat-mdc-card-content .ajf-errors .error{display:none}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-centered-field .mat-mdc-card-content,ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-centered-field .mat-mdc-card-header{justify-content:center;text-align:center}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry.ajf-centered-field .ajf-choices-container .mat-mdc-radio-button{text-align:start}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider ajf-page-slider-item .ajf-page-slider-item-content .ajf-form-page>mat-card>mat-card-content>.ajf-field-entry .ajf-field-range{margin-top:30px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider .ajf-page-slider-item-header{display:flex;align-items:center;width:100%}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider .ajf-page-slider-item-header>h2{flex:1}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider .ajf-page-slider-item-header>h2>.ajf-form-header-number{margin-right:.5em}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider .ajf-page-slider-item-header h2>.ajf-title{display:inline-block;margin-right:40px;white-space:normal;vertical-align:top}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar{display:flex;align-items:flex-start;flex-direction:row;position:absolute;bottom:0}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-right-button{float:right}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-button-icon-only ion-icon{padding:0 .1em}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-info-box{height:40px;padding:4px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-info-box>div{height:16px;line-height:16px}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-info-box>div.ajf-content{font-weight:700}ajf-form .ajf-form-container>.ajf-slider-container>ajf-page-slider [ajfPageSliderBar] .ajf-left-bar .ajf-info-box.ajf-error{order:2;color:red}ajf-form .ajf-form-container .ajf-spacer{flex:1 0 auto}\n"] }]
150
+ args: [{ selector: 'ajf-form', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"formGroup | async as fg\">\n <form [class.ajf-form-readonly]=\"readonly\" novalidate [formGroup]=\"fg!\">\n <div class=\"ajf-form-container\">\n <ng-container *ngIf=\"slides | async as curSlides\">\n <ng-container\n *ngIf=\"curSlides | ajfCurrentSlide : currentPage : hasStartMessage : hasEndMessage as cur\"\n >\n <div class=\"ajf-form-bar\" *ngIf=\"!hideTopToolbar\">\n <ajf-slide-header\n [slide]=\"cur.slide\"\n [slides]=\"curSlides\"\n [displayNumber]=\"cur.displayNumber\"\n [pages]=\"cur.pages\"\n (jumpTo)=\"goToSlide($event)\"\n (prev)=\"goToPrevSlide()\"\n (next)=\"goToNextSlide()\"\n >\n <!-- this content projection allows to add buttons on the slide header -->\n <ng-content select=\"[ajfFormTopToolbarButtons]\"></ng-content>\n <!-- The renderer has nowhere to save to: clicking here only emits\n `formAction`. So it ships no button of its own and holds the\n slot open instead -- a host that handles the event projects the\n button it wants, and gets the click through this wrapper. -->\n <span class=\"ajf-form-save\" *ngIf=\"!saveDisabled\" (click)=\"onSave($event)\">\n <ng-content select=\"[ajfFormSaveButton]\"></ng-content>\n </span>\n </ajf-slide-header>\n\n <ajf-rep-strip\n *ngIf=\"cur.slide && cur.reps > 0\"\n [slide]=\"cur.slide! | ajfAsRepeatingSlideInstance\"\n [current]=\"cur.repIndex\"\n [readonly]=\"readonly\"\n (goTo)=\"goToRep(cur.slide!, $event)\"\n (add)=\"addGroup(cur.slide!)\"\n (remove)=\"removeGroup(cur.slide!, cur.repIndex)\"\n ></ajf-rep-strip>\n </div>\n </ng-container>\n\n <div class=\"ajf-slider-container\">\n <ajf-page-slider\n (orientationChange)=\"orientationChangeHandler($event)\"\n [fixedOrientation]=\"fixedOrientation\"\n [hideNavigationButtons]=\"hideNavigationButtons\"\n [orientation]=\"orientation\"\n #formSlider\n >\n <ajf-page-slider-item *ngIf=\"curSlides!.length > 0 && hasStartMessage\">\n <div class=\"ajf-form-page ajf-form-message\">\n <h2 class=\"ajf-message-title\">\n <ng-content select=\"[ajfFormStartMessageTitle]\"></ng-content>\n </h2>\n <div class=\"ajf-message-body\">\n <ng-content select=\"[ajfFormStartMessage]\"></ng-content>\n </div>\n </div>\n </ajf-page-slider-item>\n\n <ng-container *ngFor=\"let slideInstance of curSlides; trackBy: trackNodeById\">\n <ng-container *ngIf=\"slideInstance.visible\">\n <!-- non repeating slides -->\n <ng-container *ngIf=\"!(slideInstance | ajfIsRepeatingSlideInstance)\">\n <ajf-page-slider-item>\n <div class=\"ajf-form-page\" [ngClass]=\"'ajf-max-columns-' + maxColumns\">\n <ajf-field-row\n *ngFor=\"let fieldInstance of slideInstance.flatNodes; trackBy: trackNodeById\"\n [instance]=\"fieldInstance | ajfAsFieldInstance\"\n [readonly]=\"readonly || !slideInstance.editable\"\n ></ajf-field-row>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n\n <!-- repeating slides: one page per repetition -->\n <ng-container *ngIf=\"slideInstance | ajfIsRepeatingSlideInstance\">\n <ajf-page-slider-item\n *ngFor=\"\n let curRep of (slideInstance | ajfAsRepeatingSlideInstance).reps | ajfRange;\n let idx = index;\n let lastSlide = last\n \"\n [isRepeating]=\"true\"\n [isRepeatingLast]=\"lastSlide\"\n >\n <div class=\"ajf-form-page\" [ngClass]=\"'ajf-max-columns-' + maxColumns\">\n <ajf-field-row\n *ngFor=\"\n let fieldInstance of slideInstance.slideNodes[idx];\n trackBy: trackNodeById\n \"\n [instance]=\"fieldInstance | ajfAsFieldInstance\"\n [readonly]=\"readonly || !slideInstance.editable\"\n ></ajf-field-row>\n </div>\n </ajf-page-slider-item>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ajf-page-slider-item *ngIf=\"curSlides && curSlides!.length > 0 && hasEndMessage\">\n <div class=\"ajf-form-page ajf-form-message\">\n <h2 class=\"ajf-message-title\">\n <ng-content select=\"[ajfFormEndMessageTitle]\"></ng-content>\n </h2>\n <div class=\"ajf-message-body\">\n <ng-content select=\"[ajfFormEndMessage]\"></ng-content>\n </div>\n </div>\n </ajf-page-slider-item>\n\n <div ajfPageSliderBar *ngIf=\"!hideBottomToolbar\" class=\"ajf-form-footer\">\n <ng-container *ngIf=\"curSlides | ajfFormIssues as issues\">\n <!-- The count is the control: reading that something needs\n attention and asking to be taken there is one intention, so\n it is one target rather than a label with arrows beside it. -->\n <button\n type=\"button\"\n class=\"ajf-form-footer-status\"\n *ngIf=\"issues.fields > 0\"\n (click)=\"goToNextError()\"\n >\n <mat-icon>error</mat-icon>\n <span class=\"ajf-form-footer-message\"\n >{{ '{{fields}} fields in {{slides}} slides need attention' | transloco :\n {fields: issues.fields, slides: issues.slides} }}</span\n >\n </button>\n </ng-container>\n\n <!-- Pushed to the far end of the bar by its auto margin, so it sits\n next to the slider's own paging buttons rather than next to the\n error status. -->\n <ng-container\n *ngIf=\"\n curSlides | ajfCurrentSlide : currentPage : hasStartMessage : hasEndMessage as cur\n \"\n >\n <span class=\"ajf-slide-count\" *ngIf=\"cur.pages > 1 && cur.total > 0\"\n >{{ 'slide' | transloco }} {{ cur.displayNumber }} {{ 'of' | transloco }} {{\n cur.total }}</span\n >\n </ng-container>\n </div>\n </ajf-page-slider>\n </div>\n </ng-container>\n </div>\n </form>\n</ng-container>\n", styles: ["ajf-form{display:block;height:100%}ajf-form .ajf-form-container{display:flex;flex-direction:column;box-sizing:border-box;height:100%;background:var(--ajf-bg);color:var(--ajf-text);font-family:var(--ajf-font-sans)}ajf-form .ajf-form-bar{flex:0 0 auto;border-bottom:1px solid var(--ajf-border);background:var(--ajf-surface)}ajf-form .ajf-form-save{display:inline-flex;align-items:center;gap:8px}ajf-form .ajf-form-save:empty{display:none}ajf-form>form{height:100%}ajf-form .ajf-slider-container{position:relative;flex:1 1 auto;min-height:var(--ajf-slider-min-h)}ajf-form .ajf-slider-container>ajf-page-slider{position:absolute;inset:0}ajf-form .ajf-form-page{display:flex;flex-direction:column;align-self:stretch;box-sizing:border-box;width:100%;background:var(--ajf-surface)}ajf-form .ajf-form-page.ajf-max-columns-2,ajf-form .ajf-form-page.ajf-max-columns-3{display:grid;align-content:start}ajf-form .ajf-form-page.ajf-max-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}ajf-form .ajf-form-page.ajf-max-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}@media (width <= 900px){ajf-form .ajf-form-page.ajf-max-columns-2,ajf-form .ajf-form-page.ajf-max-columns-3{grid-template-columns:minmax(0,1fr)}}ajf-form .ajf-form-message{gap:12px;padding:24px 20px}ajf-form .ajf-form-message .ajf-message-title{margin:0;font-size:20px;font-weight:600}ajf-form .ajf-form-message .ajf-message-body{color:var(--ajf-text-muted)}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar{flex-wrap:wrap;row-gap:4px;height:auto;min-height:48px;padding:6px 12px;white-space:normal;border-top:1px solid var(--ajf-border);background:var(--ajf-band);color:var(--ajf-text-muted);font-family:var(--ajf-font-sans);font-size:13px}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar .mat-mdc-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:36px;min-width:0;height:36px;min-height:0;padding:0;border:0;border-radius:50%;background:none;color:var(--ajf-text-muted);text-decoration:none}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar .mat-mdc-button .mat-icon{width:18px;height:18px;margin:0;font-size:18px}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar .mat-mdc-button:hover:not(:disabled){border-color:transparent;text-decoration:none}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar .mat-mdc-button{--mat-text-button-state-layer-color: var(--ajf-text)}ajf-form .ajf-form-footer{display:contents}ajf-form ajf-page-slider>mat-toolbar.ajf-toolbar:has(.ajf-slide-count) .ajf-spacer{flex-grow:0}ajf-form .ajf-slide-count{font-family:var(--ajf-font-mono);margin-right:8px;margin-left:auto;color:var(--ajf-text-faint)}ajf-form .ajf-form-footer-status{display:inline-flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0;padding:0;border:0;background:none;color:var(--ajf-danger);font:inherit;text-align:left;cursor:pointer}ajf-form .ajf-form-footer-status .mat-icon{width:16px;height:16px;font-size:16px}ajf-form .ajf-form-footer-status:hover .ajf-form-footer-message,ajf-form .ajf-form-footer-status:focus-visible .ajf-form-footer-message{text-decoration:underline}ajf-form .ajf-form-readonly .ajf-field-label label{font-weight:600}\n"] }]
57
151
  }], ctorParameters: () => [{ type: i1.AjfFormRendererService }, { type: i0.ChangeDetectorRef }], propDecorators: { topBar: [{
58
152
  type: Input
59
153
  }], centeredFieldsContent: [{
@@ -61,4 +155,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
61
155
  }], maxColumns: [{
62
156
  type: Input
63
157
  }] } });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm1zL3NyYy9mb3JtLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybXMvc3JjL2Zvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQ0wsZUFBZSxJQUFJLGdCQUFnQixFQUduQyxZQUFZLEdBQ2IsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFTdkIsTUFBTSxPQUFPLGVBQWdCLFNBQVEsZ0JBQWdCO0lBS25ELFlBQVksZUFBdUMsRUFBRSxpQkFBb0M7UUFDdkYsS0FBSyxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBTG5DLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBQ3ZDLGVBQVUsR0FBYyxDQUFDLENBQUM7SUFJbkMsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUF1QjtRQUNoQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDN0UsT0FBTyxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOytHQWRVLGVBQWU7bUdBQWYsZUFBZSwrS0M1QzVCLDY1akJBc1ZBOzs0RkQxU2EsZUFBZTtrQkFQM0IsU0FBUzsrQkFDRSxVQUFVLGlCQUdMLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07MkhBR3RDLE1BQU07c0JBQWQsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtcbiAgQWpmRm9ybVJlbmRlcmVyIGFzIENvcmVGb3JtUmVuZGVyZXIsXG4gIEFqZkZvcm1SZW5kZXJlclNlcnZpY2UsXG4gIEFqZkZpZWxkSW5zdGFuY2UsXG4gIEFqZkZpZWxkVHlwZSxcbn0gZnJvbSAnQGFqZi9jb3JlL2Zvcm1zJztcbmltcG9ydCB7Qm9vbGVhbklucHV0fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FqZi1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICdmb3JtLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZm9ybS5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBamZGb3JtUmVuZGVyZXIgZXh0ZW5kcyBDb3JlRm9ybVJlbmRlcmVyIHtcbiAgQElucHV0KCkgdG9wQmFyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNlbnRlcmVkRmllbGRzQ29udGVudDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXhDb2x1bW5zOiAxIHwgMiB8IDMgPSAxO1xuXG4gIGNvbnN0cnVjdG9yKHJlbmRlcmVyU2VydmljZTogQWpmRm9ybVJlbmRlcmVyU2VydmljZSwgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgc3VwZXIocmVuZGVyZXJTZXJ2aWNlLCBjaGFuZ2VEZXRlY3RvclJlZik7XG4gIH1cblxuICBmaWVsZFN0eWxlKGZpZWxkOiBBamZGaWVsZEluc3RhbmNlKTogYW55IHtcbiAgICBpZiAoZmllbGQubm9kZS5maWVsZFR5cGUgPT09IEFqZkZpZWxkVHlwZS5Gb3JtdWxhICYmIGZpZWxkLm5vZGUubGFiZWwgPT09ICcnKSB7XG4gICAgICByZXR1cm4ge2Rpc3BsYXk6ICdub25lJ307XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9maXhlZE9yaWVudGF0aW9uOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9oYXNFbmRNZXNzYWdlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9oYXNTdGFydE1lc3NhZ2U6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2hpZGVCb3R0b21Ub29sYmFyOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9oaWRlTmF2aWdhdGlvbkJ1dHRvbnM6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2hpZGVUb3BUb29sYmFyOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9yZWFkb25seTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfc2F2ZURpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUdyb3VwfGFzeW5jIGFzIGZnXCI+XG4gIDxmb3JtIFtjbGFzcy5hamYtZm9ybS1yZWFkb25seV09XCJyZWFkb25seVwiIG5vdmFsaWRhdGUgW2Zvcm1Hcm91cF09XCJmZyFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYWpmLWZvcm0tY29udGFpbmVyXCI+XG4gICAgICA8bWF0LXRvb2xiYXIgKm5nSWY9XCIhaGlkZVRvcFRvb2xiYXIgJiYgdG9wQmFyXCIgY2xhc3M9XCJhamYtYnRuLXN0cmlwXCI+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2xpZGVJbnN0YW5jZSBvZiAoc2xpZGVzfGFzeW5jKTsgbGV0IGlkeCA9IGluZGV4OyB0cmFja0J5OiB0cmFja05vZGVCeUlkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgKm5nSWY9XCJzbGlkZUluc3RhbmNlLm5vZGUubGFiZWwgJiYgc2xpZGVJbnN0YW5jZS5ub2RlLmxhYmVsLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImFqZi10b3BiYXItYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNjcm9sbFRvU2xpZGUoc2xpZGVJbnN0YW5jZSlcIlxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NsaWRlVG9nZ2xlQ2hlY2tlZChzbGlkZUluc3RhbmNlLCBmb3JtU2xpZGVyLmN1cnJlbnRQYWdlKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzbGlkZUluc3RhbmNlLnZpc2libGUgPT09IGZhbHNlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3tzbGlkZUluc3RhbmNlLm5vZGUubGFiZWwgfCB0cmFuc2xvY299fSB7eyBnZXRSZXBlYXRpbmdTbGlkZVJlcEluZGV4KHNsaWRlSW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZvcm1TbGlkZXIuY3VycmVudFBhZ2UpfGFzeW5jfX1cbiAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhc2xpZGVJbnN0YW5jZS52YWxpZCAmJiBzbGlkZUluc3RhbmNlLnZpc2libGUgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFqZi13YXJuaW5nXCJcbiAgICAgICAgICAgICAgICA+d2FybmluZzwvbWF0LWljb25cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cInNsaWRlSW5zdGFuY2UudmFsaWQgJiYgc2xpZGVJbnN0YW5jZS52aXNpYmxlICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhamYtc3VjY2Vzc1wiXG4gICAgICAgICAgICAgICAgPmNoZWNrPC9tYXQtaWNvblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuICAgICAgPC9tYXQtdG9vbGJhcj5cbiAgICAgIDxtYXQtdG9vbGJhciAqbmdJZj1cIiFoaWRlVG9wVG9vbGJhclwiPlxuICAgICAgICB7eyB0aXRsZSB9fVxuICAgICAgICA8c3BhbiBjbGFzcz1cImFqZi1zcGFjZXJcIj48L3NwYW4+XG4gICAgICAgIDwhLS0gdGhpcyBjb250ZW50IHByb2plY3Rpb24gYWxsb3cgdG8gYWRkIGJ1dHRvbnMgb24gdG9vbGJhciAtLT5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FqZkZvcm1Ub3BUb29sYmFyQnV0dG9uc11cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwhLS0gYXBwbHkgYSBkZWZhdWx0IHNhdmUgYnV0dG9uIG9ubHkgd2hlbiBhamZGb3JtU2F2ZUJ1dHRvbiBpcyBlbXB0eSAtLT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2F2ZURpc2FibGVkXCIgKGNsaWNrKT1cIm9uU2F2ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPHNwYW4gI3NhdmVCdXR0b24+PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FqZkZvcm1TYXZlQnV0dG9uXVwiPjwvbmctY29udGVudD48L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzYXZlQnV0dG9uICYmIHNhdmVCdXR0b24uY2hpbGROb2RlcyAmJiBzYXZlQnV0dG9uLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIGRlZmF1bHRcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eydTYXZlJ3x0cmFuc2xvY299fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L21hdC10b29sYmFyPlxuICAgICAgPGRpdiBjbGFzcz1cImFqZi1zbGlkZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxhamYtcGFnZS1zbGlkZXJcbiAgICAgICAgICAob3JpZW50YXRpb25DaGFuZ2UpPVwib3JpZW50YXRpb25DaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgIFtmaXhlZE9yaWVudGF0aW9uXT1cImZpeGVkT3JpZW50YXRpb25cIlxuICAgICAgICAgIFtoaWRlTmF2aWdhdGlvbkJ1dHRvbnNdPVwiaGlkZU5hdmlnYXRpb25CdXR0b25zXCJcbiAgICAgICAgICBbb3JpZW50YXRpb25dPVwib3JpZW50YXRpb25cIlxuICAgICAgICAgICNmb3JtU2xpZGVyXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHNsaWRlc3xhc3luYykgYXMgY3VyU2xpZGVzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VyU2xpZGVzIS5sZW5ndGggPiAwICYmIGhhc1N0YXJ0TWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8YWpmLXBhZ2Utc2xpZGVyLWl0ZW0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi1mb3JtLXBhZ2VcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2Utc2xpZGVyLWl0ZW0taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWpmLWZvcm0taGVhZGVyLW51bWJlclwiPiAxICZyYXJyOyA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWpmLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FqZkZvcm1TdGFydE1lc3NhZ2VUaXRsZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWpmRm9ybVN0YXJ0TWVzc2FnZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvYWpmLXBhZ2Utc2xpZGVyLWl0ZW0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNsaWRlSW5zdGFuY2Ugb2YgY3VyU2xpZGVzOyB0cmFja0J5OnRyYWNrTm9kZUJ5SWRcIj5cbiAgICAgICAgICAgICAgPCEtLSBub24gcmVwZWF0aW5nIHNsaWRlcyAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNsaWRlSW5zdGFuY2UudmlzaWJsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKHNsaWRlSW5zdGFuY2V8YWpmSXNSZXBlYXRpbmdTbGlkZUluc3RhbmNlKVwiPlxuICAgICAgICAgICAgICAgICAgPGFqZi1wYWdlLXNsaWRlci1pdGVtPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLWZvcm0tcGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnZS1zbGlkZXItaXRlbS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFqZi1mb3JtLWhlYWRlci1udW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgc2xpZGVJbnN0YW5jZS5wb3NpdGlvbiArIChoYXNTdGFydE1lc3NhZ2UgfCBhamZCb29sVG9JbnQpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYXJyOzwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJzbGlkZUluc3RhbmNlLm5vZGUubGFiZWwgfCB0cmFuc2xvY29cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhamYtd2FybmluZ1wiICpuZ0lmPVwiIXNsaWRlSW5zdGFuY2UudmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPndhcm5pbmc8L21hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFqZi1zdWNjZXNzXCIgKm5nSWY9XCJzbGlkZUluc3RhbmNlLnZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5jaGVjazwvbWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdGb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtZmllbGRJbnN0YW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0Zvck9mXT1cInNsaWRlSW5zdGFuY2UuZmxhdE5vZGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdGb3JUcmFja0J5XT1cInRyYWNrTm9kZUJ5SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ2FqZi0nICsgKGZpZWxkSW5zdGFuY2V8YWpmQXNGaWVsZEluc3RhbmNlKS5ub2RlLnNpemUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhamYtbWF4LWNvbHVtbnMtJyArIG1heENvbHVtbnMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbnRlcmVkRmllbGRzQ29udGVudCA/ICcgYWpmLWNlbnRlcmVkLWZpZWxkJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFqZi1maWVsZC1lbnRyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkSW5zdGFuY2UudmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJmaWVsZFN0eWxlKGZpZWxkSW5zdGFuY2V8YWpmQXNGaWVsZEluc3RhbmNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIihmaWVsZEluc3RhbmNlfGFqZkFzRmllbGRJbnN0YW5jZSkubm9kZS5maWVsZFR5cGUgfCBhamZGaWVsZEljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLXJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICgoZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2UpLm5vZGUuZGVzY3JpcHRpb24gfHwgJycpIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImZpZWxkSW5zdGFuY2Uubm9kZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGZpZWxkSW5zdGFuY2V8YWpmQXNGaWVsZEluc3RhbmNlKS5ub2RlLmZpZWxkVHlwZSAhPT0gN1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImZpZWxkSW5zdGFuY2Uubm9kZS5sYWJlbCB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWpmLXRvb2x0aXAtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2UpLm5vZGU/LmhpbnQgYXMgaGludFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaGludCB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2UpLm5vZGUuaGludEljb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVscCd9fTwvbWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbWF0LWNhcmQtaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFqZi1maWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnN0YW5jZV09XCJmaWVsZEluc3RhbmNlfGFqZkFzRmllbGRJbnN0YW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8ICFzbGlkZUluc3RhbmNlLmVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2ZpZWxkX2VudHJ5XycgKyBmaWVsZEluc3RhbmNlLm5vZGUuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYWpmLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWFjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKGZpZWxkSW5zdGFuY2V8YWpmQXNGaWVsZEluc3RhbmNlKT8udmFsaWQgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWpmLXZhbGlkLWZpZWxkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdhamYtaW52YWxpZC1maWVsZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2UpPy52YWxpZCAhPT0gdHJ1ZTsgZWxzZSBhamZWYWxpZEZpZWxkVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhamYtZmllbGQtZXJyb3ItbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3soZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2VFcnJvcnN8dHJhbnNsb2NvKX19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFqZi13YXJuaW5nXCI+d2FybmluZzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FqZlZhbGlkRmllbGRUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhamYtc3VjY2Vzc1wiPmNoZWNrPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtYWN0aW9ucz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9hamYtcGFnZS1zbGlkZXItaXRlbT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8IS0tIHJlcGVhdGluZyBzbGlkZXMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihzbGlkZUluc3RhbmNlfGFqZklzUmVwZWF0aW5nU2xpZGVJbnN0YW5jZSlcIj5cbiAgICAgICAgICAgICAgICAgIDxhamYtcGFnZS1zbGlkZXItaXRlbVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY3VyUmVwIG9mICgoc2xpZGVJbnN0YW5jZXxhamZBc1JlcGVhdGluZ1NsaWRlSW5zdGFuY2UpLnJlcHN8YWpmUmFuZ2UpOyBsZXQgaWR4ID0gaW5kZXg7IGxldCBsYXN0U2xpZGUgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2lzUmVwZWF0aW5nXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbaXNSZXBlYXRpbmdMYXN0XT1cImxhc3RTbGlkZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtZm9ybS1wYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi1wYWdlLXNsaWRlci1pdGVtLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWpmLWZvcm0taGVhZGVyLW51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBzbGlkZUluc3RhbmNlLnBvc2l0aW9ufGFqZkluY3JlbWVudDppZHggKyAoaGFzU3RhcnRNZXNzYWdlIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWpmQm9vbFRvSW50KSB9fSAmcmFycjs8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwic2xpZGVJbnN0YW5jZS5ub2RlLmxhYmVsIHwgdHJhbnNsb2NvXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWpmLXdhcm5pbmdcIiAqbmdJZj1cIiEoc2xpZGVJbnN0YW5jZXxhamZWYWxpZFNsaWRlOmlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPndhcm5pbmc8L21hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFqZi1zdWNjZXNzXCIgKm5nSWY9XCIoc2xpZGVJbnN0YW5jZXxhamZWYWxpZFNsaWRlOmlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPmNoZWNrPC9tYXQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXJlYWRvbmx5XCIgY2xhc3M9XCJhamYtZ3JvdXAtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibGFzdFNsaWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRHcm91cChzbGlkZUluc3RhbmNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIShzbGlkZUluc3RhbmNlfGFqZkFzUmVwZWF0aW5nU2xpZGVJbnN0YW5jZSkuY2FuQWRkIHx8ICgoc2xpZGVJbnN0YW5jZXxhamZBc1JlcGVhdGluZ1NsaWRlSW5zdGFuY2UpLm5vZGUuZGlzYWJsZVJlbW92YWwgJiYgIXNsaWRlSW5zdGFuY2UudmFsaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1taW5pLWZhYlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVHcm91cChzbGlkZUluc3RhbmNlLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhKHNsaWRlSW5zdGFuY2V8YWpmQXNSZXBlYXRpbmdTbGlkZUluc3RhbmNlKS5jYW5SZW1vdmUgfHwgKHNsaWRlSW5zdGFuY2V8YWpmQXNSZXBlYXRpbmdTbGlkZUluc3RhbmNlKS5ub2RlLmRpc2FibGVSZW1vdmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1taW5pLWZhYlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yZW1vdmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdGb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtZmllbGRJbnN0YW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0Zvck9mXT1cInNsaWRlSW5zdGFuY2Uuc2xpZGVOb2Rlc1tpZHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdGb3JUcmFja0J5XT1cInRyYWNrTm9kZUJ5SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ2FqZi0nICsgKGZpZWxkSW5zdGFuY2V8YWpmQXNGaWVsZEluc3RhbmNlKS5ub2RlLnNpemUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhamYtbWF4LWNvbHVtbnMtJyArIG1heENvbHVtbnMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbnRlcmVkRmllbGRzQ29udGVudCA/ICcgYWpmLWNlbnRlcmVkLWZpZWxkJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFqZi1maWVsZC1lbnRyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkSW5zdGFuY2UudmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJmaWVsZFN0eWxlKGZpZWxkSW5zdGFuY2V8YWpmQXNGaWVsZEluc3RhbmNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIihmaWVsZEluc3RhbmNlfGFqZkFzRmllbGRJbnN0YW5jZSkubm9kZS5maWVsZFR5cGUgfCBhamZGaWVsZEljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLXJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICgoZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2UpLm5vZGUuZGVzY3JpcHRpb24gfHwgJycpIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImZpZWxkSW5zdGFuY2Uubm9kZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGZpZWxkSW5zdGFuY2V8YWpmQXNGaWVsZEluc3RhbmNlKS5ub2RlLmZpZWxkVHlwZSAhPT0gN1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImZpZWxkSW5zdGFuY2Uubm9kZS5sYWJlbCB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWpmLXRvb2x0aXAtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2UpLm5vZGU/LmhpbnQgYXMgaGludFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaGludCB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2UpLm5vZGUuaGludEljb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVscCd9fTwvbWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbWF0LWNhcmQtaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFqZi1maWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnN0YW5jZV09XCJmaWVsZEluc3RhbmNlfGFqZkFzRmllbGRJbnN0YW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8ICFzbGlkZUluc3RhbmNlLmVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2ZpZWxkX2VudHJ5XycgKyBmaWVsZEluc3RhbmNlLm5vZGUuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYWpmLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWFjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKGZpZWxkSW5zdGFuY2V8YWpmQXNGaWVsZEluc3RhbmNlKT8udmFsaWQgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWpmLXZhbGlkLWZpZWxkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdhamYtaW52YWxpZC1maWVsZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2UpPy52YWxpZCAhPT0gdHJ1ZTsgZWxzZSBhamZWYWxpZEZpZWxkVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhamYtZmllbGQtZXJyb3ItbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3soZmllbGRJbnN0YW5jZXxhamZBc0ZpZWxkSW5zdGFuY2VFcnJvcnMpfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWpmLXdhcm5pbmdcIj53YXJuaW5nPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYWpmVmFsaWRGaWVsZFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFqZi1zdWNjZXNzXCI+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2FqZi1wYWdlLXNsaWRlci1pdGVtPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1clNsaWRlcyAmJiBjdXJTbGlkZXMhLmxlbmd0aCA+IDAgJiYgaGFzRW5kTWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8YWpmLXBhZ2Utc2xpZGVyLWl0ZW0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi1mb3JtLXBhZ2VcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2Utc2xpZGVyLWl0ZW0taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiKHNsaWRlc051bXxhc3luYykgYXMgc251bVwiIGNsYXNzPVwiYWpmLWZvcm0taGVhZGVyLW51bWJlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNudW0hICsgKGhhc1N0YXJ0TWVzc2FnZSB8IGFqZkJvb2xUb0ludCApICsgMSB9fSAmcmFycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFqZi10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthamZGb3JtRW5kTWVzc2FnZVRpdGxlXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthamZGb3JtRW5kTWVzc2FnZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvYWpmLXBhZ2Utc2xpZGVyLWl0ZW0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2IGFqZlBhZ2VTbGlkZXJCYXIgKm5nSWY9XCIhaGlkZUJvdHRvbVRvb2xiYXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtbGVmdC1iYXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi1lcnJvcnNcIiAqbmdJZj1cIigoZXJyb3JzIHwgYXN5bmMpIHx8IDApID4gMFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiZ29Ub1ByZXZFcnJvcigpXCIgZGFuZ2VyPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X3Vwd2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJnb1RvTmV4dEVycm9yKClcIiBkYW5nZXI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi1pbmZvLWJveCBhamYtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXRpdGxlXCI+e3snRXJyb3JzJ3x0cmFuc2xvY299fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtY29udGVudFwiPnt7IGVycm9ycyB8IGFzeW5jIH19IC8ge3sgc2xpZGVzTnVtfGFzeW5jIH19PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYWpmLXBhZ2Utc2xpZGVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvbmctY29udGFpbmVyPlxuIl19
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm1zL3NyYy9mb3JtLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybXMvc3JjL2Zvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBRUwsWUFBWSxFQUNaLGVBQWUsSUFBSSxnQkFBZ0IsRUFJbkMsd0JBQXdCLEdBQ3pCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsS0FBSyxFQUVMLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsS0FBSyxFQUFFLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBU3pDLE1BQU0sT0FBTyxlQUNYLFNBQVEsZ0JBQWdCO0lBaUN4QixZQUFZLGVBQXVDLEVBQUUsaUJBQW9DO1FBQ3ZGLEtBQUssQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQS9CNUM7Ozs7V0FJRztRQUNNLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFFakM7OztXQUdHO1FBQ00sMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBRWhELDRDQUE0QztRQUNuQyxlQUFVLEdBQWMsQ0FBQyxDQUFDO1FBRW5DOzs7O1dBSUc7UUFDSCxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUVSLGVBQVUsR0FBdUIsRUFBRSxDQUFDO1FBQ3BDLDBCQUFxQixHQUFpQixZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3pELHdCQUFtQixHQUFpQixZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3ZELHVCQUFrQixHQUFpQixZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3RELHNCQUFpQixHQUFpQixZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3JELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFJeEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hELElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNILHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUsNkVBQTZFO1FBQzdFLDZDQUE2QztRQUM3QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVM7YUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ3JELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUMzRCw0RUFBNEU7UUFDNUUsMEVBQTBFO1FBQzFFLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQ3RELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFUSxrQkFBa0I7UUFDekIsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1lBQy9DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRVEsV0FBVztRQUNsQixJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBdUI7UUFDaEMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzdFLE9BQU8sRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFDLENBQUM7UUFDM0IsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELHNFQUFzRTtJQUN0RSxTQUFTLENBQUMsS0FBdUI7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxPQUFPLENBQUMsS0FBdUIsRUFBRSxRQUFnQjtRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBQyxHQUFHLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLE9BQU8sQ0FBQyxLQUF1QjtRQUNyQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzFCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLE1BQU07WUFDUixDQUFDO1lBQ0QsSUFBSSxJQUFJLHdCQUF3QixDQUFDLEdBQUcsQ0FBQztnQkFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFHLEdBQWlDLENBQUMsSUFBSSxDQUFDO2dCQUN0RCxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLFFBQVEsQ0FBQyxJQUFZO1FBQzNCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDOytHQTVIVSxlQUFlO21HQUFmLGVBQWUsK0tDbkQ1QixpbU9Bc0pBOzs0RkRuR2EsZUFBZTtrQkFQM0IsU0FBUzsrQkFDRSxVQUFVLGlCQUdMLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07MkhBV3RDLE1BQU07c0JBQWQsS0FBSztnQkFNRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtcbiAgQWpmRmllbGRJbnN0YW5jZSxcbiAgQWpmRmllbGRUeXBlLFxuICBBamZGb3JtUmVuZGVyZXIgYXMgQ29yZUZvcm1SZW5kZXJlcixcbiAgQWpmRm9ybVJlbmRlcmVyU2VydmljZSxcbiAgQWpmUmVwZWF0aW5nU2xpZGVJbnN0YW5jZSxcbiAgQWpmU2xpZGVJbnN0YW5jZSxcbiAgaXNSZXBlYXRpbmdTbGlkZUluc3RhbmNlLFxufSBmcm9tICdAYWpmL2NvcmUvZm9ybXMnO1xuaW1wb3J0IHtCb29sZWFuSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtFTVBUWSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7c3dpdGNoTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FqZi1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICdmb3JtLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZm9ybS5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBamZGb3JtUmVuZGVyZXJcbiAgZXh0ZW5kcyBDb3JlRm9ybVJlbmRlcmVyXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgc2xpZGUgc3RyaXAgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIGp1bXAgbWVudSBpbiB0aGUgc2xpZGVcbiAgICogaGVhZGVyLCB3aGljaCBpcyBhbHdheXMgYXZhaWxhYmxlLiBLZXB0IHNvIHRoYXQgZXhpc3RpbmcgdGVtcGxhdGVzIHN0aWxsXG4gICAqIGNvbXBpbGUuXG4gICAqL1xuICBASW5wdXQoKSB0b3BCYXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgRmllbGQgcm93cyBhbGlnbiB0aGVpciBsYWJlbHMgYW5kIGNvbnRyb2xzIG9uIGEgc2hhcmVkIGdyaWQsIHNvXG4gICAqIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBjZW50cmUuXG4gICAqL1xuICBASW5wdXQoKSBjZW50ZXJlZEZpZWxkc0NvbnRlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogSG93IG1hbnkgZmllbGQgcm93cyBzaXQgc2lkZSBieSBzaWRlLiAqL1xuICBASW5wdXQoKSBtYXhDb2x1bW5zOiAxIHwgMiB8IDMgPSAxO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFnZSB0aGUgc2xpZGVyIGlzIHNob3dpbmcuIFRoZSBzbGlkZSBoZWFkZXIgaXMgcmVuZGVyZWQgb25jZSwgYWJvdmUgdGhlXG4gICAqIHNsaWRlciwgc28gaXQgbmVlZHMgdG8ga25vdyB3aGljaCBzbGlkZSBpcyBvbiBzY3JlZW47IHRoZSBwYWdlIHNsaWRlciBvbmx5XG4gICAqIHJlcG9ydHMgdGhhdCBpbXBlcmF0aXZlbHksIGhlbmNlIHRoZSBtaXJyb3JlZCBwcm9wZXJ0eS5cbiAgICovXG4gIGN1cnJlbnRQYWdlID0gMDtcblxuICBwcml2YXRlIF9zbGlkZUxpc3Q6IEFqZlNsaWRlSW5zdGFuY2VbXSA9IFtdO1xuICBwcml2YXRlIF92YWxpZGl0eVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9zbGlkZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBfdmFsdWVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBfcGFnZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9wYWdlSW5pdCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHJlbmRlcmVyU2VydmljZTogQWpmRm9ybVJlbmRlcmVyU2VydmljZSwgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgc3VwZXIocmVuZGVyZXJTZXJ2aWNlLCBjaGFuZ2VEZXRlY3RvclJlZik7XG4gICAgdGhpcy5fc2xpZGVzU3Vic2NyaXB0aW9uID0gdGhpcy5zbGlkZXMuc3Vic2NyaWJlKHNsaWRlcyA9PiB7XG4gICAgICB0aGlzLl9zbGlkZUxpc3QgPSBzbGlkZXMgfHwgW107XG4gICAgfSk7XG4gICAgLy8gVGhpcyBjb21wb25lbnQgaXMgT25QdXNoLCBhbmQgY2hpbGRyZW4gYXJlIG9ubHkgdmlzaXRlZCB3aGVuIGl0IGlzXG4gICAgLy8gY2hlY2tlZC4gVGhlIHNsaWRlIGhlYWRlciByZXBvcnRzIGxpdmUgc3RhdGUgLS0gaG93IG1hbnkgZmllbGRzIGFyZVxuICAgIC8vIGZpbGxlZCwgaG93IG1hbnkgYXJlIGZhaWxpbmcgLS0gc28gYSB2YWx1ZSBjaGFuZ2UgYW55d2hlcmUgaW4gdGhlIGZvcm0gaGFzXG4gICAgLy8gdG8gYnJpbmcgdGhlIHJlbmRlcmVyIGJhY2sgaW50byB0aGUgY2hlY2suXG4gICAgdGhpcy5fdmFsdWVTdWJzY3JpcHRpb24gPSB0aGlzLmZvcm1Hcm91cFxuICAgICAgLnBpcGUoc3dpdGNoTWFwKGZnID0+IChmZyA/IGZnLnZhbHVlQ2hhbmdlcyA6IEVNUFRZKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKTtcbiAgICAvLyBWYWxpZGl0eSBtb3ZlcyB3aXRob3V0IGEgdmFsdWUgbW92aW5nIHdpdGggaXQgLS0gYSB2aXNpYmlsaXR5IGNoYW5nZSBvciBhXG4gICAgLy8gcmVjYWxjdWxhdGVkIGZvcm11bGEgaXMgZW5vdWdoIC0tIGFuZCB0aGUgaXNzdWUgY291bnRzIGFyZSByZWFkIHRocm91Z2hcbiAgICAvLyBpbXB1cmUgcGlwZXMsIHNvIHRoaXMgYnJpbmdzIHRoZSByZW5kZXJlciBiYWNrIGludG8gdGhlIGNoZWNrIHRvby5cbiAgICB0aGlzLl92YWxpZGl0eVN1YnNjcmlwdGlvbiA9IHRoaXMuZXJyb3JzLnN1YnNjcmliZSgoKSA9PlxuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ0FmdGVyVmlld0NoZWNrZWQoKTtcbiAgICBpZiAoIXRoaXMuX3BhZ2VJbml0ICYmIHRoaXMuZm9ybVNsaWRlciAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9wYWdlSW5pdCA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5mb3JtU2xpZGVyLmN1cnJlbnRQYWdlO1xuICAgICAgdGhpcy5fcGFnZVN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybVNsaWRlci5wYWdlU2Nyb2xsRmluaXNoLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmZvcm1TbGlkZXIuY3VycmVudFBhZ2U7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc2xpZGVzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fdmFsdWVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl92YWxpZGl0eVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3BhZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICB9XG5cbiAgZmllbGRTdHlsZShmaWVsZDogQWpmRmllbGRJbnN0YW5jZSk6IGFueSB7XG4gICAgaWYgKGZpZWxkLm5vZGUuZmllbGRUeXBlID09PSBBamZGaWVsZFR5cGUuRm9ybXVsYSAmJiBmaWVsZC5ub2RlLmxhYmVsID09PSAnJykge1xuICAgICAgcmV0dXJuIHtkaXNwbGF5OiAnbm9uZSd9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKiogUGFnZSB0byB0aGUgZmlyc3QgcGFnZSBvZiBhIHNsaWRlLCBmcm9tIHRoZSBoZWFkZXIncyBqdW1wIG1lbnUuICovXG4gIGdvVG9TbGlkZShzbGlkZTogQWpmU2xpZGVJbnN0YW5jZSk6IHZvaWQge1xuICAgIHRoaXMuX3NsaWRlVG8odGhpcy5fcGFnZU9mKHNsaWRlKSk7XG4gIH1cblxuICAvKiogUGFnZSB0byBvbmUgcmVwZXRpdGlvbiBvZiB0aGUgcmVwZWF0aW5nIHNsaWRlIGN1cnJlbnRseSBvbiBzY3JlZW4uICovXG4gIGdvVG9SZXAoc2xpZGU6IEFqZlNsaWRlSW5zdGFuY2UsIHJlcEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9zbGlkZVRvKHRoaXMuX3BhZ2VPZihzbGlkZSkgKyByZXBJbmRleCk7XG4gIH1cblxuICBnb1RvUHJldlNsaWRlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVNsaWRlcj8uc2xpZGUoe2RpcjogJ3VwJ30pO1xuICB9XG5cbiAgZ29Ub05leHRTbGlkZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TbGlkZXI/LnNsaWRlKHtkaXI6ICdkb3duJ30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzbGlkZXIgcGFnZSBhIHNsaWRlIHN0YXJ0cyBvbi4gYEFqZlNsaWRlSW5zdGFuY2UucG9zaXRpb25gIGNhbm5vdCBiZVxuICAgKiB1c2VkIGRpcmVjdGx5IGhlcmU6IGl0IGRvZXMgbm90IGFjY291bnQgZm9yIGEgc3RhcnQgbWVzc2FnZSBwYWdlLCBhbmQgdGhpc1xuICAgKiBoYXMgdG8gYWdyZWUgd2l0aCB0aGUgcGFnZSBhcml0aG1ldGljIHVzZWQgYnkgYGFqZkN1cnJlbnRTbGlkZWAuXG4gICAqL1xuICBwcml2YXRlIF9wYWdlT2Yoc2xpZGU6IEFqZlNsaWRlSW5zdGFuY2UpOiBudW1iZXIge1xuICAgIGxldCBwYWdlID0gdGhpcy5oYXNTdGFydE1lc3NhZ2UgPyAxIDogMDtcbiAgICBmb3IgKGNvbnN0IGN1ciBvZiB0aGlzLl9zbGlkZUxpc3QpIHtcbiAgICAgIGlmIChjdXIudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY3VyID09PSBzbGlkZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHBhZ2UgKz0gaXNSZXBlYXRpbmdTbGlkZUluc3RhbmNlKGN1cilcbiAgICAgICAgPyBNYXRoLm1heCgxLCAoY3VyIGFzIEFqZlJlcGVhdGluZ1NsaWRlSW5zdGFuY2UpLnJlcHMpXG4gICAgICAgIDogMTtcbiAgICB9XG4gICAgcmV0dXJuIHBhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9zbGlkZVRvKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1TbGlkZXIgIT0gbnVsbCkge1xuICAgICAgdGhpcy5mb3JtU2xpZGVyLnNsaWRlKHt0bzogcGFnZX0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9maXhlZE9yaWVudGF0aW9uOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9oYXNFbmRNZXNzYWdlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9oYXNTdGFydE1lc3NhZ2U6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2hpZGVCb3R0b21Ub29sYmFyOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9oaWRlTmF2aWdhdGlvbkJ1dHRvbnM6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2hpZGVUb3BUb29sYmFyOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9yZWFkb25seTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfc2F2ZURpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUdyb3VwIHwgYXN5bmMgYXMgZmdcIj5cbiAgPGZvcm0gW2NsYXNzLmFqZi1mb3JtLXJlYWRvbmx5XT1cInJlYWRvbmx5XCIgbm92YWxpZGF0ZSBbZm9ybUdyb3VwXT1cImZnIVwiPlxuICAgIDxkaXYgY2xhc3M9XCJhamYtZm9ybS1jb250YWluZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzbGlkZXMgfCBhc3luYyBhcyBjdXJTbGlkZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiY3VyU2xpZGVzIHwgYWpmQ3VycmVudFNsaWRlIDogY3VycmVudFBhZ2UgOiBoYXNTdGFydE1lc3NhZ2UgOiBoYXNFbmRNZXNzYWdlIGFzIGN1clwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLWZvcm0tYmFyXCIgKm5nSWY9XCIhaGlkZVRvcFRvb2xiYXJcIj5cbiAgICAgICAgICAgIDxhamYtc2xpZGUtaGVhZGVyXG4gICAgICAgICAgICAgIFtzbGlkZV09XCJjdXIuc2xpZGVcIlxuICAgICAgICAgICAgICBbc2xpZGVzXT1cImN1clNsaWRlc1wiXG4gICAgICAgICAgICAgIFtkaXNwbGF5TnVtYmVyXT1cImN1ci5kaXNwbGF5TnVtYmVyXCJcbiAgICAgICAgICAgICAgW3BhZ2VzXT1cImN1ci5wYWdlc1wiXG4gICAgICAgICAgICAgIChqdW1wVG8pPVwiZ29Ub1NsaWRlKCRldmVudClcIlxuICAgICAgICAgICAgICAocHJldik9XCJnb1RvUHJldlNsaWRlKClcIlxuICAgICAgICAgICAgICAobmV4dCk9XCJnb1RvTmV4dFNsaWRlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8IS0tIHRoaXMgY29udGVudCBwcm9qZWN0aW9uIGFsbG93cyB0byBhZGQgYnV0dG9ucyBvbiB0aGUgc2xpZGUgaGVhZGVyIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWpmRm9ybVRvcFRvb2xiYXJCdXR0b25zXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgPCEtLSBUaGUgcmVuZGVyZXIgaGFzIG5vd2hlcmUgdG8gc2F2ZSB0bzogY2xpY2tpbmcgaGVyZSBvbmx5IGVtaXRzXG4gICAgICAgICAgICAgICAgICAgYGZvcm1BY3Rpb25gLiBTbyBpdCBzaGlwcyBubyBidXR0b24gb2YgaXRzIG93biBhbmQgaG9sZHMgdGhlXG4gICAgICAgICAgICAgICAgICAgc2xvdCBvcGVuIGluc3RlYWQgLS0gYSBob3N0IHRoYXQgaGFuZGxlcyB0aGUgZXZlbnQgcHJvamVjdHMgdGhlXG4gICAgICAgICAgICAgICAgICAgYnV0dG9uIGl0IHdhbnRzLCBhbmQgZ2V0cyB0aGUgY2xpY2sgdGhyb3VnaCB0aGlzIHdyYXBwZXIuIC0tPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFqZi1mb3JtLXNhdmVcIiAqbmdJZj1cIiFzYXZlRGlzYWJsZWRcIiAoY2xpY2spPVwib25TYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWpmRm9ybVNhdmVCdXR0b25dXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2FqZi1zbGlkZS1oZWFkZXI+XG5cbiAgICAgICAgICAgIDxhamYtcmVwLXN0cmlwXG4gICAgICAgICAgICAgICpuZ0lmPVwiY3VyLnNsaWRlICYmIGN1ci5yZXBzID4gMFwiXG4gICAgICAgICAgICAgIFtzbGlkZV09XCJjdXIuc2xpZGUhIHwgYWpmQXNSZXBlYXRpbmdTbGlkZUluc3RhbmNlXCJcbiAgICAgICAgICAgICAgW2N1cnJlbnRdPVwiY3VyLnJlcEluZGV4XCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgKGdvVG8pPVwiZ29Ub1JlcChjdXIuc2xpZGUhLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGFkZCk9XCJhZGRHcm91cChjdXIuc2xpZGUhKVwiXG4gICAgICAgICAgICAgIChyZW1vdmUpPVwicmVtb3ZlR3JvdXAoY3VyLnNsaWRlISwgY3VyLnJlcEluZGV4KVwiXG4gICAgICAgICAgICA+PC9hamYtcmVwLXN0cmlwPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXNsaWRlci1jb250YWluZXJcIj5cbiAgICAgICAgICA8YWpmLXBhZ2Utc2xpZGVyXG4gICAgICAgICAgICAob3JpZW50YXRpb25DaGFuZ2UpPVwib3JpZW50YXRpb25DaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgW2ZpeGVkT3JpZW50YXRpb25dPVwiZml4ZWRPcmllbnRhdGlvblwiXG4gICAgICAgICAgICBbaGlkZU5hdmlnYXRpb25CdXR0b25zXT1cImhpZGVOYXZpZ2F0aW9uQnV0dG9uc1wiXG4gICAgICAgICAgICBbb3JpZW50YXRpb25dPVwib3JpZW50YXRpb25cIlxuICAgICAgICAgICAgI2Zvcm1TbGlkZXJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YWpmLXBhZ2Utc2xpZGVyLWl0ZW0gKm5nSWY9XCJjdXJTbGlkZXMhLmxlbmd0aCA+IDAgJiYgaGFzU3RhcnRNZXNzYWdlXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtZm9ybS1wYWdlIGFqZi1mb3JtLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJhamYtbWVzc2FnZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FqZkZvcm1TdGFydE1lc3NhZ2VUaXRsZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLW1lc3NhZ2UtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FqZkZvcm1TdGFydE1lc3NhZ2VdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYWpmLXBhZ2Utc2xpZGVyLWl0ZW0+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNsaWRlSW5zdGFuY2Ugb2YgY3VyU2xpZGVzOyB0cmFja0J5OiB0cmFja05vZGVCeUlkXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzbGlkZUluc3RhbmNlLnZpc2libGVcIj5cbiAgICAgICAgICAgICAgICA8IS0tIG5vbiByZXBlYXRpbmcgc2xpZGVzIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKHNsaWRlSW5zdGFuY2UgfCBhamZJc1JlcGVhdGluZ1NsaWRlSW5zdGFuY2UpXCI+XG4gICAgICAgICAgICAgICAgICA8YWpmLXBhZ2Utc2xpZGVyLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtZm9ybS1wYWdlXCIgW25nQ2xhc3NdPVwiJ2FqZi1tYXgtY29sdW1ucy0nICsgbWF4Q29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxhamYtZmllbGQtcm93XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGRJbnN0YW5jZSBvZiBzbGlkZUluc3RhbmNlLmZsYXROb2RlczsgdHJhY2tCeTogdHJhY2tOb2RlQnlJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5zdGFuY2VdPVwiZmllbGRJbnN0YW5jZSB8IGFqZkFzRmllbGRJbnN0YW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgIXNsaWRlSW5zdGFuY2UuZWRpdGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2FqZi1maWVsZC1yb3c+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9hamYtcGFnZS1zbGlkZXItaXRlbT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gcmVwZWF0aW5nIHNsaWRlczogb25lIHBhZ2UgcGVyIHJlcGV0aXRpb24gLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNsaWRlSW5zdGFuY2UgfCBhamZJc1JlcGVhdGluZ1NsaWRlSW5zdGFuY2VcIj5cbiAgICAgICAgICAgICAgICAgIDxhamYtcGFnZS1zbGlkZXItaXRlbVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyUmVwIG9mIChzbGlkZUluc3RhbmNlIHwgYWpmQXNSZXBlYXRpbmdTbGlkZUluc3RhbmNlKS5yZXBzIHwgYWpmUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0U2xpZGUgPSBsYXN0XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtpc1JlcGVhdGluZ109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzUmVwZWF0aW5nTGFzdF09XCJsYXN0U2xpZGVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLWZvcm0tcGFnZVwiIFtuZ0NsYXNzXT1cIidhamYtbWF4LWNvbHVtbnMtJyArIG1heENvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YWpmLWZpZWxkLXJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWVsZEluc3RhbmNlIG9mIHNsaWRlSW5zdGFuY2Uuc2xpZGVOb2Rlc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja05vZGVCeUlkXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luc3RhbmNlXT1cImZpZWxkSW5zdGFuY2UgfCBhamZBc0ZpZWxkSW5zdGFuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8ICFzbGlkZUluc3RhbmNlLmVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9hamYtZmllbGQtcm93PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvYWpmLXBhZ2Utc2xpZGVyLWl0ZW0+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxhamYtcGFnZS1zbGlkZXItaXRlbSAqbmdJZj1cImN1clNsaWRlcyAmJiBjdXJTbGlkZXMhLmxlbmd0aCA+IDAgJiYgaGFzRW5kTWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLWZvcm0tcGFnZSBhamYtZm9ybS1tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwiYWpmLW1lc3NhZ2UtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthamZGb3JtRW5kTWVzc2FnZVRpdGxlXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtbWVzc2FnZS1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWpmRm9ybUVuZE1lc3NhZ2VdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYWpmLXBhZ2Utc2xpZGVyLWl0ZW0+XG5cbiAgICAgICAgICAgIDxkaXYgYWpmUGFnZVNsaWRlckJhciAqbmdJZj1cIiFoaWRlQm90dG9tVG9vbGJhclwiIGNsYXNzPVwiYWpmLWZvcm0tZm9vdGVyXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJTbGlkZXMgfCBhamZGb3JtSXNzdWVzIGFzIGlzc3Vlc1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gVGhlIGNvdW50IGlzIHRoZSBjb250cm9sOiByZWFkaW5nIHRoYXQgc29tZXRoaW5nIG5lZWRzXG4gICAgICAgICAgICAgICAgICAgICBhdHRlbnRpb24gYW5kIGFza2luZyB0byBiZSB0YWtlbiB0aGVyZSBpcyBvbmUgaW50ZW50aW9uLCBzb1xuICAgICAgICAgICAgICAgICAgICAgaXQgaXMgb25lIHRhcmdldCByYXRoZXIgdGhhbiBhIGxhYmVsIHdpdGggYXJyb3dzIGJlc2lkZSBpdC4gLS0+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFqZi1mb3JtLWZvb3Rlci1zdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc3N1ZXMuZmllbGRzID4gMFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub05leHRFcnJvcigpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhamYtZm9ybS1mb290ZXItbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgID57eyAne3tmaWVsZHN9fSBmaWVsZHMgaW4ge3tzbGlkZXN9fSBzbGlkZXMgbmVlZCBhdHRlbnRpb24nIHwgdHJhbnNsb2NvIDpcbiAgICAgICAgICAgICAgICAgICAge2ZpZWxkczogaXNzdWVzLmZpZWxkcywgc2xpZGVzOiBpc3N1ZXMuc2xpZGVzfSB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8IS0tIFB1c2hlZCB0byB0aGUgZmFyIGVuZCBvZiB0aGUgYmFyIGJ5IGl0cyBhdXRvIG1hcmdpbiwgc28gaXQgc2l0c1xuICAgICAgICAgICAgICAgICAgIG5leHQgdG8gdGhlIHNsaWRlcidzIG93biBwYWdpbmcgYnV0dG9ucyByYXRoZXIgdGhhbiBuZXh0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgIGVycm9yIHN0YXR1cy4gLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgY3VyU2xpZGVzIHwgYWpmQ3VycmVudFNsaWRlIDogY3VycmVudFBhZ2UgOiBoYXNTdGFydE1lc3NhZ2UgOiBoYXNFbmRNZXNzYWdlIGFzIGN1clxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFqZi1zbGlkZS1jb3VudFwiICpuZ0lmPVwiY3VyLnBhZ2VzID4gMSAmJiBjdXIudG90YWwgPiAwXCJcbiAgICAgICAgICAgICAgICAgID57eyAnc2xpZGUnIHwgdHJhbnNsb2NvIH19IHt7IGN1ci5kaXNwbGF5TnVtYmVyIH19IHt7ICdvZicgfCB0cmFuc2xvY28gfX0ge3tcbiAgICAgICAgICAgICAgICAgIGN1ci50b3RhbCB9fTwvc3BhblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2FqZi1wYWdlLXNsaWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9uZy1jb250YWluZXI+XG4iXX0=