@jsonforms/angular-material
Version:
Material Renderer Set for Angular module of JSON Forms
261 lines (257 loc) • 27.1 kB
JavaScript
/*
The MIT License
Copyright (c) 2017-2020 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 { ChangeDetectionStrategy, Component } from '@angular/core';
import { JsonFormsAngularService, JsonFormsAbstractControl, } from '@jsonforms/angular';
import { arrayDefaultTranslations, createDefaultValue, defaultJsonFormsI18nState, findUISchema, getArrayTranslations, isObjectArrayWithNesting, mapDispatchToArrayControlProps, mapStateToArrayLayoutProps, Paths, rankWith, setReadonly, unsetReadonly, } from '@jsonforms/core';
import * as i0 from "@angular/core";
import * as i1 from "@jsonforms/angular";
import * as i2 from "@angular/common";
import * as i3 from "@angular/material/card";
import * as i4 from "@angular/material/button";
import * as i5 from "@angular/material/icon";
import * as i6 from "@angular/material/tooltip";
import * as i7 from "@angular/material/badge";
export class ArrayLayoutRenderer extends JsonFormsAbstractControl {
noData;
translations = {};
addItem;
moveItemUp;
moveItemDown;
removeItems;
uischemas;
constructor(jsonFormsService) {
super(jsonFormsService);
}
mapToProps(state) {
const props = mapStateToArrayLayoutProps(state, this.getOwnProps());
const t = state.jsonforms.i18n?.translate ?? defaultJsonFormsI18nState.translate;
const translations = getArrayTranslations(t, arrayDefaultTranslations, props.i18nKeyPrefix, props.label);
return { ...props, translations };
}
remove(index) {
this.removeItems(this.propsPath, [index])();
}
add() {
this.addItem(this.propsPath, createDefaultValue(this.scopedSchema, this.rootSchema))();
}
up(index) {
this.moveItemUp(this.propsPath, index)();
}
down(index) {
this.moveItemDown(this.propsPath, index)();
}
ngOnInit() {
super.ngOnInit();
const { addItem, removeItems, moveUp, moveDown } = mapDispatchToArrayControlProps(this.jsonFormsService.updateCore.bind(this.jsonFormsService));
this.addItem = addItem;
this.moveItemUp = moveUp;
this.moveItemDown = moveDown;
this.removeItems = removeItems;
}
mapAdditionalProps(props) {
this.noData = !props.data || props.data === 0;
this.uischemas = props.uischemas;
this.translations = props.translations;
}
getProps(index) {
const uischema = findUISchema(this.uischemas, this.scopedSchema, this.uischema.scope, this.propsPath, undefined, this.uischema, this.rootSchema);
if (this.isEnabled()) {
unsetReadonly(uischema);
}
else {
setReadonly(uischema);
}
return {
schema: this.scopedSchema,
path: Paths.compose(this.propsPath, `${index}`),
uischema,
};
}
trackByFn(index) {
return index;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ArrayLayoutRenderer, deps: [{ token: i1.JsonFormsAngularService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ArrayLayoutRenderer, selector: "app-array-layout-renderer", usesInheritance: true, ngImport: i0, template: `
<div [ngStyle]="{ display: hidden ? 'none' : '' }" class="array-layout">
<div class="array-layout-toolbar">
<h2 class="mat-h2 array-layout-title">{{ label }}</h2>
<span></span>
<mat-icon
*ngIf="this.error?.length"
color="warn"
matBadge="{{ this.error.split('').length }}"
matBadgeColor="warn"
matTooltip="{{ this.error }}"
matTooltipClass="error-message-tooltip"
>
error_outline
</mat-icon>
<span></span>
<button
mat-button
matTooltip="{{ translations.addTooltip }}"
[disabled]="!isEnabled()"
(click)="add()"
attr.aria-label="{{ translations.addAriaLabel }}"
>
<mat-icon>add</mat-icon>
</button>
</div>
<p *ngIf="noData">{{ translations.noDataMessage }}</p>
<div
*ngFor="
let item of [].constructor(data);
let idx = index;
trackBy: trackByFn;
last as last;
first as first
"
>
<mat-card class="array-item" appearance="outlined">
<mat-card-content>
<jsonforms-outlet [renderProps]="getProps(idx)"></jsonforms-outlet>
</mat-card-content>
<mat-card-actions *ngIf="isEnabled()">
<button
*ngIf="uischema?.options?.showSortButtons"
class="item-up"
mat-button
[disabled]="first"
(click)="up(idx)"
attr.aria-label="{{ translations.upAriaLabel }}"
matTooltip="{{ translations.up }}"
matTooltipPosition="right"
>
<mat-icon>arrow_upward</mat-icon>
</button>
<button
*ngIf="uischema?.options?.showSortButtons"
class="item-down"
mat-button
[disabled]="last"
(click)="down(idx)"
attr.aria-label="{{ translations.downAriaLabel }}"
matTooltip="{{ translations.down }}"
matTooltipPosition="right"
>
<mat-icon>arrow_downward</mat-icon>
</button>
<button
mat-button
color="warn"
(click)="remove(idx)"
attr.aria-label="{{ translations.removeAriaLabel }}"
matTooltip="{{ translations.removeTooltip }}"
matTooltipPosition="right"
>
<mat-icon>delete</mat-icon>
</button>
</mat-card-actions>
</mat-card>
</div>
</div>
`, isInline: true, styles: [".array-layout{display:flex;flex-direction:column;gap:16px}.array-layout>*{flex:1 1 auto}.array-layout-toolbar{display:flex;align-items:center}.array-layout-title{margin:0}.array-layout-toolbar>span{flex:1 1 auto}.array-item{padding:16px}::ng-deep .error-message-tooltip{white-space:pre-line}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.JsonFormsOutlet, selector: "jsonforms-outlet", inputs: ["renderProps"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i7.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ArrayLayoutRenderer, decorators: [{
type: Component,
args: [{ selector: 'app-array-layout-renderer', template: `
<div [ngStyle]="{ display: hidden ? 'none' : '' }" class="array-layout">
<div class="array-layout-toolbar">
<h2 class="mat-h2 array-layout-title">{{ label }}</h2>
<span></span>
<mat-icon
*ngIf="this.error?.length"
color="warn"
matBadge="{{ this.error.split('').length }}"
matBadgeColor="warn"
matTooltip="{{ this.error }}"
matTooltipClass="error-message-tooltip"
>
error_outline
</mat-icon>
<span></span>
<button
mat-button
matTooltip="{{ translations.addTooltip }}"
[disabled]="!isEnabled()"
(click)="add()"
attr.aria-label="{{ translations.addAriaLabel }}"
>
<mat-icon>add</mat-icon>
</button>
</div>
<p *ngIf="noData">{{ translations.noDataMessage }}</p>
<div
*ngFor="
let item of [].constructor(data);
let idx = index;
trackBy: trackByFn;
last as last;
first as first
"
>
<mat-card class="array-item" appearance="outlined">
<mat-card-content>
<jsonforms-outlet [renderProps]="getProps(idx)"></jsonforms-outlet>
</mat-card-content>
<mat-card-actions *ngIf="isEnabled()">
<button
*ngIf="uischema?.options?.showSortButtons"
class="item-up"
mat-button
[disabled]="first"
(click)="up(idx)"
attr.aria-label="{{ translations.upAriaLabel }}"
matTooltip="{{ translations.up }}"
matTooltipPosition="right"
>
<mat-icon>arrow_upward</mat-icon>
</button>
<button
*ngIf="uischema?.options?.showSortButtons"
class="item-down"
mat-button
[disabled]="last"
(click)="down(idx)"
attr.aria-label="{{ translations.downAriaLabel }}"
matTooltip="{{ translations.down }}"
matTooltipPosition="right"
>
<mat-icon>arrow_downward</mat-icon>
</button>
<button
mat-button
color="warn"
(click)="remove(idx)"
attr.aria-label="{{ translations.removeAriaLabel }}"
matTooltip="{{ translations.removeTooltip }}"
matTooltipPosition="right"
>
<mat-icon>delete</mat-icon>
</button>
</mat-card-actions>
</mat-card>
</div>
</div>
`, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [".array-layout{display:flex;flex-direction:column;gap:16px}.array-layout>*{flex:1 1 auto}.array-layout-toolbar{display:flex;align-items:center}.array-layout-title{margin:0}.array-layout-toolbar>span{flex:1 1 auto}.array-item{padding:16px}::ng-deep .error-message-tooltip{white-space:pre-line}\n"] }]
}], ctorParameters: () => [{ type: i1.JsonFormsAngularService }] });
export const ArrayLayoutRendererTester = rankWith(4, isObjectArrayWithNesting);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktbGF5b3V0LnJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYnJhcnkvbGF5b3V0cy9hcnJheS1sYXlvdXQucmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJFO0FBQ0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCx3QkFBd0IsRUFHeEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUV4Qiw4QkFBOEIsRUFDOUIsMEJBQTBCLEVBRTFCLEtBQUssRUFFTCxRQUFRLEVBQ1IsV0FBVyxFQUlYLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7QUFtSHpCLE1BQU0sT0FBTyxtQkFDWCxTQUFRLHdCQUFpRDtJQUd6RCxNQUFNLENBQVU7SUFDaEIsWUFBWSxHQUFzQixFQUFFLENBQUM7SUFDckMsT0FBTyxDQUEyQztJQUNsRCxVQUFVLENBQThDO0lBQ3hELFlBQVksQ0FBOEM7SUFDMUQsV0FBVyxDQUFtRDtJQUM5RCxTQUFTLENBR0w7SUFDSixZQUFZLGdCQUF5QztRQUNuRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsVUFBVSxDQUNSLEtBQXFCO1FBRXJCLE1BQU0sS0FBSyxHQUFHLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsR0FDTCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLElBQUkseUJBQXlCLENBQUMsU0FBUyxDQUFDO1FBQ3pFLE1BQU0sWUFBWSxH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LFNBQVM7K0JBQ0UsMkJBQTJCLFlBQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0VULG1CQTZCZ0IsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxLQUFLOztBQTRGbkIsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCLFFBQVEsQ0FDN0QsQ0FBQyxFQUNELHdCQUF3QixDQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgVGhlIE1JVCBMaWNlbnNlXG5cbiAgQ29weXJpZ2h0IChjKSAyMDE3LTIwMjAgRWNsaXBzZVNvdXJjZSBNdW5pY2hcbiAgaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2Vzb3VyY2UvanNvbmZvcm1zXG5cbiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gIFRIRSBTT0ZUV0FSRS5cbiovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlLFxuICBKc29uRm9ybXNBYnN0cmFjdENvbnRyb2wsXG59IGZyb20gJ0Bqc29uZm9ybXMvYW5ndWxhcic7XG5pbXBvcnQge1xuICBhcnJheURlZmF1bHRUcmFuc2xhdGlvbnMsXG4gIEFycmF5TGF5b3V0UHJvcHMsXG4gIEFycmF5VHJhbnNsYXRpb25zLFxuICBjcmVhdGVEZWZhdWx0VmFsdWUsXG4gIGRlZmF1bHRKc29uRm9ybXNJMThuU3RhdGUsXG4gIGZpbmRVSVNjaGVtYSxcbiAgZ2V0QXJyYXlUcmFuc2xhdGlvbnMsXG4gIGlzT2JqZWN0QXJyYXlXaXRoTmVzdGluZyxcbiAgSnNvbkZvcm1zU3RhdGUsXG4gIG1hcERpc3BhdGNoVG9BcnJheUNvbnRyb2xQcm9wcyxcbiAgbWFwU3RhdGVUb0FycmF5TGF5b3V0UHJvcHMsXG4gIE93blByb3BzT2ZSZW5kZXJlcixcbiAgUGF0aHMsXG4gIFJhbmtlZFRlc3RlcixcbiAgcmFua1dpdGgsXG4gIHNldFJlYWRvbmx5LFxuICBTdGF0ZVByb3BzT2ZBcnJheUxheW91dCxcbiAgVUlTY2hlbWFFbGVtZW50LFxuICBVSVNjaGVtYVRlc3RlcixcbiAgdW5zZXRSZWFkb25seSxcbn0gZnJvbSAnQGpzb25mb3Jtcy9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFycmF5LWxheW91dC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbbmdTdHlsZV09XCJ7IGRpc3BsYXk6IGhpZGRlbiA/ICdub25lJyA6ICcnIH1cIiBjbGFzcz1cImFycmF5LWxheW91dFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWxheW91dC10b29sYmFyXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cIm1hdC1oMiBhcnJheS1sYXlvdXQtdGl0bGVcIj57eyBsYWJlbCB9fTwvaDI+XG4gICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgKm5nSWY9XCJ0aGlzLmVycm9yPy5sZW5ndGhcIlxuICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgbWF0QmFkZ2U9XCJ7eyB0aGlzLmVycm9yLnNwbGl0KCcnKS5sZW5ndGggfX1cIlxuICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwie3sgdGhpcy5lcnJvciB9fVwiXG4gICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwiZXJyb3ItbWVzc2FnZS10b29sdGlwXCJcbiAgICAgICAgPlxuICAgICAgICAgIGVycm9yX291dGxpbmVcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0cmFuc2xhdGlvbnMuYWRkVG9vbHRpcCB9fVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0VuYWJsZWQoKVwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZCgpXCJcbiAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJ7eyB0cmFuc2xhdGlvbnMuYWRkQXJpYUxhYmVsIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgKm5nSWY9XCJub0RhdGFcIj57eyB0cmFuc2xhdGlvbnMubm9EYXRhTWVzc2FnZSB9fTwvcD5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgbGV0IGl0ZW0gb2YgW10uY29uc3RydWN0b3IoZGF0YSk7XG4gICAgICAgICAgbGV0IGlkeCA9IGluZGV4O1xuICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlGbjtcbiAgICAgICAgICBsYXN0IGFzIGxhc3Q7XG4gICAgICAgICAgZmlyc3QgYXMgZmlyc3RcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwiYXJyYXktaXRlbVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiPlxuICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPGpzb25mb3Jtcy1vdXRsZXQgW3JlbmRlclByb3BzXT1cImdldFByb3BzKGlkeClcIj48L2pzb25mb3Jtcy1vdXRsZXQ+XG4gICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zICpuZ0lmPVwiaXNFbmFibGVkKClcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJ1aXNjaGVtYT8ub3B0aW9ucz8uc2hvd1NvcnRCdXR0b25zXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLXVwXCJcbiAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlyc3RcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidXAoaWR4KVwiXG4gICAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IHRyYW5zbGF0aW9ucy51cEFyaWFMYWJlbCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0cmFuc2xhdGlvbnMudXAgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd191cHdhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwidWlzY2hlbWE/Lm9wdGlvbnM/LnNob3dTb3J0QnV0dG9uc1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1kb3duXCJcbiAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibGFzdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkb3duKGlkeClcIlxuICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJ7eyB0cmFuc2xhdGlvbnMuZG93bkFyaWFMYWJlbCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0cmFuc2xhdGlvbnMuZG93biB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmUoaWR4KVwiXG4gICAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IHRyYW5zbGF0aW9ucy5yZW1vdmVBcmlhTGFiZWwgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgdHJhbnNsYXRpb25zLnJlbW92ZVRvb2x0aXAgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxuICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5hcnJheS1sYXlvdXQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICB9XG4gICAgICAuYXJyYXktbGF5b3V0ID4gKiB7XG4gICAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgfVxuICAgICAgLmFycmF5LWxheW91dC10b29sYmFyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIH1cbiAgICAgIC5hcnJheS1sYXlvdXQtdGl0bGUge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgICAuYXJyYXktbGF5b3V0LXRvb2xiYXIgPiBzcGFuIHtcbiAgICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICB9XG4gICAgICAuYXJyYXktaXRlbSB7XG4gICAgICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgICB9XG4gICAgICA6Om5nLWRlZXAgLmVycm9yLW1lc3NhZ2UtdG9vbHRpcCB7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIEFycmF5TGF5b3V0UmVuZGVyZXJcbiAgZXh0ZW5kcyBKc29uRm9ybXNBYnN0cmFjdENvbnRyb2w8U3RhdGVQcm9wc09mQXJyYXlMYXlvdXQ+XG4gIGltcGxlbWVudHMgT25Jbml0XG57XG4gIG5vRGF0YTogYm9vbGVhbjtcbiAgdHJhbnNsYXRpb25zOiBBcnJheVRyYW5zbGF0aW9ucyA9IHt9O1xuICBhZGRJdGVtOiAocGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiAoKSA9PiB2b2lkO1xuICBtb3ZlSXRlbVVwOiAocGF0aDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiAoKSA9PiB2b2lkO1xuICBtb3ZlSXRlbURvd246IChwYXRoOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+ICgpID0+IHZvaWQ7XG4gIHJlbW92ZUl0ZW1zOiAocGF0aDogc3RyaW5nLCB0b0RlbGV0ZTogbnVtYmVyW10pID0+ICgpID0+IHZvaWQ7XG4gIHVpc2NoZW1hczoge1xuICAgIHRlc3RlcjogVUlTY2hlbWFUZXN0ZXI7XG4gICAgdWlzY2hlbWE6IFVJU2NoZW1hRWxlbWVudDtcbiAgfVtdO1xuICBjb25zdHJ1Y3Rvcihqc29uRm9ybXNTZXJ2aWNlOiBKc29uRm9ybXNBbmd1bGFyU2VydmljZSkge1xuICAgIHN1cGVyKGpzb25Gb3Jtc1NlcnZpY2UpO1xuICB9XG4gIG1hcFRvUHJvcHMoXG4gICAgc3RhdGU6IEpzb25Gb3Jtc1N0YXRlXG4gICk6IFN0YXRlUHJvcHNPZkFycmF5TGF5b3V0ICYgeyB0cmFuc2xhdGlvbnM6IEFycmF5VHJhbnNsYXRpb25zIH0ge1xuICAgIGNvbnN0IHByb3BzID0gbWFwU3RhdGVUb0FycmF5TGF5b3V0UHJvcHMoc3RhdGUsIHRoaXMuZ2V0T3duUHJvcHMoKSk7XG4gICAgY29uc3QgdCA9XG4gICAgICBzdGF0ZS5qc29uZm9ybXMuaTE4bj8udHJhbnNsYXRlID8/IGRlZmF1bHRKc29uRm9ybXNJMThuU3RhdGUudHJhbnNsYXRlO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IGdldEFycmF5VHJhbnNsYXRpb25zKFxuICAgICAgdCxcbiAgICAgIGFycmF5RGVmYXVsdFRyYW5zbGF0aW9ucyxcbiAgICAgIHByb3BzLmkxOG5LZXlQcmVmaXgsXG4gICAgICBwcm9wcy5sYWJlbFxuICAgICk7XG4gICAgcmV0dXJuIHsgLi4ucHJvcHMsIHRyYW5zbGF0aW9ucyB9O1xuICB9XG4gIHJlbW92ZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVJdGVtcyh0aGlzLnByb3BzUGF0aCwgW2luZGV4XSkoKTtcbiAgfVxuICBhZGQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRJdGVtKFxuICAgICAgdGhpcy5wcm9wc1BhdGgsXG4gICAgICBjcmVhdGVEZWZhdWx0VmFsdWUodGhpcy5zY29wZWRTY2hlbWEsIHRoaXMucm9vdFNjaGVtYSlcbiAgICApKCk7XG4gIH1cbiAgdXAoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubW92ZUl0ZW1VcCh0aGlzLnByb3BzUGF0aCwgaW5kZXgpKCk7XG4gIH1cbiAgZG93bihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tb3ZlSXRlbURvd24odGhpcy5wcm9wc1BhdGgsIGluZGV4KSgpO1xuICB9XG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgY29uc3QgeyBhZGRJdGVtLCByZW1vdmVJdGVtcywgbW92ZVVwLCBtb3ZlRG93biB9ID1cbiAgICAgIG1hcERpc3BhdGNoVG9BcnJheUNvbnRyb2xQcm9wcyhcbiAgICAgICAgdGhpcy5qc29uRm9ybXNTZXJ2aWNlLnVwZGF0ZUNvcmUuYmluZCh0aGlzLmpzb25Gb3Jtc1NlcnZpY2UpXG4gICAgICApO1xuICAgIHRoaXMuYWRkSXRlbSA9IGFkZEl0ZW07XG4gICAgdGhpcy5tb3ZlSXRlbVVwID0gbW92ZVVwO1xuICAgIHRoaXMubW92ZUl0ZW1Eb3duID0gbW92ZURvd247XG4gICAgdGhpcy5yZW1vdmVJdGVtcyA9IHJlbW92ZUl0ZW1zO1xuICB9XG4gIG1hcEFkZGl0aW9uYWxQcm9wcyhcbiAgICBwcm9wczogQXJyYXlMYXlvdXRQcm9wcyAmIHsgdHJhbnNsYXRpb25zOiBBcnJheVRyYW5zbGF0aW9ucyB9XG4gICkge1xuICAgIHRoaXMubm9EYXRhID0gIXByb3BzLmRhdGEgfHwgcHJvcHMuZGF0YSA9PT0gMDtcbiAgICB0aGlzLnVpc2NoZW1hcyA9IHByb3BzLnVpc2NoZW1hcztcbiAgICB0aGlzLnRyYW5zbGF0aW9ucyA9IHByb3BzLnRyYW5zbGF0aW9ucztcbiAgfVxuICBnZXRQcm9wcyhpbmRleDogbnVtYmVyKTogT3duUHJvcHNPZlJlbmRlcmVyIHtcbiAgICBjb25zdCB1aXNjaGVtYSA9IGZpbmRVSVNjaGVtYShcbiAgICAgIHRoaXMudWlzY2hlbWFzLFxuICAgICAgdGhpcy5zY29wZWRTY2hlbWEsXG4gICAgICB0aGlzLnVpc2NoZW1hLnNjb3BlLFxuICAgICAgdGhpcy5wcm9wc1BhdGgsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLnVpc2NoZW1hLFxuICAgICAgdGhpcy5yb290U2NoZW1hXG4gICAgKTtcbiAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgdW5zZXRSZWFkb25seSh1aXNjaGVtYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFJlYWRvbmx5KHVpc2NoZW1hKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYTogdGhpcy5zY29wZWRTY2hlbWEsXG4gICAgICBwYXRoOiBQYXRocy5jb21wb3NlKHRoaXMucHJvcHNQYXRoLCBgJHtpbmRleH1gKSxcbiAgICAgIHVpc2NoZW1hLFxuICAgIH07XG4gIH1cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEFycmF5TGF5b3V0UmVuZGVyZXJUZXN0ZXI6IFJhbmtlZFRlc3RlciA9IHJhbmtXaXRoKFxuICA0LFxuICBpc09iamVjdEFycmF5V2l0aE5lc3Rpbmdcbik7XG4iXX0=