@ngx-formly/material
Version:
Formly is a dynamic (JSON powered) form library for Angular that bring unmatched maintainability to your application's forms.
162 lines (160 loc) • 18.1 kB
JavaScript
import { Component, ChangeDetectionStrategy, ViewChild } from '@angular/core';
import { MatSelect } from '@angular/material/select';
import { FieldType } from '@ngx-formly/material/form-field';
import { ɵobserve as observe } from '@ngx-formly/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/core";
import * as i2 from "@angular/material/select";
import * as i3 from "@angular/forms";
import * as i4 from "@ngx-formly/core";
import * as i5 from "@angular/common";
import * as i6 from "@ngx-formly/core/select";
export class FormlyFieldSelect extends FieldType {
constructor() {
super(...arguments);
this.defaultOptions = {
props: {
compareWith(o1, o2) {
return o1 === o2;
},
},
};
}
set select(select) {
observe(select, ['_parentFormField', '_textField'], ({ currentValue }) => {
if (currentValue) {
select._preferredOverlayOrigin = select._parentFormField.getConnectedOverlayOrigin();
}
});
}
getSelectAllState(options) {
if (this.empty || this.value.length === 0) {
return null;
}
return this.value.length !== this.getSelectAllValue(options).length ? 'indeterminate' : 'checked';
}
toggleSelectAll(options) {
const selectAllValue = this.getSelectAllValue(options);
this.formControl.setValue(!this.value || this.value.length !== selectAllValue.length ? selectAllValue : []);
this.formControl.markAsDirty();
}
change($event) {
this.props.change?.(this.field, $event);
}
_getAriaLabelledby() {
if (this.props.attributes?.['aria-labelledby']) {
return this.props.attributes['aria-labelledby'];
}
return this.formField?._labelId;
}
_getAriaLabel() {
return this.props.attributes?.['aria-label'];
}
getSelectAllValue(options) {
if (!this.selectAllValue || options !== this.selectAllValue.options) {
const flatOptions = [];
options.forEach((o) => (o.group ? flatOptions.push(...o.group) : flatOptions.push(o)));
this.selectAllValue = {
options,
value: flatOptions.filter((o) => !o.disabled).map((o) => o.value),
};
}
return this.selectAllValue.value;
}
}
FormlyFieldSelect.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: FormlyFieldSelect, deps: null, target: i0.ɵɵFactoryTarget.Component });
FormlyFieldSelect.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: FormlyFieldSelect, selector: "formly-field-mat-select", viewQueries: [{ propertyName: "select", first: true, predicate: MatSelect, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
<ng-template
<mat-option (click)="toggleSelectAll(selectOptions)">
<mat-pseudo-checkbox class="mat-option-pseudo-checkbox" [state]="getSelectAllState(selectOptions)">
</mat-pseudo-checkbox>
{{ props.selectAllOption }}
</mat-option>
</ng-template>
<mat-select
[]="id"
[]="formControl"
[]="field"
[]="props.placeholder"
[]="props.tabindex"
[]="required"
[]="props.compareWith"
[]="props.multiple"
(selectionChange)="change($event)"
[]="errorStateMatcher"
[]="_getAriaLabel()"
[]="_getAriaLabelledby()"
[]="props.disableOptionCentering"
[]="props.typeaheadDebounceInterval"
>
<ng-container *ngIf="props.options | formlySelectOptions : field | async as selectOptions">
<ng-container
*ngIf="props.multiple && props.selectAllOption"
[]="selectAll"
[]="{ selectOptions: selectOptions }"
>
</ng-container>
<ng-container *ngFor="let item of selectOptions">
<mat-optgroup *ngIf="item.group" [label]="item.label">
<mat-option *ngFor="let child of item.group" [value]="child.value" [disabled]="child.disabled">
{{ child.label }}
</mat-option>
</mat-optgroup>
<mat-option *ngIf="!item.group" [value]="item.value" [disabled]="item.disabled">{{ item.label }}</mat-option>
</ng-container>
</ng-container>
</mat-select>
`, isInline: true, components: [{ type: i1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i1.MatPseudoCheckbox, selector: "mat-pseudo-checkbox", inputs: ["state", "disabled"] }, { type: i2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i1.MatOptgroup, selector: "mat-optgroup", inputs: ["disabled"], exportAs: ["matOptgroup"] }], directives: [{ type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i4.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i5.AsyncPipe, "formlySelectOptions": i6.FormlySelectOptionsPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: FormlyFieldSelect, decorators: [{
type: Component,
args: [{
selector: 'formly-field-mat-select',
template: `
<ng-template
<mat-option (click)="toggleSelectAll(selectOptions)">
<mat-pseudo-checkbox class="mat-option-pseudo-checkbox" [state]="getSelectAllState(selectOptions)">
</mat-pseudo-checkbox>
{{ props.selectAllOption }}
</mat-option>
</ng-template>
<mat-select
[]="id"
[]="formControl"
[]="field"
[]="props.placeholder"
[]="props.tabindex"
[]="required"
[]="props.compareWith"
[]="props.multiple"
(selectionChange)="change($event)"
[]="errorStateMatcher"
[]="_getAriaLabel()"
[]="_getAriaLabelledby()"
[]="props.disableOptionCentering"
[]="props.typeaheadDebounceInterval"
>
<ng-container *ngIf="props.options | formlySelectOptions : field | async as selectOptions">
<ng-container
*ngIf="props.multiple && props.selectAllOption"
[]="selectAll"
[]="{ selectOptions: selectOptions }"
>
</ng-container>
<ng-container *ngFor="let item of selectOptions">
<mat-optgroup *ngIf="item.group" [label]="item.label">
<mat-option *ngFor="let child of item.group" [value]="child.value" [disabled]="child.disabled">
{{ child.label }}
</mat-option>
</mat-optgroup>
<mat-option *ngIf="!item.group" [value]="item.value" [disabled]="item.disabled">{{ item.label }}</mat-option>
</ng-container>
</ng-container>
</mat-select>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
}]
}], propDecorators: { select: [{
type: ViewChild,
args: [MatSelect, { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdWkvbWF0ZXJpYWwvc2VsZWN0L3NyYy9zZWxlY3QudHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFRLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRixPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLDBCQUEwQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0saUNBQWlDLENBQUM7QUFFOUUsT0FBTyxFQUFFLFFBQVEsSUFBSSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7QUE2RHZELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxTQUF1QztJQS9DOUU7O1FBdURXLG1CQUFjLEdBQUc7WUFDeEIsS0FBSyxFQUFFO2dCQUNMLFdBQVcsQ0FBQyxFQUFPLEVBQUUsRUFBTztvQkFDMUIsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUNuQixDQUFDO2FBQ0Y7U0FDRixDQUFDO0tBK0NIO0lBNURDLElBQTRDLE1BQU0sQ0FBQyxNQUFXO1FBQzVELE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRTtZQUN2RSxJQUFJLFlBQVksRUFBRTtnQkFDaEIsTUFBTSxDQUFDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO2FBQ3RGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBV0QsaUJBQWlCLENBQUMsT0FBYztRQUM5QixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BHLENBQUM7SUFFRCxlQUFlLENBQUMsT0FBYztRQUM1QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQXVCO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQzlDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQVcsQ0FBQztTQUMzRDtRQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsWUFBWSxDQUFXLENBQUM7SUFDekQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQWM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQ25FLE1BQU0sV0FBVyxHQUFVLEVBQUUsQ0FBQztZQUM5QixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXZGLElBQUksQ0FBQyxjQUFjLEdBQUc7Z0JBQ3BCLE9BQU87Z0JBQ1AsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUNsRSxDQUFDO1NBQ0g7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQ25DLENBQUM7OytHQTVEVSxpQkFBaUI7bUdBQWpCLGlCQUFpQix1R0FDakIsU0FBUyxxRkE5Q1Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVDs0RkFHVSxpQkFBaUI7a0JBL0M3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs4QkFFNkMsTUFBTTtzQkFBakQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgVHlwZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRTZWxlY3QsIE1hdFNlbGVjdENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBGaWVsZFR5cGVDb25maWcsIEZvcm1seUZpZWxkQ29uZmlnIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBGaWVsZFR5cGUsIEZvcm1seUZpZWxkUHJvcHMgfSBmcm9tICdAbmd4LWZvcm1seS9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IEZvcm1seUZpZWxkU2VsZWN0UHJvcHMgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlL3NlbGVjdCc7XG5pbXBvcnQgeyDJtW9ic2VydmUgYXMgb2JzZXJ2ZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuXG5pbnRlcmZhY2UgU2VsZWN0UHJvcHMgZXh0ZW5kcyBGb3JtbHlGaWVsZFByb3BzLCBGb3JtbHlGaWVsZFNlbGVjdFByb3BzIHtcbiAgbXVsdGlwbGU/OiBib29sZWFuO1xuICBzZWxlY3RBbGxPcHRpb24/OiBzdHJpbmc7XG4gIGRpc2FibGVPcHRpb25DZW50ZXJpbmc/OiBib29sZWFuO1xuICB0eXBlYWhlYWREZWJvdW5jZUludGVydmFsPzogbnVtYmVyO1xuICBjb21wYXJlV2l0aD86IChvMTogYW55LCBvMjogYW55KSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1seVNlbGVjdEZpZWxkQ29uZmlnIGV4dGVuZHMgRm9ybWx5RmllbGRDb25maWc8U2VsZWN0UHJvcHM+IHtcbiAgdHlwZTogJ3NlbGVjdCcgfCBUeXBlPEZvcm1seUZpZWxkU2VsZWN0Pjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZm9ybWx5LWZpZWxkLW1hdC1zZWxlY3QnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjc2VsZWN0QWxsIGxldC1zZWxlY3RPcHRpb25zPVwic2VsZWN0T3B0aW9uc1wiPlxuICAgICAgPG1hdC1vcHRpb24gKGNsaWNrKT1cInRvZ2dsZVNlbGVjdEFsbChzZWxlY3RPcHRpb25zKVwiPlxuICAgICAgICA8bWF0LXBzZXVkby1jaGVja2JveCBjbGFzcz1cIm1hdC1vcHRpb24tcHNldWRvLWNoZWNrYm94XCIgW3N0YXRlXT1cImdldFNlbGVjdEFsbFN0YXRlKHNlbGVjdE9wdGlvbnMpXCI+XG4gICAgICAgIDwvbWF0LXBzZXVkby1jaGVja2JveD5cbiAgICAgICAge3sgcHJvcHMuc2VsZWN0QWxsT3B0aW9uIH19XG4gICAgICA8L21hdC1vcHRpb24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxtYXQtc2VsZWN0XG4gICAgICBbaWRdPVwiaWRcIlxuICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgIFtmb3JtbHlBdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wcy5wbGFjZWhvbGRlclwiXG4gICAgICBbdGFiSW5kZXhdPVwicHJvcHMudGFiaW5kZXhcIlxuICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgIFtjb21wYXJlV2l0aF09XCJwcm9wcy5jb21wYXJlV2l0aFwiXG4gICAgICBbbXVsdGlwbGVdPVwicHJvcHMubXVsdGlwbGVcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbZXJyb3JTdGF0ZU1hdGNoZXJdPVwiZXJyb3JTdGF0ZU1hdGNoZXJcIlxuICAgICAgW2FyaWEtbGFiZWxdPVwiX2dldEFyaWFMYWJlbCgpXCJcbiAgICAgIFthcmlhLWxhYmVsbGVkYnldPVwiX2dldEFyaWFMYWJlbGxlZGJ5KClcIlxuICAgICAgW2Rpc2FibGVPcHRpb25DZW50ZXJpbmddPVwicHJvcHMuZGlzYWJsZU9wdGlvbkNlbnRlcmluZ1wiXG4gICAgICBbdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbF09XCJwcm9wcy50eXBlYWhlYWREZWJvdW5jZUludGVydmFsXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvcHMub3B0aW9ucyB8IGZvcm1seVNlbGVjdE9wdGlvbnMgOiBmaWVsZCB8IGFzeW5jIGFzIHNlbGVjdE9wdGlvbnNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwicHJvcHMubXVsdGlwbGUgJiYgcHJvcHMuc2VsZWN0QWxsT3B0aW9uXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RBbGxcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHNlbGVjdE9wdGlvbnM6IHNlbGVjdE9wdGlvbnMgfVwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0T3B0aW9uc1wiPlxuICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgKm5nSWY9XCJpdGVtLmdyb3VwXCIgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjaGlsZCBvZiBpdGVtLmdyb3VwXCIgW3ZhbHVlXT1cImNoaWxkLnZhbHVlXCIgW2Rpc2FibGVkXT1cImNoaWxkLmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgIHt7IGNoaWxkLmxhYmVsIH19XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCIhaXRlbS5ncm91cFwiIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj57eyBpdGVtLmxhYmVsIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LXNlbGVjdD5cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seUZpZWxkU2VsZWN0IGV4dGVuZHMgRmllbGRUeXBlPEZpZWxkVHlwZUNvbmZpZzxTZWxlY3RQcm9wcz4+IHtcbiAgQFZpZXdDaGlsZChNYXRTZWxlY3QsIHsgc3RhdGljOiB0cnVlIH0pIHNldCBzZWxlY3Qoc2VsZWN0OiBhbnkpIHtcbiAgICBvYnNlcnZlKHNlbGVjdCwgWydfcGFyZW50Rm9ybUZpZWxkJywgJ190ZXh0RmllbGQnXSwgKHsgY3VycmVudFZhbHVlIH0pID0+IHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgc2VsZWN0Ll9wcmVmZXJyZWRPdmVybGF5T3JpZ2luID0gc2VsZWN0Ll9wYXJlbnRGb3JtRmllbGQuZ2V0Q29ubmVjdGVkT3ZlcmxheU9yaWdpbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG92ZXJyaWRlIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHByb3BzOiB7XG4gICAgICBjb21wYXJlV2l0aChvMTogYW55LCBvMjogYW55KSB7XG4gICAgICAgIHJldHVybiBvMSA9PT0gbzI7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgcHJpdmF0ZSBzZWxlY3RBbGxWYWx1ZSE6IHsgb3B0aW9uczogYW55OyB2YWx1ZTogYW55W10gfTtcblxuICBnZXRTZWxlY3RBbGxTdGF0ZShvcHRpb25zOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLmVtcHR5IHx8IHRoaXMudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggIT09IHRoaXMuZ2V0U2VsZWN0QWxsVmFsdWUob3B0aW9ucykubGVuZ3RoID8gJ2luZGV0ZXJtaW5hdGUnIDogJ2NoZWNrZWQnO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKG9wdGlvbnM6IGFueVtdKSB7XG4gICAgY29uc3Qgc2VsZWN0QWxsVmFsdWUgPSB0aGlzLmdldFNlbGVjdEFsbFZhbHVlKG9wdGlvbnMpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZS5sZW5ndGggIT09IHNlbGVjdEFsbFZhbHVlLmxlbmd0aCA/IHNlbGVjdEFsbFZhbHVlIDogW10pO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIGNoYW5nZSgkZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSkge1xuICAgIHRoaXMucHJvcHMuY2hhbmdlPy4odGhpcy5maWVsZCwgJGV2ZW50KTtcbiAgfVxuXG4gIF9nZXRBcmlhTGFiZWxsZWRieSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5hdHRyaWJ1dGVzPy5bJ2FyaWEtbGFiZWxsZWRieSddKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5hdHRyaWJ1dGVzWydhcmlhLWxhYmVsbGVkYnknXSBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZm9ybUZpZWxkPy5fbGFiZWxJZDtcbiAgfVxuXG4gIF9nZXRBcmlhTGFiZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYXR0cmlidXRlcz8uWydhcmlhLWxhYmVsJ10gYXMgc3RyaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RBbGxWYWx1ZShvcHRpb25zOiBhbnlbXSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RBbGxWYWx1ZSB8fCBvcHRpb25zICE9PSB0aGlzLnNlbGVjdEFsbFZhbHVlLm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGZsYXRPcHRpb25zOiBhbnlbXSA9IFtdO1xuICAgICAgb3B0aW9ucy5mb3JFYWNoKChvKSA9PiAoby5ncm91cCA/IGZsYXRPcHRpb25zLnB1c2goLi4uby5ncm91cCkgOiBmbGF0T3B0aW9ucy5wdXNoKG8pKSk7XG5cbiAgICAgIHRoaXMuc2VsZWN0QWxsVmFsdWUgPSB7XG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHZhbHVlOiBmbGF0T3B0aW9ucy5maWx0ZXIoKG8pID0+ICFvLmRpc2FibGVkKS5tYXAoKG8pID0+IG8udmFsdWUpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZWxlY3RBbGxWYWx1ZS52YWx1ZTtcbiAgfVxufVxuIl19