@jsonforms/angular-material
Version:
Material Renderer Set for Angular module of JSON Forms
191 lines (187 loc) • 22.1 kB
JavaScript
/*
The MIT License
Copyright (c) 2017-2019 EclipseSource Munich
https://github.com/eclipsesource/jsonforms
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import { Component, ChangeDetectionStrategy, Inject, ViewEncapsulation, } from '@angular/core';
import { defaultDateFormat, isDateControl, rankWith, } from '@jsonforms/core';
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
import { MyFormat } from '../util/date-format';
import { DayJsDateAdapter } from '../util/dayjs-date-adapter';
import * as i0 from "@angular/core";
import * as i1 from "@jsonforms/angular";
import * as i2 from "@angular/common";
import * as i3 from "@angular/material/form-field";
import * as i4 from "@angular/material/input";
import * as i5 from "@angular/material/datepicker";
import * as i6 from "@angular/forms";
import * as i7 from "../util/date-format";
import * as i8 from "../util/dayjs-date-adapter";
export class DateControlRenderer extends JsonFormsControl {
dateFormat;
dateAdapter;
focused = false;
views = [];
startView = '';
panelClass = '';
constructor(jsonformsService, dateFormat, dateAdapter) {
super(jsonformsService);
this.dateFormat = dateFormat;
this.dateAdapter = dateAdapter;
}
getEventValue = (event) => {
const value = event.value ? event.value : event;
return this.dateAdapter.toSaveFormat(value);
};
mapToProps(state) {
const props = super.mapToProps(state);
const saveFormat = this.uischema?.options?.dateSaveFormat
? this.uischema.options.dateSaveFormat
: defaultDateFormat;
this.views = this.uischema?.options?.views
? this.uischema.options.views
: ['year', 'month', 'day'];
this.setViewProperties();
const dateFormat = this.uischema?.options?.dateFormat;
if (dateFormat) {
this.dateFormat.setDisplayFormat(dateFormat);
}
this.dateAdapter.setSaveFormat(saveFormat);
if (this.jsonFormsService.getLocale()) {
this.dateAdapter.setLocale(this.jsonFormsService.getLocale());
}
const date = this.dateAdapter.parseSaveFormat(props.data);
return { ...props, data: date };
}
yearSelected($event, datepicker) {
if (!this.views.includes('day') && !this.views.includes('month')) {
this.onChange($event);
datepicker.close();
}
}
monthSelected($event, datepicker) {
if (!this.views.includes('day')) {
this.onChange($event);
datepicker.close();
}
}
setViewProperties() {
if (!this.views.includes('day')) {
this.startView = 'multi-year';
this.panelClass = 'no-panel-navigation';
}
else {
this.startView = 'month';
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateControlRenderer, deps: [{ token: i1.JsonFormsAngularService }, { token: MAT_DATE_FORMATS }, { token: DateAdapter }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateControlRenderer, selector: "DateControlRenderer", providers: [
{
provide: DateAdapter,
useClass: DayJsDateAdapter,
},
{
provide: MAT_DATE_FORMATS,
useClass: MyFormat,
},
], usesInheritance: true, ngImport: i0, template: `
<mat-form-field
class="date-control-renderer"
[ngStyle]="{ display: hidden ? 'none' : '' }"
>
<mat-label>{{ label }}</mat-label>
<input
matInput
(dateChange)="onChange($event)"
[id]="id"
[formControl]="form"
[matDatepicker]="datepicker"
(focus)="focused = true"
(focusout)="focused = false"
/>
<mat-datepicker-toggle
matSuffix
[for]="datepicker"
></mat-datepicker-toggle>
<mat-datepicker
#datepicker
(monthSelected)="monthSelected($event, datepicker)"
(yearSelected)="yearSelected($event, datepicker)"
[startView]="startView"
[panelClass]="panelClass"
></mat-datepicker>
<mat-hint *ngIf="shouldShowUnfocusedDescription() || focused">{{
description
}}</mat-hint>
<mat-error>{{ error }}</mat-error>
</mat-form-field>
`, isInline: true, styles: ["DateControlRenderer{display:flex;flex-direction:row}.date-control-renderer{flex:1 1 auto}.no-panel-navigation .mat-calendar-period-button{pointer-events:none}.no-panel-navigation .mat-calendar-arrow{display:none}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateControlRenderer, decorators: [{
type: Component,
args: [{ selector: 'DateControlRenderer', template: `
<mat-form-field
class="date-control-renderer"
[ngStyle]="{ display: hidden ? 'none' : '' }"
>
<mat-label>{{ label }}</mat-label>
<input
matInput
(dateChange)="onChange($event)"
[id]="id"
[formControl]="form"
[matDatepicker]="datepicker"
(focus)="focused = true"
(focusout)="focused = false"
/>
<mat-datepicker-toggle
matSuffix
[for]="datepicker"
></mat-datepicker-toggle>
<mat-datepicker
#datepicker
(monthSelected)="monthSelected($event, datepicker)"
(yearSelected)="yearSelected($event, datepicker)"
[startView]="startView"
[panelClass]="panelClass"
></mat-datepicker>
<mat-hint *ngIf="shouldShowUnfocusedDescription() || focused">{{
description
}}</mat-hint>
<mat-error>{{ error }}</mat-error>
</mat-form-field>
`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
{
provide: DateAdapter,
useClass: DayJsDateAdapter,
},
{
provide: MAT_DATE_FORMATS,
useClass: MyFormat,
},
], standalone: false, styles: ["DateControlRenderer{display:flex;flex-direction:row}.date-control-renderer{flex:1 1 auto}.no-panel-navigation .mat-calendar-period-button{pointer-events:none}.no-panel-navigation .mat-calendar-arrow{display:none}\n"] }]
}], ctorParameters: () => [{ type: i1.JsonFormsAngularService }, { type: i7.MyFormat, decorators: [{
type: Inject,
args: [MAT_DATE_FORMATS]
}] }, { type: i8.DayJsDateAdapter, decorators: [{
type: Inject,
args: [DateAdapter]
}] }] });
export const DateControlRendererTester = rankWith(2, isDateControl);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWJyYXJ5L2NvbnRyb2xzL2RhdGUucmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJFO0FBQ0YsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFHYixRQUFRLEdBRVQsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7O0FBb0U5RCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsZ0JBQWdCO0lBUW5CO0lBQ0w7SUFSL0IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQ3JCLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDZixVQUFVLEdBQUcsRUFBRSxDQUFDO0lBRWhCLFlBQ0UsZ0JBQXlDLEVBQ1AsVUFBb0IsRUFDekIsV0FBNkI7UUFFMUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFIVSxlQUFVLEdBQVYsVUFBVSxDQUFVO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUc1RCxDQUFDO0lBRUQsYUFBYSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7UUFDN0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMs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QUUsZ0JBQWdCO2dCQUN6QixRQUFRLEVBQUUsUUFBUTthQUNuQjtTQUNGLGlEQTVEUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCVDs7NEZBZ0NVLG1CQUFtQjtrQkFqRS9CLFNBQVM7K0JBQ0UscUJBQXFCLFlBQ3JCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JULGlCQWtCYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxXQUFXOzRCQUNwQixRQUFRLEVBQUUsZ0JBQWdCO3lCQUMzQjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsZ0JBQWdCOzRCQUN6QixRQUFRLEVBQUUsUUFBUTt5QkFDbkI7cUJBQ0YsY0FDVyxLQUFLOzswQkFVZCxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ3ZCLE1BQU07MkJBQUMsV0FBVzs7QUF5RHZCLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFpQixRQUFRLENBQzdELENBQUMsRUFDRCxhQUFhLENBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFRoZSBNSVQgTGljZW5zZVxuICBcbiAgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTkgRWNsaXBzZVNvdXJjZSBNdW5pY2hcbiAgaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2Vzb3VyY2UvanNvbmZvcm1zXG4gIFxuICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICBcbiAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gIFxuICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gIFRIRSBTT0ZUV0FSRS5cbiovXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBJbmplY3QsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGRlZmF1bHREYXRlRm9ybWF0LFxuICBpc0RhdGVDb250cm9sLFxuICBKc29uRm9ybXNTdGF0ZSxcbiAgUmFua2VkVGVzdGVyLFxuICByYW5rV2l0aCxcbiAgU3RhdGVQcm9wc09mQ29udHJvbCxcbn0gZnJvbSAnQGpzb25mb3Jtcy9jb3JlJztcbmltcG9ydCB7IEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlLCBKc29uRm9ybXNDb250cm9sIH0gZnJvbSAnQGpzb25mb3Jtcy9hbmd1bGFyJztcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBNQVRfREFURV9GT1JNQVRTIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNeUZvcm1hdCB9IGZyb20gJy4uL3V0aWwvZGF0ZS1mb3JtYXQnO1xuaW1wb3J0IHsgRGF5SnNEYXRlQWRhcHRlciB9IGZyb20gJy4uL3V0aWwvZGF5anMtZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnRGF0ZUNvbnRyb2xSZW5kZXJlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICBjbGFzcz1cImRhdGUtY29udHJvbC1yZW5kZXJlclwiXG4gICAgICBbbmdTdHlsZV09XCJ7IGRpc3BsYXk6IGhpZGRlbiA/ICdub25lJyA6ICcnIH1cIlxuICAgID5cbiAgICAgIDxtYXQtbGFiZWw+e3sgbGFiZWwgfX08L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICAoZGF0ZUNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1cIlxuICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJkYXRlcGlja2VyXCJcbiAgICAgICAgKGZvY3VzKT1cImZvY3VzZWQgPSB0cnVlXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cImZvY3VzZWQgPSBmYWxzZVwiXG4gICAgICAvPlxuICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZVxuICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgW2Zvcl09XCJkYXRlcGlja2VyXCJcbiAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgIDxtYXQtZGF0ZXBpY2tlclxuICAgICAgICAjZGF0ZXBpY2tlclxuICAgICAgICAobW9udGhTZWxlY3RlZCk9XCJtb250aFNlbGVjdGVkKCRldmVudCwgZGF0ZXBpY2tlcilcIlxuICAgICAgICAoeWVhclNlbGVjdGVkKT1cInllYXJTZWxlY3RlZCgkZXZlbnQsIGRhdGVwaWNrZXIpXCJcbiAgICAgICAgW3N0YXJ0Vmlld109XCJzdGFydFZpZXdcIlxuICAgICAgICBbcGFuZWxDbGFzc109XCJwYW5lbENsYXNzXCJcbiAgICAgID48L21hdC1kYXRlcGlja2VyPlxuICAgICAgPG1hdC1oaW50ICpuZ0lmPVwic2hvdWxkU2hvd1VuZm9jdXNlZERlc2NyaXB0aW9uKCkgfHwgZm9jdXNlZFwiPnt7XG4gICAgICAgIGRlc2NyaXB0aW9uXG4gICAgICB9fTwvbWF0LWhpbnQ+XG4gICAgICA8bWF0LWVycm9yPnt7IGVycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgRGF0ZUNvbnRyb2xSZW5kZXJlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICAuZGF0ZS1jb250cm9sLXJlbmRlcmVyIHtcbiAgICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICB9XG4gICAgICAubm8tcGFuZWwtbmF2aWdhdGlvbiAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b24ge1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cbiAgICAgIC5uby1wYW5lbC1uYXZpZ2F0aW9uIC5tYXQtY2FsZW5kYXItYXJyb3cge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBEYXRlQWRhcHRlcixcbiAgICAgIHVzZUNsYXNzOiBEYXlKc0RhdGVBZGFwdGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTUFUX0RBVEVfRk9STUFUUyxcbiAgICAgIHVzZUNsYXNzOiBNeUZvcm1hdCxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZUNvbnRyb2xSZW5kZXJlciBleHRlbmRzIEpzb25Gb3Jtc0NvbnRyb2wge1xuICBmb2N1c2VkID0gZmFsc2U7XG4gIHZpZXdzOiBzdHJpbmdbXSA9IFtdO1xuICBzdGFydFZpZXcgPSAnJztcbiAgcGFuZWxDbGFzcyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGpzb25mb3Jtc1NlcnZpY2U6IEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoTUFUX0RBVEVfRk9STUFUUykgcHJpdmF0ZSBkYXRlRm9ybWF0OiBNeUZvcm1hdCxcbiAgICBASW5qZWN0KERhdGVBZGFwdGVyKSBwcml2YXRlIGRhdGVBZGFwdGVyOiBEYXlKc0RhdGVBZGFwdGVyXG4gICkge1xuICAgIHN1cGVyKGpzb25mb3Jtc1NlcnZpY2UpO1xuICB9XG5cbiAgZ2V0RXZlbnRWYWx1ZSA9IChldmVudDogYW55KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZSA/IGV2ZW50LnZhbHVlIDogZXZlbnQ7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZUFkYXB0ZXIudG9TYXZlRm9ybWF0KHZhbHVlKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgbWFwVG9Qcm9wcyhzdGF0ZTogSnNvbkZvcm1zU3RhdGUpOiBTdGF0ZVByb3BzT2ZDb250cm9sIHtcbiAgICBjb25zdCBwcm9wcyA9IHN1cGVyLm1hcFRvUHJvcHMoc3RhdGUpO1xuICAgIGNvbnN0IHNhdmVGb3JtYXQgPSB0aGlzLnVpc2NoZW1hPy5vcHRpb25zPy5kYXRlU2F2ZUZvcm1hdFxuICAgICAgPyB0aGlzLnVpc2NoZW1hLm9wdGlvbnMuZGF0ZVNhdmVGb3JtYXRcbiAgICAgIDogZGVmYXVsdERhdGVGb3JtYXQ7XG4gICAgdGhpcy52aWV3cyA9IHRoaXMudWlzY2hlbWE/Lm9wdGlvbnM/LnZpZXdzXG4gICAgICA/IHRoaXMudWlzY2hlbWEub3B0aW9ucy52aWV3c1xuICAgICAgOiBbJ3llYXInLCAnbW9udGgnLCAnZGF5J107XG4gICAgdGhpcy5zZXRWaWV3UHJvcGVydGllcygpO1xuXG4gICAgY29uc3QgZGF0ZUZvcm1hdCA9IHRoaXMudWlzY2hlbWE/Lm9wdGlvbnM/LmRhdGVGb3JtYXQ7XG5cbiAgICBpZiAoZGF0ZUZvcm1hdCkge1xuICAgICAgdGhpcy5kYXRlRm9ybWF0LnNldERpc3BsYXlGb3JtYXQoZGF0ZUZvcm1hdCk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRlQWRhcHRlci5zZXRTYXZlRm9ybWF0KHNhdmVGb3JtYXQpO1xuICAgIGlmICh0aGlzLmpzb25Gb3Jtc1NlcnZpY2UuZ2V0TG9jYWxlKCkpIHtcbiAgICAgIHRoaXMuZGF0ZUFkYXB0ZXIuc2V0TG9jYWxlKHRoaXMuanNvbkZvcm1zU2VydmljZS5nZXRMb2NhbGUoKSk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlU2F2ZUZvcm1hdChwcm9wcy5kYXRhKTtcbiAgICByZXR1cm4geyAuLi5wcm9wcywgZGF0YTogZGF0ZSB9O1xuICB9XG5cbiAgeWVhclNlbGVjdGVkKCRldmVudDogYW55LCBkYXRlcGlja2VyOiBNYXREYXRlcGlja2VyPERheUpzRGF0ZUFkYXB0ZXI+KSB7XG4gICAgaWYgKCF0aGlzLnZpZXdzLmluY2x1ZGVzKCdkYXknKSAmJiAhdGhpcy52aWV3cy5pbmNsdWRlcygnbW9udGgnKSkge1xuICAgICAgdGhpcy5vbkNoYW5nZSgkZXZlbnQpO1xuICAgICAgZGF0ZXBpY2tlci5jbG9zZSgpO1xuICAgIH1cbiAgfVxuICBtb250aFNlbGVjdGVkKCRldmVudDogYW55LCBkYXRlcGlja2VyOiBNYXREYXRlcGlja2VyPERheUpzRGF0ZUFkYXB0ZXI+KSB7XG4gICAgaWYgKCF0aGlzLnZpZXdzLmluY2x1ZGVzKCdkYXknKSkge1xuICAgICAgdGhpcy5vbkNoYW5nZSgkZXZlbnQpO1xuICAgICAgZGF0ZXBpY2tlci5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFZpZXdQcm9wZXJ0aWVzKCkge1xuICAgIGlmICghdGhpcy52aWV3cy5pbmNsdWRlcygnZGF5JykpIHtcbiAgICAgIHRoaXMuc3RhcnRWaWV3ID0gJ211bHRpLXllYXInO1xuICAgICAgdGhpcy5wYW5lbENsYXNzID0gJ25vLXBhbmVsLW5hdmlnYXRpb24nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0VmlldyA9ICdtb250aCc7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBEYXRlQ29udHJvbFJlbmRlcmVyVGVzdGVyOiBSYW5rZWRUZXN0ZXIgPSByYW5rV2l0aChcbiAgMixcbiAgaXNEYXRlQ29udHJvbFxuKTtcbiJdfQ==