@vendasta/store
Version:
Components and data for Store
249 lines • 32.6 kB
JavaScript
import { Component, Input } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { combineLatest } from 'rxjs';
import { TranslateService } from '@ngx-translate/core';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
import * as i2 from "@angular/material/expansion";
import * as i3 from "@angular/material/icon";
import * as i4 from "../fields/field.component";
import * as i5 from "@angular/common";
export class DropDownFormSectionComponent {
constructor(translateService) {
this.translateService = translateService;
this.startOpen = false;
this.displayAutoTitle = false;
this.titleText = '';
this.displayAutoDescription = true;
this.descriptionText = '';
this.editingHint = '';
this.expandable = true;
this.autoDescriptionText = '';
this.iconName = 'help_outline';
this.subscriptions = [];
this.uniqueIndex = 1;
this.autoTitleText = '';
}
ngOnInit() {
const allFieldsHidden = this.fields.reduce((p, c, i, a) => p && c.hidden, true);
if (allFieldsHidden) {
this.expandable = false;
}
while (this.parentForm.controls.hasOwnProperty(this.titleText + this.uniqueIndex)) {
this.uniqueIndex += 1;
}
this.parentForm.addControl(this.titleText + this.uniqueIndex, this.toFormGroup(this.fields));
const form = this.parentForm.controls[this.titleText + this.uniqueIndex];
for (const key in form.controls) {
if (form.controls.hasOwnProperty(key)) {
if (this.prepopulatedData != null && this.prepopulatedData.hasOwnProperty(key)) {
form.controls[key].setValue(this.prepopulatedData[key]);
}
}
}
this.subscriptions.push(combineLatest([form.statusChanges, this.translateService.stream('FRONTEND.STORE.AUTO_TITLE_TEXT')]).subscribe(([change, autoTitleText]) => {
let missingFields = false;
for (const control in form.controls) {
if (!form.controls[control].value ||
(form.controls[control].value.constructor === Array && !form.controls[control].value[0])) {
this.iconName = 'help_outline';
missingFields = true;
if (change === 'INVALID') {
this.autoTitleText = autoTitleText.SOME_FIELDS_INVALID;
if (form.controls[control].dirty || form.controls[control].touched) {
this.iconName = 'warning';
break;
}
}
else {
this.autoTitleText = autoTitleText.OPTIONAL_FIELDS_UNANSWERED;
}
}
}
if (!missingFields) {
this.iconName = 'check_circle';
this.autoTitleText = autoTitleText.COMPLETE;
}
}));
if (this.displayAutoDescription) {
this.subscriptions.push(form.valueChanges.subscribe((changes) => {
let description = '';
for (const key in changes) {
if (changes.hasOwnProperty(key) && changes[key] != null && changes[key].length > 0) {
if (changes[key][0].name) {
for (const fileKey in changes[key]) {
if (changes[key][fileKey] != null) {
description += changes[key][fileKey].name;
description += ', ';
}
}
}
else {
description += changes[key];
description += ', ';
}
}
}
this.autoDescriptionText = description.substring(0, description.length - 2);
}));
}
form.updateValueAndValidity({ onlySelf: false, emitEvent: true });
}
toFormGroup(formFields) {
const group = {};
formFields.forEach((field) => {
let validations;
if (!field.required || field.hidden) {
validations = field.validator;
}
else if (field.controlType === 'checkbox') {
validations = [Validators.requiredTrue, field.validator];
}
else {
validations = [Validators.required, field.validator];
}
const formControl = new FormControl({ value: field.value, disabled: field.disabled }, validations);
group[field.id] = formControl;
this.subscriptions.push(formControl.valueChanges.subscribe((value) => (field.value = value)));
});
return new FormGroup(group);
}
ngOnDestroy() {
this.subscriptions.forEach((subscription) => subscription.unsubscribe());
}
}
DropDownFormSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: DropDownFormSectionComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
DropDownFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: DropDownFormSectionComponent, selector: "app-dropdown-form-section", inputs: { prepopulatedData: "prepopulatedData", startOpen: "startOpen", parentForm: "parentForm", displayAutoTitle: "displayAutoTitle", titleText: "titleText", displayAutoDescription: "displayAutoDescription", descriptionText: "descriptionText", fields: "fields", editingHint: "editingHint", expandable: "expandable" }, ngImport: i0, template: `
<mat-expansion-panel [ngClass]="{ 'form-hidden': !expandable }" [expanded]="startOpen" class="display">
<mat-expansion-panel-header [collapsedHeight]="'*'" [expandedHeight]="'*'">
<mat-panel-title>
<div class="dropdown-form-header">
<mat-icon
[ngClass]="{
invalid: iconName == 'warning',
valid: iconName == 'check_circle',
question: iconName == 'help_outline'
}"
>
{{ iconName }}
</mat-icon>
<div *ngIf="!displayAutoTitle" class="title">{{ titleText }}</div>
<div
*ngIf="displayAutoTitle"
[ngClass]="{ valid: iconName == 'check_circle', invalid: iconName == 'warning' }"
>
<div class="title">{{ titleText }}</div>
<div class="auto-title">
<ng-container>{{ autoTitleText }}</ng-container>
</div>
</div>
</div>
</mat-panel-title>
<mat-panel-description class="description">
<div class="description-text" *ngIf="displayAutoDescription" [ngClass]="{ invalid: iconName == 'warning' }">
{{ autoDescriptionText }}
</div>
<div class="description-text" *ngIf="!displayAutoDescription" [ngClass]="{ invalid: iconName == 'warning' }">
{{ descriptionText }}
</div>
</mat-panel-description>
</mat-expansion-panel-header>
<div class="expansion-panel-body">
<app-order-field
*ngFor="let field of fields"
[field]="field"
[form]="parentForm.controls[titleText + uniqueIndex]"
></app-order-field>
<p *ngIf="editingHint != ''" class="editing-hint">
<i>{{ editingHint }}</i>
</p>
</div>
</mat-expansion-panel>
<div class="print">
<div class="title">{{ titleText }}</div>
<app-order-field
*ngFor="let field of fields"
[field]="field"
[form]="parentForm.controls[titleText + uniqueIndex]"
></app-order-field>
</div>
`, isInline: true, styles: [":host-context(va-dropdown-form-section){font-size:14px}:host-context(va-dropdown-form-section) .expansion-panel-body{margin-top:-10px;display:block}.mat-expanded,.mat-expansion-panel{transition:margin .4s}mat-expansion-panel-header{min-height:48px;padding:12px 24px}.dropdown-form-header{display:flex}.description{align-self:center;color:rgba(0,0,0,.54)}.description .invalid{color:#c62828;color:var(--error-text-color, #c62828)}mat-icon{margin-right:7px;align-self:center}mat-icon.valid{color:#2e7d32;color:var(--success-icon-color, #2e7d32)}mat-icon.invalid{color:#c62828;color:var(--error-text-color, #c62828)}mat-icon.question{color:#9e9e9e;color:var(--tertiary-text-color, #9e9e9e)}mat-panel-title{flex:none;margin-right:16px;display:flex;max-width:100%}mat-panel-title div{display:flex}mat-panel-title.valid{color:#2e7d32;color:var(--success-text-color, #2e7d32)}mat-panel-title.invalid{color:#c62828;color:var(--error-text-color, #c62828)}.editing-hint{color:#9e9e9e;color:var(--tertiary-text-color, #9e9e9e)}.title{color:#212121;color:var(--primary-text-color, #212121);align-self:center}.auto-title{font-style:italic;margin-left:8px;align-self:center;white-space:nowrap}.not-expandable-card{background:white;cursor:default;font-size:15px;display:flex;height:48px;align-items:center;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 1px 5px rgba(0,0,0,.12)}.not-expandable-card .not-expandable-icon{margin-left:24px}.not-expandable-card .not-expandable-header{display:flex}.not-expandable-card .not-expandable-description{margin-left:22px}.not-expandable-card .valid{color:#2e7d32;color:var(--success-text-color, #2e7d32)}@media print{.display{display:none}}.print{display:none}@media print{.print{display:block}.print .title{font-size:24px;font-weight:500;padding:8px 0;margin:4px 0}}.form-hidden{display:none!important}@media only screen and (max-width: 600px){:host::ng-deep mat-expansion-panel-header{height:auto;padding:8px 16px}:host::ng-deep mat-expansion-panel-header.mat-expanded{height:auto}:host::ng-deep mat-expansion-panel-header .mat-content{flex-direction:column}:host::ng-deep mat-panel-description{display:block;font-size:12px}}\n"], components: [{ type: i2.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i2.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4.FieldComponent, selector: "app-order-field", inputs: ["field", "form"] }], directives: [{ type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.MatExpansionPanelTitle, selector: "mat-panel-title" }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatExpansionPanelDescription, selector: "mat-panel-description" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: DropDownFormSectionComponent, decorators: [{
type: Component,
args: [{ selector: 'app-dropdown-form-section', template: `
<mat-expansion-panel [ngClass]="{ 'form-hidden': !expandable }" [expanded]="startOpen" class="display">
<mat-expansion-panel-header [collapsedHeight]="'*'" [expandedHeight]="'*'">
<mat-panel-title>
<div class="dropdown-form-header">
<mat-icon
[ngClass]="{
invalid: iconName == 'warning',
valid: iconName == 'check_circle',
question: iconName == 'help_outline'
}"
>
{{ iconName }}
</mat-icon>
<div *ngIf="!displayAutoTitle" class="title">{{ titleText }}</div>
<div
*ngIf="displayAutoTitle"
[ngClass]="{ valid: iconName == 'check_circle', invalid: iconName == 'warning' }"
>
<div class="title">{{ titleText }}</div>
<div class="auto-title">
<ng-container>{{ autoTitleText }}</ng-container>
</div>
</div>
</div>
</mat-panel-title>
<mat-panel-description class="description">
<div class="description-text" *ngIf="displayAutoDescription" [ngClass]="{ invalid: iconName == 'warning' }">
{{ autoDescriptionText }}
</div>
<div class="description-text" *ngIf="!displayAutoDescription" [ngClass]="{ invalid: iconName == 'warning' }">
{{ descriptionText }}
</div>
</mat-panel-description>
</mat-expansion-panel-header>
<div class="expansion-panel-body">
<app-order-field
*ngFor="let field of fields"
[field]="field"
[form]="parentForm.controls[titleText + uniqueIndex]"
></app-order-field>
<p *ngIf="editingHint != ''" class="editing-hint">
<i>{{ editingHint }}</i>
</p>
</div>
</mat-expansion-panel>
<div class="print">
<div class="title">{{ titleText }}</div>
<app-order-field
*ngFor="let field of fields"
[field]="field"
[form]="parentForm.controls[titleText + uniqueIndex]"
></app-order-field>
</div>
`, styles: [":host-context(va-dropdown-form-section){font-size:14px}:host-context(va-dropdown-form-section) .expansion-panel-body{margin-top:-10px;display:block}.mat-expanded,.mat-expansion-panel{transition:margin .4s}mat-expansion-panel-header{min-height:48px;padding:12px 24px}.dropdown-form-header{display:flex}.description{align-self:center;color:rgba(0,0,0,.54)}.description .invalid{color:#c62828;color:var(--error-text-color, #c62828)}mat-icon{margin-right:7px;align-self:center}mat-icon.valid{color:#2e7d32;color:var(--success-icon-color, #2e7d32)}mat-icon.invalid{color:#c62828;color:var(--error-text-color, #c62828)}mat-icon.question{color:#9e9e9e;color:var(--tertiary-text-color, #9e9e9e)}mat-panel-title{flex:none;margin-right:16px;display:flex;max-width:100%}mat-panel-title div{display:flex}mat-panel-title.valid{color:#2e7d32;color:var(--success-text-color, #2e7d32)}mat-panel-title.invalid{color:#c62828;color:var(--error-text-color, #c62828)}.editing-hint{color:#9e9e9e;color:var(--tertiary-text-color, #9e9e9e)}.title{color:#212121;color:var(--primary-text-color, #212121);align-self:center}.auto-title{font-style:italic;margin-left:8px;align-self:center;white-space:nowrap}.not-expandable-card{background:white;cursor:default;font-size:15px;display:flex;height:48px;align-items:center;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 1px 5px rgba(0,0,0,.12)}.not-expandable-card .not-expandable-icon{margin-left:24px}.not-expandable-card .not-expandable-header{display:flex}.not-expandable-card .not-expandable-description{margin-left:22px}.not-expandable-card .valid{color:#2e7d32;color:var(--success-text-color, #2e7d32)}@media print{.display{display:none}}.print{display:none}@media print{.print{display:block}.print .title{font-size:24px;font-weight:500;padding:8px 0;margin:4px 0}}.form-hidden{display:none!important}@media only screen and (max-width: 600px){:host::ng-deep mat-expansion-panel-header{height:auto;padding:8px 16px}:host::ng-deep mat-expansion-panel-header.mat-expanded{height:auto}:host::ng-deep mat-expansion-panel-header .mat-content{flex-direction:column}:host::ng-deep mat-panel-description{display:block;font-size:12px}}\n"] }]
}], ctorParameters: function () { return [{ type: i1.TranslateService }]; }, propDecorators: { prepopulatedData: [{
type: Input
}], startOpen: [{
type: Input
}], parentForm: [{
type: Input
}], displayAutoTitle: [{
type: Input
}], titleText: [{
type: Input
}], displayAutoDescription: [{
type: Input
}], descriptionText: [{
type: Input
}], fields: [{
type: Input
}], editingHint: [{
type: Input
}], expandable: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tZm9ybS1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9vcmRlci1mb3JtL2Ryb3Bkb3duLWZvcm0tc2VjdGlvbi9kcm9wZG93bi1mb3JtLXNlY3Rpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQTZEdkQsTUFBTSxPQUFPLDRCQUE0QjtJQWlCdkMsWUFBb0IsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFmN0MsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLDJCQUFzQixHQUFHLElBQUksQ0FBQztRQUM5QixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUVyQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzNCLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6QixhQUFRLEdBQUcsY0FBYyxDQUFDO1FBQzFCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztJQUVzQyxDQUFDO0lBRTFELFFBQVE7UUFDTixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFD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LENBQUMsQ0FBQztJQUMzRSxDQUFDOzt5SEFuSFUsNEJBQTRCOzZHQUE1Qiw0QkFBNEIsaVlBekQ3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RUOzJGQUdVLDRCQUE0QjtrQkEzRHhDLFNBQVM7K0JBQ0UsMkJBQTJCLFlBQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzRFQ7dUdBSVEsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZEJhc2UgfSBmcm9tICcuLi9maWVsZHMvZmllbGQtYmFzZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWRyb3Bkb3duLWZvcm0tc2VjdGlvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW25nQ2xhc3NdPVwieyAnZm9ybS1oaWRkZW4nOiAhZXhwYW5kYWJsZSB9XCIgW2V4cGFuZGVkXT1cInN0YXJ0T3BlblwiIGNsYXNzPVwiZGlzcGxheVwiPlxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIFtjb2xsYXBzZWRIZWlnaHRdPVwiJyonXCIgW2V4cGFuZGVkSGVpZ2h0XT1cIicqJ1wiPlxuICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1mb3JtLWhlYWRlclwiPlxuICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICBpbnZhbGlkOiBpY29uTmFtZSA9PSAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgdmFsaWQ6IGljb25OYW1lID09ICdjaGVja19jaXJjbGUnLFxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uOiBpY29uTmFtZSA9PSAnaGVscF9vdXRsaW5lJ1xuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgaWNvbk5hbWUgfX1cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWRpc3BsYXlBdXRvVGl0bGVcIiBjbGFzcz1cInRpdGxlXCI+e3sgdGl0bGVUZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiZGlzcGxheUF1dG9UaXRsZVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgdmFsaWQ6IGljb25OYW1lID09ICdjaGVja19jaXJjbGUnLCBpbnZhbGlkOiBpY29uTmFtZSA9PSAnd2FybmluZycgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7IHRpdGxlVGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0by10aXRsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+e3sgYXV0b1RpdGxlVGV4dCB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgPG1hdC1wYW5lbC1kZXNjcmlwdGlvbiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uLXRleHRcIiAqbmdJZj1cImRpc3BsYXlBdXRvRGVzY3JpcHRpb25cIiBbbmdDbGFzc109XCJ7IGludmFsaWQ6IGljb25OYW1lID09ICd3YXJuaW5nJyB9XCI+XG4gICAgICAgICAgICB7eyBhdXRvRGVzY3JpcHRpb25UZXh0IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uLXRleHRcIiAqbmdJZj1cIiFkaXNwbGF5QXV0b0Rlc2NyaXB0aW9uXCIgW25nQ2xhc3NdPVwieyBpbnZhbGlkOiBpY29uTmFtZSA9PSAnd2FybmluZycgfVwiPlxuICAgICAgICAgICAge3sgZGVzY3JpcHRpb25UZXh0IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXBhbmVsLWRlc2NyaXB0aW9uPlxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJleHBhbnNpb24tcGFuZWwtYm9keVwiPlxuICAgICAgICA8YXBwLW9yZGVyLWZpZWxkXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpZWxkc1wiXG4gICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgICBbZm9ybV09XCJwYXJlbnRGb3JtLmNvbnRyb2xzW3RpdGxlVGV4dCArIHVuaXF1ZUluZGV4XVwiXG4gICAgICAgID48L2FwcC1vcmRlci1maWVsZD5cbiAgICAgICAgPHAgKm5nSWY9XCJlZGl0aW5nSGludCAhPSAnJ1wiIGNsYXNzPVwiZWRpdGluZy1oaW50XCI+XG4gICAgICAgICAgPGk+e3sgZWRpdGluZ0hpbnQgfX08L2k+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICA8ZGl2IGNsYXNzPVwicHJpbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7IHRpdGxlVGV4dCB9fTwvZGl2PlxuICAgICAgPGFwcC1vcmRlci1maWVsZFxuICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCJcbiAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgW2Zvcm1dPVwicGFyZW50Rm9ybS5jb250cm9sc1t0aXRsZVRleHQgKyB1bmlxdWVJbmRleF1cIlxuICAgICAgPjwvYXBwLW9yZGVyLWZpZWxkPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi1mb3JtLXNlY3Rpb24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRHJvcERvd25Gb3JtU2VjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcHJlcG9wdWxhdGVkRGF0YToge307XG4gIEBJbnB1dCgpIHN0YXJ0T3BlbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwYXJlbnRGb3JtOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGRpc3BsYXlBdXRvVGl0bGUgPSBmYWxzZTtcbiAgQElucHV0KCkgdGl0bGVUZXh0ID0gJyc7XG4gIEBJbnB1dCgpIGRpc3BsYXlBdXRvRGVzY3JpcHRpb24gPSB0cnVlO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvblRleHQgPSAnJztcbiAgQElucHV0KCkgZmllbGRzOiBGaWVsZEJhc2U8YW55PltdO1xuICBASW5wdXQoKSBlZGl0aW5nSGludCA9ICcnO1xuICBASW5wdXQoKSBleHBhbmRhYmxlID0gdHJ1ZTtcbiAgYXV0b0Rlc2NyaXB0aW9uVGV4dCA9ICcnO1xuICBpY29uTmFtZSA9ICdoZWxwX291dGxpbmUnO1xuICBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICB1bmlxdWVJbmRleCA9IDE7XG4gIGF1dG9UaXRsZVRleHQgPSAnJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsRmllbGRzSGlkZGVuID0gdGhpcy5maWVsZHMucmVkdWNlKChwLCBjLCBpLCBhKSA9PiBwICYmIGMuaGlkZGVuLCB0cnVlKTtcbiAgICBpZiAoYWxsRmllbGRzSGlkZGVuKSB7XG4gICAgICB0aGlzLmV4cGFuZGFibGUgPSBmYWxzZTtcbiAgICB9XG4gICAgd2hpbGUgKHRoaXMucGFyZW50Rm9ybS5jb250cm9scy5oYXNPd25Qcm9wZXJ0eSh0aGlzLnRpdGxlVGV4dCArIHRoaXMudW5pcXVlSW5kZXgpKSB7XG4gICAgICB0aGlzLnVuaXF1ZUluZGV4ICs9IDE7XG4gICAgfVxuICAgIHRoaXMucGFyZW50Rm9ybS5hZGRDb250cm9sKHRoaXMudGl0bGVUZXh0ICsgdGhpcy51bmlxdWVJbmRleCwgdGhpcy50b0Zvcm1Hcm91cCh0aGlzLmZpZWxkcykpO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLnBhcmVudEZvcm0uY29udHJvbHNbdGhpcy50aXRsZVRleHQgKyB0aGlzLnVuaXF1ZUluZGV4XSBhcyBGb3JtR3JvdXA7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICBpZiAoZm9ybS5jb250cm9scy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXBvcHVsYXRlZERhdGEgIT0gbnVsbCAmJiB0aGlzLnByZXBvcHVsYXRlZERhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGZvcm0uY29udHJvbHNba2V5XS5zZXRWYWx1ZSh0aGlzLnByZXBvcHVsYXRlZERhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjb21iaW5lTGF0ZXN0KFtmb3JtLnN0YXR1c0NoYW5nZXMsIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ0ZST05URU5ELlNUT1JFLkFVVE9fVElUTEVfVEVYVCcpXSkuc3Vic2NyaWJlKFxuICAgICAgICAoW2NoYW5nZSwgYXV0b1RpdGxlVGV4dF0pID0+IHtcbiAgICAgICAgICBsZXQgbWlzc2luZ0ZpZWxkcyA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbCBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFmb3JtLmNvbnRyb2xzW2NvbnRyb2xdLnZhbHVlIHx8XG4gICAgICAgICAgICAgIChmb3JtLmNvbnRyb2xzW2NvbnRyb2xdLnZhbHVlLmNvbnN0cnVjdG9yID09PSBBcnJheSAmJiAhZm9ybS5jb250cm9sc1tjb250cm9sXS52YWx1ZVswXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ2hlbHBfb3V0bGluZSc7XG4gICAgICAgICAgICAgIG1pc3NpbmdGaWVsZHMgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAoY2hhbmdlID09PSAnSU5WQUxJRCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9UaXRsZVRleHQgPSBhdXRvVGl0bGVUZXh0LlNPTUVfRklFTERTX0lOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm0uY29udHJvbHNbY29udHJvbF0uZGlydHkgfHwgZm9ybS5jb250cm9sc1tjb250cm9sXS50b3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ3dhcm5pbmcnO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b1RpdGxlVGV4dCA9IGF1dG9UaXRsZVRleHQuT1BUSU9OQUxfRklFTERTX1VOQU5TV0VSRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFtaXNzaW5nRmllbGRzKSB7XG4gICAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ2NoZWNrX2NpcmNsZSc7XG4gICAgICAgICAgICB0aGlzLmF1dG9UaXRsZVRleHQgPSBhdXRvVGl0bGVUZXh0LkNPTVBMRVRFO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BsYXlBdXRvRGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICBmb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGNoYW5nZXMpID0+IHtcbiAgICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGNoYW5nZXNba2V5XSAhPSBudWxsICYmIGNoYW5nZXNba2V5XS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGlmIChjaGFuZ2VzW2tleV1bMF0ubmFtZSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZUtleSBpbiBjaGFuZ2VzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzW2tleV1bZmlsZUtleV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBjaGFuZ2VzW2tleV1bZmlsZUtleV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gJywgJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gY2hhbmdlc1trZXldO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICcsICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hdXRvRGVzY3JpcHRpb25UZXh0ID0gZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGRlc2NyaXB0aW9uLmxlbmd0aCAtIDIpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIGZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiBmYWxzZSwgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICB9XG5cbiAgdG9Gb3JtR3JvdXAoZm9ybUZpZWxkczogRmllbGRCYXNlPGFueT5bXSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgIGZvcm1GaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWxpZGF0aW9ucztcbiAgICAgIGlmICghZmllbGQucmVxdWlyZWQgfHwgZmllbGQuaGlkZGVuKSB7XG4gICAgICAgIHZhbGlkYXRpb25zID0gZmllbGQudmFsaWRhdG9yO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC5jb250cm9sVHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICB2YWxpZGF0aW9ucyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkVHJ1ZSwgZmllbGQudmFsaWRhdG9yXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRpb25zID0gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGZpZWxkLnZhbGlkYXRvcl07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGZpZWxkLnZhbHVlLCBkaXNhYmxlZDogZmllbGQuZGlzYWJsZWQgfSwgdmFsaWRhdGlvbnMpO1xuICAgICAgZ3JvdXBbZmllbGQuaWRdID0gZm9ybUNvbnRyb2w7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChmb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gKGZpZWxkLnZhbHVlID0gdmFsdWUpKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChncm91cCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiJdfQ==