@vendasta/store
Version:
Components and data for Store
214 lines • 24.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
export class DropDownFormSectionComponent {
constructor() {
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 = '';
}
/**
* @return {?}
*/
ngOnInit() {
while (this.parentForm.controls.hasOwnProperty(this.titleText + this.uniqueIndex)) {
this.uniqueIndex += 1;
}
this.parentForm.addControl(this.titleText + this.uniqueIndex, this.toFormGroup(this.fields));
/** @type {?} */
const form = (/** @type {?} */ (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(form.statusChanges.subscribe(change => {
/** @type {?} */
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 = '* Please fill out all required fields';
if (form.controls[control].dirty || form.controls[control].touched) {
this.iconName = 'warning';
break;
}
}
else {
this.autoTitleText = 'Optional fields unanswered';
}
}
}
if (!missingFields) {
this.iconName = 'check_circle';
this.autoTitleText = 'Complete';
}
}));
if (this.displayAutoDescription) {
this.subscriptions.push(form.valueChanges.subscribe(changes => {
/** @type {?} */
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 });
}
/**
* @param {?} formFields
* @return {?}
*/
toFormGroup(formFields) {
/** @type {?} */
const group = {};
formFields.forEach(field => {
/** @type {?} */
let formControl;
if (field.controlType === 'checkbox') {
formControl = new FormControl(field.value);
}
else {
formControl = field.required ? new FormControl(field.value, Validators.required) : new FormControl(field.value);
}
group[field.id] = formControl;
this.subscriptions.push(formControl.valueChanges.subscribe(value => (field.value = value)));
});
return new FormGroup(group);
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subscriptions.forEach(subscription => subscription.unsubscribe());
}
}
DropDownFormSectionComponent.decorators = [
{ type: Component, args: [{
selector: 'va-dropdown-form-section',
template: `
<mat-card *ngIf="!expandable && !(expandable == undefined)" class="not-expandable-card">
<mat-icon class="not-expandable-icon valid"> check_circle</mat-icon>
<mat-card-header *ngIf="!displayAutoTitle" class="not-expandable-header">
{{ titleText }}
</mat-card-header>
<mat-card-header *ngIf="displayAutoTitle" class="not-expandable-header valid">
<div class="title"> {{ titleText }}</div>
<div *ngIf="titleText && autoTitleText"> </div>
<ng-container><i> Complete </i></ng-container>
</mat-card-header>
<mat-panel-description class="not-expandable-description">
{{ descriptionText }}
</mat-panel-description>
</mat-card>
<mat-expansion-panel *ngIf="expandable || expandable == undefined" [expanded]="startOpen">
<mat-expansion-panel-header>
<div class="dropdown-form-header">
<mat-icon
[ngClass]="{invalid: iconName=='warning', valid: iconName=='check_circle', question: iconName=='help_outline'}">
{{ iconName }}
</mat-icon>
<mat-panel-title *ngIf="!displayAutoTitle">
{{ titleText }}
</mat-panel-title>
<mat-panel-title *ngIf="displayAutoTitle"
[ngClass]="{valid: iconName=='check_circle', invalid: iconName=='warning'}">
<div class="title"> {{ titleText }}</div>
<div *ngIf="titleText && autoTitleText"> </div>
<ng-container><i> {{autoTitleText}} </i></ng-container>
</mat-panel-title>
<mat-panel-description *ngIf="displayAutoDescription" [ngClass]="{invalid: iconName=='warning'}">
{{ autoDescriptionText }}
</mat-panel-description>
<mat-panel-description *ngIf="!displayAutoDescription" [ngClass]="{invalid: iconName=='warning'}">
<i> {{descriptionText}} </i>
</mat-panel-description>
</div>
</mat-expansion-panel-header>
<div class="expansion-panel-body">
<va-field *ngFor="let field of fields" [field]="field"
[form]="parentForm.controls[titleText + uniqueIndex]"></va-field>
<p *ngIf="editingHint != ''" class="editing-hint"><i>{{ editingHint }}</i></p>
</div>
</mat-expansion-panel>
`,
styles: [":host-context(va-dropdown-form-section){font-size:14px}:host-context(va-dropdown-form-section) .expansion-panel-body{margin-top:-10px;display:block;width:60%}.mat-expanded,.mat-expansion-panel{transition:margin .4s}.dropdown-form-header{width:100%;display:flex}mat-panel-description{align-self:center;flex:inherit;display:initial;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}mat-panel-description.invalid{color:#c62828}mat-icon{margin-right:7px;-ms-grid-row-align:center;align-self:center}mat-icon.valid{color:#4caf50}mat-icon.invalid{color:#c62828}mat-icon.question{color:#9e9e9e}mat-panel-title{-ms-grid-row-align:center;align-self:center;flex:none;margin-right:20px}mat-panel-title.valid{color:#4caf50}mat-panel-title.invalid{color:#c62828}.editing-hint{color:#9e9e9e}.title{color:#212121}.not-expandable-card{background:#fff;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 0 rgba(0,0,0,.14),0 1px 5px 0 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:#4caf50}"]
}] }
];
/** @nocollapse */
DropDownFormSectionComponent.ctorParameters = () => [];
DropDownFormSectionComponent.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 }]
};
if (false) {
/** @type {?} */
DropDownFormSectionComponent.prototype.prepopulatedData;
/** @type {?} */
DropDownFormSectionComponent.prototype.startOpen;
/** @type {?} */
DropDownFormSectionComponent.prototype.parentForm;
/** @type {?} */
DropDownFormSectionComponent.prototype.displayAutoTitle;
/** @type {?} */
DropDownFormSectionComponent.prototype.titleText;
/** @type {?} */
DropDownFormSectionComponent.prototype.displayAutoDescription;
/** @type {?} */
DropDownFormSectionComponent.prototype.descriptionText;
/** @type {?} */
DropDownFormSectionComponent.prototype.fields;
/** @type {?} */
DropDownFormSectionComponent.prototype.editingHint;
/** @type {?} */
DropDownFormSectionComponent.prototype.expandable;
/** @type {?} */
DropDownFormSectionComponent.prototype.autoDescriptionText;
/** @type {?} */
DropDownFormSectionComponent.prototype.iconName;
/** @type {?} */
DropDownFormSectionComponent.prototype.subscriptions;
/** @type {?} */
DropDownFormSectionComponent.prototype.uniqueIndex;
/** @type {?} */
DropDownFormSectionComponent.prototype.autoTitleText;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tZm9ybS1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B2ZW5kYXN0YS9zdG9yZS8iLCJzb3VyY2VzIjpbImxpYi9vcmRlci1mb3JtL2Ryb3Bkb3duLWZvcm0tc2VjdGlvbi9kcm9wZG93bi1mb3JtLXNlY3Rpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFzRHBFLE1BQU0sT0FBTyw0QkFBNEI7SUFpQnZDO1FBZlMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLDJCQUFzQixHQUFHLElBQUksQ0FBQztRQUM5QixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUVyQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzNCLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6QixhQUFRLEdBQUcsY0FBYyxDQUFDO1FBQzFCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztJQUVKLENBQUM7Ozs7SUFFaEIsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2pGLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1NBQ3ZCO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMs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QUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQzs7O1lBdkpGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsMEJBQTBCO2dCQUNwQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDVDs7YUFFRjs7Ozs7K0JBRUUsS0FBSzt3QkFDTCxLQUFLO3lCQUNMLEtBQUs7K0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3FDQUNMLEtBQUs7OEJBQ0wsS0FBSztxQkFDTCxLQUFLOzBCQUNMLEtBQUs7eUJBQ0wsS0FBSzs7OztJQVROLHdEQUE4Qjs7SUFDOUIsaURBQTJCOztJQUMzQixrREFBK0I7O0lBQy9CLHdEQUFrQzs7SUFDbEMsaURBQXdCOztJQUN4Qiw4REFBdUM7O0lBQ3ZDLHVEQUE4Qjs7SUFDOUIsOENBQWtDOztJQUNsQyxtREFBMEI7O0lBQzFCLGtEQUEyQjs7SUFDM0IsMkRBQXlCOztJQUN6QixnREFBMEI7O0lBQzFCLHFEQUFtQzs7SUFDbkMsbURBQWdCOztJQUNoQixxREFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZpZWxkQmFzZSB9IGZyb20gJy4uL2ZpZWxkcy9maWVsZC1iYXNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YS1kcm9wZG93bi1mb3JtLXNlY3Rpb24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxtYXQtY2FyZCAqbmdJZj1cIiFleHBhbmRhYmxlICYmICEoZXhwYW5kYWJsZSA9PSB1bmRlZmluZWQpXCIgY2xhc3M9XCJub3QtZXhwYW5kYWJsZS1jYXJkXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJub3QtZXhwYW5kYWJsZS1pY29uIHZhbGlkXCI+IGNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICA8bWF0LWNhcmQtaGVhZGVyICpuZ0lmPVwiIWRpc3BsYXlBdXRvVGl0bGVcIiBjbGFzcz1cIm5vdC1leHBhbmRhYmxlLWhlYWRlclwiPlxuICAgICAgICB7eyB0aXRsZVRleHQgfX1cbiAgICAgIDwvbWF0LWNhcmQtaGVhZGVyPlxuICAgICAgPG1hdC1jYXJkLWhlYWRlciAqbmdJZj1cImRpc3BsYXlBdXRvVGl0bGVcIiBjbGFzcz1cIm5vdC1leHBhbmRhYmxlLWhlYWRlciB2YWxpZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ge3sgdGl0bGVUZXh0IH19PC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0aXRsZVRleHQgJiYgYXV0b1RpdGxlVGV4dFwiPiZuYnNwOzwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyPjxpPiBDb21wbGV0ZSA8L2k+PC9uZy1jb250YWluZXI+XG4gICAgICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgICAgIDxtYXQtcGFuZWwtZGVzY3JpcHRpb24gY2xhc3M9XCJub3QtZXhwYW5kYWJsZS1kZXNjcmlwdGlvblwiPlxuICAgICAgICB7eyBkZXNjcmlwdGlvblRleHQgfX1cbiAgICAgIDwvbWF0LXBhbmVsLWRlc2NyaXB0aW9uPlxuICAgIDwvbWF0LWNhcmQ+XG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nSWY9XCJleHBhbmRhYmxlIHx8IGV4cGFuZGFibGUgPT0gdW5kZWZpbmVkXCIgW2V4cGFuZGVkXT1cInN0YXJ0T3BlblwiPlxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZm9ybS1oZWFkZXJcIj5cbiAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntpbnZhbGlkOiBpY29uTmFtZT09J3dhcm5pbmcnLCB2YWxpZDogaWNvbk5hbWU9PSdjaGVja19jaXJjbGUnLCBxdWVzdGlvbjogaWNvbk5hbWU9PSdoZWxwX291dGxpbmUnfVwiPlxuICAgICAgICAgICAge3sgaWNvbk5hbWUgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGUgKm5nSWY9XCIhZGlzcGxheUF1dG9UaXRsZVwiPlxuICAgICAgICAgICAge3sgdGl0bGVUZXh0IH19XG4gICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgPG1hdC1wYW5lbC10aXRsZSAqbmdJZj1cImRpc3BsYXlBdXRvVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie3ZhbGlkOiBpY29uTmFtZT09J2NoZWNrX2NpcmNsZScsIGludmFsaWQ6IGljb25OYW1lPT0nd2FybmluZyd9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ge3sgdGl0bGVUZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGl0bGVUZXh0ICYmIGF1dG9UaXRsZVRleHRcIj4gJm5ic3A7PC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyPjxpPiB7e2F1dG9UaXRsZVRleHR9fSA8L2k+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgPG1hdC1wYW5lbC1kZXNjcmlwdGlvbiAqbmdJZj1cImRpc3BsYXlBdXRvRGVzY3JpcHRpb25cIiBbbmdDbGFzc109XCJ7aW52YWxpZDogaWNvbk5hbWU9PSd3YXJuaW5nJ31cIj5cbiAgICAgICAgICAgIHt7IGF1dG9EZXNjcmlwdGlvblRleHQgfX1cbiAgICAgICAgICA8L21hdC1wYW5lbC1kZXNjcmlwdGlvbj5cbiAgICAgICAgICA8bWF0LXBhbmVsLWRlc2NyaXB0aW9uICpuZ0lmPVwiIWRpc3BsYXlBdXRvRGVzY3JpcHRpb25cIiBbbmdDbGFzc109XCJ7aW52YWxpZDogaWNvbk5hbWU9PSd3YXJuaW5nJ31cIj5cbiAgICAgICAgICAgIDxpPiB7e2Rlc2NyaXB0aW9uVGV4dH19IDwvaT5cbiAgICAgICAgICA8L21hdC1wYW5lbC1kZXNjcmlwdGlvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImV4cGFuc2lvbi1wYW5lbC1ib2R5XCI+XG4gICAgICAgIDx2YS1maWVsZCAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCIgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtXT1cInBhcmVudEZvcm0uY29udHJvbHNbdGl0bGVUZXh0ICsgdW5pcXVlSW5kZXhdXCI+PC92YS1maWVsZD5cbiAgICAgICAgPHAgKm5nSWY9XCJlZGl0aW5nSGludCAhPSAnJ1wiIGNsYXNzPVwiZWRpdGluZy1oaW50XCI+PGk+e3sgZWRpdGluZ0hpbnQgfX08L2k+PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi1mb3JtLXNlY3Rpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEcm9wRG93bkZvcm1TZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwcmVwb3B1bGF0ZWREYXRhOiB7fTtcbiAgQElucHV0KCkgc3RhcnRPcGVuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhcmVudEZvcm06IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgZGlzcGxheUF1dG9UaXRsZSA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZVRleHQgPSAnJztcbiAgQElucHV0KCkgZGlzcGxheUF1dG9EZXNjcmlwdGlvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uVGV4dCA9ICcnO1xuICBASW5wdXQoKSBmaWVsZHM6IEZpZWxkQmFzZTxhbnk+W107XG4gIEBJbnB1dCgpIGVkaXRpbmdIaW50ID0gJyc7XG4gIEBJbnB1dCgpIGV4cGFuZGFibGUgPSB0cnVlO1xuICBhdXRvRGVzY3JpcHRpb25UZXh0ID0gJyc7XG4gIGljb25OYW1lID0gJ2hlbHBfb3V0bGluZSc7XG4gIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHVuaXF1ZUluZGV4ID0gMTtcbiAgYXV0b1RpdGxlVGV4dCA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5wYXJlbnRGb3JtLmNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMudGl0bGVUZXh0ICsgdGhpcy51bmlxdWVJbmRleCkpIHtcbiAgICAgIHRoaXMudW5pcXVlSW5kZXggKz0gMTtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnRGb3JtLmFkZENvbnRyb2wodGhpcy50aXRsZVRleHQgKyB0aGlzLnVuaXF1ZUluZGV4LCB0aGlzLnRvRm9ybUdyb3VwKHRoaXMuZmllbGRzKSk7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMucGFyZW50Rm9ybS5jb250cm9sc1t0aGlzLnRpdGxlVGV4dCArIHRoaXMudW5pcXVlSW5kZXhdIGFzIEZvcm1Hcm91cDtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm0uY29udHJvbHMpIHtcbiAgICAgIGlmIChmb3JtLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHRoaXMucHJlcG9wdWxhdGVkRGF0YSAhPSBudWxsICYmIHRoaXMucHJlcG9wdWxhdGVkRGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgZm9ybS5jb250cm9sc1trZXldLnNldFZhbHVlKHRoaXMucHJlcG9wdWxhdGVkRGF0YVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGZvcm0uc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoY2hhbmdlID0+IHtcbiAgICAgICAgbGV0IG1pc3NpbmdGaWVsZHMgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIGluIGZvcm0uY29udHJvbHMpIHtcbiAgICAgICAgICBpZiAoIWZvcm0uY29udHJvbHNbY29udHJvbF0udmFsdWUgfHwgKGZvcm0uY29udHJvbHNbY29udHJvbF0udmFsdWUuY29uc3RydWN0b3IgPT09IEFycmF5ICYmICFmb3JtLmNvbnRyb2xzW2NvbnRyb2xdLnZhbHVlWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5pY29uTmFtZSA9ICdoZWxwX291dGxpbmUnO1xuICAgICAgICAgICAgbWlzc2luZ0ZpZWxkcyA9IHRydWU7XG4gICAgICAgICAgICBpZiAoY2hhbmdlID09PSAnSU5WQUxJRCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRvVGl0bGVUZXh0ID0gJyogUGxlYXNlIGZpbGwgb3V0IGFsbCByZXF1aXJlZCBmaWVsZHMnO1xuICAgICAgICAgICAgICBpZiAoZm9ybS5jb250cm9sc1tjb250cm9sXS5kaXJ0eSB8fCBmb3JtLmNvbnRyb2xzW2NvbnRyb2xdLnRvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ3dhcm5pbmcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmF1dG9UaXRsZVRleHQgPSAnT3B0aW9uYWwgZmllbGRzIHVuYW5zd2VyZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1pc3NpbmdGaWVsZHMpIHtcbiAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ2NoZWNrX2NpcmNsZSc7XG4gICAgICAgICAgdGhpcy5hdXRvVGl0bGVUZXh0ID0gJ0NvbXBsZXRlJztcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlzcGxheUF1dG9EZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShjaGFuZ2VzID0+IHtcbiAgICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGNoYW5nZXNba2V5XSAhPT0gbnVsbCAmJiBjaGFuZ2VzW2tleV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBpZiAoY2hhbmdlc1trZXldWzBdLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVLZXkgaW4gY2hhbmdlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlc1trZXldW2ZpbGVLZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gY2hhbmdlc1trZXldW2ZpbGVLZXldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICcsICc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IGNoYW5nZXNba2V5XTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAnLCAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYXV0b0Rlc2NyaXB0aW9uVGV4dCA9IGRlc2NyaXB0aW9uLnN1YnN0cmluZygwLCBkZXNjcmlwdGlvbi5sZW5ndGggLSAyKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiBmYWxzZSwgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICB9XG5cbiAgdG9Gb3JtR3JvdXAoZm9ybUZpZWxkczogRmllbGRCYXNlPGFueT5bXSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBsZXQgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuICAgICAgaWYgKGZpZWxkLmNvbnRyb2xUeXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIGZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKGZpZWxkLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1Db250cm9sID0gZmllbGQucmVxdWlyZWQgPyBuZXcgRm9ybUNvbnRyb2woZmllbGQudmFsdWUsIFZhbGlkYXRvcnMucmVxdWlyZWQpIDogbmV3IEZvcm1Db250cm9sKGZpZWxkLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGdyb3VwW2ZpZWxkLmlkXSA9IGZvcm1Db250cm9sO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiAoZmllbGQudmFsdWUgPSB2YWx1ZSkpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChncm91cCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWJzY3JpcHRpb24gPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICB9XG59XG4iXX0=