UNPKG

@jsonforms/angular-material

Version:

Material Renderer Set for Angular module of JSON Forms

261 lines (257 loc) 27 kB
/* 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: "17.3.10", ngImport: i0, type: ArrayLayoutRenderer, deps: [{ token: i1.JsonFormsAngularService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", 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: "17.3.10", 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, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktbGF5b3V0LnJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYnJhcnkvbGF5b3V0cy9hcnJheS1sYXlvdXQucmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJFO0FBQ0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCx3QkFBd0IsRUFHeEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUV4Qiw4QkFBOEIsRUFDOUIsMEJBQTBCLEVBRTFCLEtBQUssRUFFTCxRQUFRLEVBQ1IsV0FBVyxFQUlYLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7QUFrSHpCLE1BQU0sT0FBTyxtQkFDWCxTQUFRLHdCQUFpRDtJQUd6RCxNQUFNLENBQVU7SUFDaEIsWUFBWSxHQUFzQixFQUFFLENBQUM7SUFDckMsT0FBTyxDQUEyQztJQUNsRCxVQUFVLENBQThDO0lBQ3hELFlBQVksQ0FBOEM7SUFDMUQsV0FBVyxDQUFtRDtJQUM5RCxTQUFTLENBR0w7SUFDSixZQUFZLGdCQUF5QztRQUNuRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsVUFBVSxDQUNSLEtBQXFCO1FBRXJCLE1BQU0sS0FBSyxHQUFHLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsR0FDTCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLElBQUkseUJBQXlCLENBQUMsU0FBUyxDQUFDO1FBQ3pFLE1BQU0sWUFBWSxH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QUMzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStFVCxtQkE2QmdCLHVCQUF1QixDQUFDLE1BQU07O0FBNEZqRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUIsUUFBUSxDQUM3RCxDQUFDLEVBQ0Qsd0JBQXdCLENBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGUgTUlUIExpY2Vuc2VcblxuICBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBFY2xpcHNlU291cmNlIE11bmljaFxuICBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZXNvdXJjZS9qc29uZm9ybXNcblxuICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4gIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAgVEhFIFNPRlRXQVJFLlxuKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSnNvbkZvcm1zQW5ndWxhclNlcnZpY2UsXG4gIEpzb25Gb3Jtc0Fic3RyYWN0Q29udHJvbCxcbn0gZnJvbSAnQGpzb25mb3Jtcy9hbmd1bGFyJztcbmltcG9ydCB7XG4gIGFycmF5RGVmYXVsdFRyYW5zbGF0aW9ucyxcbiAgQXJyYXlMYXlvdXRQcm9wcyxcbiAgQXJyYXlUcmFuc2xhdGlvbnMsXG4gIGNyZWF0ZURlZmF1bHRWYWx1ZSxcbiAgZGVmYXVsdEpzb25Gb3Jtc0kxOG5TdGF0ZSxcbiAgZmluZFVJU2NoZW1hLFxuICBnZXRBcnJheVRyYW5zbGF0aW9ucyxcbiAgaXNPYmplY3RBcnJheVdpdGhOZXN0aW5nLFxuICBKc29uRm9ybXNTdGF0ZSxcbiAgbWFwRGlzcGF0Y2hUb0FycmF5Q29udHJvbFByb3BzLFxuICBtYXBTdGF0ZVRvQXJyYXlMYXlvdXRQcm9wcyxcbiAgT3duUHJvcHNPZlJlbmRlcmVyLFxuICBQYXRocyxcbiAgUmFua2VkVGVzdGVyLFxuICByYW5rV2l0aCxcbiAgc2V0UmVhZG9ubHksXG4gIFN0YXRlUHJvcHNPZkFycmF5TGF5b3V0LFxuICBVSVNjaGVtYUVsZW1lbnQsXG4gIFVJU2NoZW1hVGVzdGVyLFxuICB1bnNldFJlYWRvbmx5LFxufSBmcm9tICdAanNvbmZvcm1zL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYXJyYXktbGF5b3V0LXJlbmRlcmVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtuZ1N0eWxlXT1cInsgZGlzcGxheTogaGlkZGVuID8gJ25vbmUnIDogJycgfVwiIGNsYXNzPVwiYXJyYXktbGF5b3V0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXJyYXktbGF5b3V0LXRvb2xiYXJcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwibWF0LWgyIGFycmF5LWxheW91dC10aXRsZVwiPnt7IGxhYmVsIH19PC9oMj5cbiAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAqbmdJZj1cInRoaXMuZXJyb3I/Lmxlbmd0aFwiXG4gICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICBtYXRCYWRnZT1cInt7IHRoaXMuZXJyb3Iuc3BsaXQoJycpLmxlbmd0aCB9fVwiXG4gICAgICAgICAgbWF0QmFkZ2VDb2xvcj1cIndhcm5cIlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0aGlzLmVycm9yIH19XCJcbiAgICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJlcnJvci1tZXNzYWdlLXRvb2x0aXBcIlxuICAgICAgICA+XG4gICAgICAgICAgZXJyb3Jfb3V0bGluZVxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgbWF0VG9vbHRpcD1cInt7IHRyYW5zbGF0aW9ucy5hZGRUb29sdGlwIH19XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRW5hYmxlZCgpXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkKClcIlxuICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IHRyYW5zbGF0aW9ucy5hZGRBcmlhTGFiZWwgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCAqbmdJZj1cIm5vRGF0YVwiPnt7IHRyYW5zbGF0aW9ucy5ub0RhdGFNZXNzYWdlIH19PC9wPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICBsZXQgaXRlbSBvZiBbXS5jb25zdHJ1Y3RvcihkYXRhKTtcbiAgICAgICAgICBsZXQgaWR4ID0gaW5kZXg7XG4gICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUZuO1xuICAgICAgICAgIGxhc3QgYXMgbGFzdDtcbiAgICAgICAgICBmaXJzdCBhcyBmaXJzdFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJhcnJheS1pdGVtXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCI+XG4gICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8anNvbmZvcm1zLW91dGxldCBbcmVuZGVyUHJvcHNdPVwiZ2V0UHJvcHMoaWR4KVwiPjwvanNvbmZvcm1zLW91dGxldD5cbiAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPG1hdC1jYXJkLWFjdGlvbnMgKm5nSWY9XCJpc0VuYWJsZWQoKVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cInVpc2NoZW1hPy5vcHRpb25zPy5zaG93U29ydEJ1dHRvbnNcIlxuICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0tdXBcIlxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaXJzdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cChpZHgpXCJcbiAgICAgICAgICAgICAgYXR0ci5hcmlhLWxhYmVsPVwie3sgdHJhbnNsYXRpb25zLnVwQXJpYUxhYmVsIH19XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IHRyYW5zbGF0aW9ucy51cCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X3Vwd2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJ1aXNjaGVtYT8ub3B0aW9ucz8uc2hvd1NvcnRCdXR0b25zXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLWRvd25cIlxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsYXN0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd24oaWR4KVwiXG4gICAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IHRyYW5zbGF0aW9ucy5kb3duQXJpYUxhYmVsIH19XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IHRyYW5zbGF0aW9ucy5kb3duIH19XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZShpZHgpXCJcbiAgICAgICAgICAgICAgYXR0ci5hcmlhLWxhYmVsPVwie3sgdHJhbnNsYXRpb25zLnJlbW92ZUFyaWFMYWJlbCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0cmFuc2xhdGlvbnMucmVtb3ZlVG9vbHRpcCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L21hdC1jYXJkLWFjdGlvbnM+XG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmFycmF5LWxheW91dCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTZweDtcbiAgICAgIH1cbiAgICAgIC5hcnJheS1sYXlvdXQgPiAqIHtcbiAgICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICB9XG4gICAgICAuYXJyYXktbGF5b3V0LXRvb2xiYXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgfVxuICAgICAgLmFycmF5LWxheW91dC10aXRsZSB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICAgIC5hcnJheS1sYXlvdXQtdG9vbGJhciA+IHNwYW4ge1xuICAgICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIH1cbiAgICAgIC5hcnJheS1pdGVtIHtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgIH1cbiAgICAgIDo6bmctZGVlcCAuZXJyb3ItbWVzc2FnZS10b29sdGlwIHtcbiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS1saW5lO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcnJheUxheW91dFJlbmRlcmVyXG4gIGV4dGVuZHMgSnNvbkZvcm1zQWJzdHJhY3RDb250cm9sPFN0YXRlUHJvcHNPZkFycmF5TGF5b3V0PlxuICBpbXBsZW1lbnRzIE9uSW5pdFxue1xuICBub0RhdGE6IGJvb2xlYW47XG4gIHRyYW5zbGF0aW9uczogQXJyYXlUcmFuc2xhdGlvbnMgPSB7fTtcbiAgYWRkSXRlbTogKHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gKCkgPT4gdm9pZDtcbiAgbW92ZUl0ZW1VcDogKHBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4gKCkgPT4gdm9pZDtcbiAgbW92ZUl0ZW1Eb3duOiAocGF0aDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiAoKSA9PiB2b2lkO1xuICByZW1vdmVJdGVtczogKHBhdGg6IHN0cmluZywgdG9EZWxldGU6IG51bWJlcltdKSA9PiAoKSA9PiB2b2lkO1xuICB1aXNjaGVtYXM6IHtcbiAgICB0ZXN0ZXI6IFVJU2NoZW1hVGVzdGVyO1xuICAgIHVpc2NoZW1hOiBVSVNjaGVtYUVsZW1lbnQ7XG4gIH1bXTtcbiAgY29uc3RydWN0b3IoanNvbkZvcm1zU2VydmljZTogSnNvbkZvcm1zQW5ndWxhclNlcnZpY2UpIHtcbiAgICBzdXBlcihqc29uRm9ybXNTZXJ2aWNlKTtcbiAgfVxuICBtYXBUb1Byb3BzKFxuICAgIHN0YXRlOiBKc29uRm9ybXNTdGF0ZVxuICApOiBTdGF0ZVByb3BzT2ZBcnJheUxheW91dCAmIHsgdHJhbnNsYXRpb25zOiBBcnJheVRyYW5zbGF0aW9ucyB9IHtcbiAgICBjb25zdCBwcm9wcyA9IG1hcFN0YXRlVG9BcnJheUxheW91dFByb3BzKHN0YXRlLCB0aGlzLmdldE93blByb3BzKCkpO1xuICAgIGNvbnN0IHQgPVxuICAgICAgc3RhdGUuanNvbmZvcm1zLmkxOG4/LnRyYW5zbGF0ZSA/PyBkZWZhdWx0SnNvbkZvcm1zSTE4blN0YXRlLnRyYW5zbGF0ZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBnZXRBcnJheVRyYW5zbGF0aW9ucyhcbiAgICAgIHQsXG4gICAgICBhcnJheURlZmF1bHRUcmFuc2xhdGlvbnMsXG4gICAgICBwcm9wcy5pMThuS2V5UHJlZml4LFxuICAgICAgcHJvcHMubGFiZWxcbiAgICApO1xuICAgIHJldHVybiB7IC4uLnByb3BzLCB0cmFuc2xhdGlvbnMgfTtcbiAgfVxuICByZW1vdmUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlSXRlbXModGhpcy5wcm9wc1BhdGgsIFtpbmRleF0pKCk7XG4gIH1cbiAgYWRkKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkSXRlbShcbiAgICAgIHRoaXMucHJvcHNQYXRoLFxuICAgICAgY3JlYXRlRGVmYXVsdFZhbHVlKHRoaXMuc2NvcGVkU2NoZW1hLCB0aGlzLnJvb3RTY2hlbWEpXG4gICAgKSgpO1xuICB9XG4gIHVwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1vdmVJdGVtVXAodGhpcy5wcm9wc1BhdGgsIGluZGV4KSgpO1xuICB9XG4gIGRvd24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubW92ZUl0ZW1Eb3duKHRoaXMucHJvcHNQYXRoLCBpbmRleCkoKTtcbiAgfVxuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIGNvbnN0IHsgYWRkSXRlbSwgcmVtb3ZlSXRlbXMsIG1vdmVVcCwgbW92ZURvd24gfSA9XG4gICAgICBtYXBEaXNwYXRjaFRvQXJyYXlDb250cm9sUHJvcHMoXG4gICAgICAgIHRoaXMuanNvbkZvcm1zU2VydmljZS51cGRhdGVDb3JlLmJpbmQodGhpcy5qc29uRm9ybXNTZXJ2aWNlKVxuICAgICAgKTtcbiAgICB0aGlzLmFkZEl0ZW0gPSBhZGRJdGVtO1xuICAgIHRoaXMubW92ZUl0ZW1VcCA9IG1vdmVVcDtcbiAgICB0aGlzLm1vdmVJdGVtRG93biA9IG1vdmVEb3duO1xuICAgIHRoaXMucmVtb3ZlSXRlbXMgPSByZW1vdmVJdGVtcztcbiAgfVxuICBtYXBBZGRpdGlvbmFsUHJvcHMoXG4gICAgcHJvcHM6IEFycmF5TGF5b3V0UHJvcHMgJiB7IHRyYW5zbGF0aW9uczogQXJyYXlUcmFuc2xhdGlvbnMgfVxuICApIHtcbiAgICB0aGlzLm5vRGF0YSA9ICFwcm9wcy5kYXRhIHx8IHByb3BzLmRhdGEgPT09IDA7XG4gICAgdGhpcy51aXNjaGVtYXMgPSBwcm9wcy51aXNjaGVtYXM7XG4gICAgdGhpcy50cmFuc2xhdGlvbnMgPSBwcm9wcy50cmFuc2xhdGlvbnM7XG4gIH1cbiAgZ2V0UHJvcHMoaW5kZXg6IG51bWJlcik6IE93blByb3BzT2ZSZW5kZXJlciB7XG4gICAgY29uc3QgdWlzY2hlbWEgPSBmaW5kVUlTY2hlbWEoXG4gICAgICB0aGlzLnVpc2NoZW1hcyxcbiAgICAgIHRoaXMuc2NvcGVkU2NoZW1hLFxuICAgICAgdGhpcy51aXNjaGVtYS5zY29wZSxcbiAgICAgIHRoaXMucHJvcHNQYXRoLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy51aXNjaGVtYSxcbiAgICAgIHRoaXMucm9vdFNjaGVtYVxuICAgICk7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgIHVuc2V0UmVhZG9ubHkodWlzY2hlbWEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRSZWFkb25seSh1aXNjaGVtYSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWE6IHRoaXMuc2NvcGVkU2NoZW1hLFxuICAgICAgcGF0aDogUGF0aHMuY29tcG9zZSh0aGlzLnByb3BzUGF0aCwgYCR7aW5kZXh9YCksXG4gICAgICB1aXNjaGVtYSxcbiAgICB9O1xuICB9XG4gIHRyYWNrQnlGbihpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBBcnJheUxheW91dFJlbmRlcmVyVGVzdGVyOiBSYW5rZWRUZXN0ZXIgPSByYW5rV2l0aChcbiAgNCxcbiAgaXNPYmplY3RBcnJheVdpdGhOZXN0aW5nXG4pO1xuIl19