UNPKG

@nakedobjects/gemini

Version:

Single Page Application client for a Naked Objects application.

84 lines 20.8 kB
import { Component, Input, ViewChildren } from '@angular/core'; import { copy, RecentItemViewModel } from '@nakedobjects/view-models'; import { focus } from '../helpers-components'; import * as i0 from "@angular/core"; import * as i1 from "@nakedobjects/view-models"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; import * as i4 from "../click.directive"; export class RowComponent { dragAndDrop; constructor(dragAndDrop) { this.dragAndDrop = dragAndDrop; } item; row; withCheckbox; isTable; rowChildren; get id() { return `${this.item.id || 'item'}${this.item.paneId}-${this.row}`; } get color() { return this.item.color; } get selected() { return this.item.selected; } get title() { return this.item.title; } get friendlyName() { return this.item instanceof RecentItemViewModel ? this.item.friendlyName : ''; } tabIndexFirstColumn(i) { if (this.isTable) { if (this.hasTableTitle()) { return i === 'title' ? 0 : -1; } else if (this.friendlyName) { return i === 'fname' ? 0 : -1; } else if (i === 0) { return 0; } } return -1; } tableTitle = () => this.item.tableRowViewModel ? this.item.tableRowViewModel.title : this.title; hasTableTitle = () => this.item.tableRowViewModel?.showTitle || !!(this.item instanceof RecentItemViewModel && this.item.title); tableProperties = () => this.item.tableRowViewModel?.properties ?? []; propertyType = (property) => property.type; propertyValue = (property) => property.value; propertyFormattedValue = (property) => property.formattedValue; propertyReturnType = (property) => property.returnType; doClick = (right) => this.item.doClick(right); copy(event, item) { copy(event, item, this.dragAndDrop); } focus() { return !!this.rowChildren && this.rowChildren.length > 0 && focus(this.rowChildren.first); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RowComponent, deps: [{ token: i1.DragAndDropService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: RowComponent, selector: "[nof-row]", inputs: { item: "item", row: "row", withCheckbox: "withCheckbox", isTable: "isTable" }, viewQueries: [{ propertyName: "rowChildren", predicate: ["focus"], descendants: true }], ngImport: i0, template: "<td class=\"checkbox\" *ngIf=\"withCheckbox\">\n <input type=\"checkbox\" [id]=\"id\" [(ngModel)]=\"item.selected\">\n</td>\n<ng-container *ngIf=\"!isTable\">\n <td #focus class=\"reference\" [ngClass]=\"color\" nofClick (leftClick)=\"doClick()\" (rightClick)=\"doClick(true)\"\n (keydown)=\"copy($event, item)\" (keypress)=\"copy($event, item)\" tabindex=\"0\">\n <label attr.for=\"{{id}}\">{{title}}</label>\n </td>\n</ng-container>\n<ng-container *ngIf=\"isTable\">\n <td #focus *ngIf=\"hasTableTitle()\" nofClick (leftClick)=\"doClick()\" (rightClick)=\"doClick(true)\" [ngClass]=\"color\" class=\"cell\" (keydown)=\"copy($event, item)\" (keypress)=\"copy($event, item)\" [tabindex]=\"tabIndexFirstColumn('title')\">\n {{tableTitle()}}\n </td>\n <td *ngIf=\"friendlyName\" class=\"cell\" [ngClass]=\"color\" nofClick (leftClick)=\"doClick()\" (rightClick)=\"doClick(true)\"\n (keydown)=\"copy($event, item)\" (keypress)=\"copy($event, item)\" [tabindex]=\"tabIndexFirstColumn('fname')\">\n {{friendlyName}}\n </td>\n <ng-container *ngIf=\"!friendlyName\">\n <td #focus *ngFor=\"let property of tableProperties(); let i = index\" nofClick (leftClick)=\"doClick()\" (rightClick)=\"doClick(true)\"\n [ngClass]=\"color\" class=\"cell\" (keydown)=\"copy($event, item)\" (keypress)=\"copy($event, item)\" [tabindex]=\"tabIndexFirstColumn(i)\">\n <ng-container [ngSwitch]=\"propertyType(property)\">\n <ng-container *ngSwitchCase=\"'ref'\">\n {{propertyFormattedValue(property)}}\n </ng-container>\n <ng-container *ngSwitchCase=\"'scalar'\" [ngSwitch]=\"propertyReturnType(property)\">\n <ng-container *ngSwitchCase=\"'boolean'\">\n <input type=\"checkbox\" [checked]=\"propertyValue(property)\" disabled=\"disabled\" />\n </ng-container>\n <ng-container *ngSwitchCase=\"'number'\">\n <div class=\"number\">{{propertyFormattedValue(property)}}</div>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <div>{{propertyFormattedValue(property)}}</div>\n </ng-container>\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n</ng-container>\n", styles: [":host{cursor:pointer}td{font-size:var(--font-size-2);font-weight:var(--font-weight-1);text-align:left;padding-left:var(--space-3);padding-right:var(--space-3);vertical-align:top}.number{text-align:right}.reference{cursor:pointer;font-size:var(--font-size-2);padding-left:var(--space-3);padding-right:var(--space-3);margin:var(--space-1);width:var(--table-width)}.reference:not(:last-child){margin-bottom:var(--space-3)}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.ClickDirective, selector: "[nofClick]", outputs: ["leftClick", "rightClick"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RowComponent, decorators: [{ type: Component, args: [{ selector: '[nof-row]', template: "<td class=\"checkbox\" *ngIf=\"withCheckbox\">\n <input type=\"checkbox\" [id]=\"id\" [(ngModel)]=\"item.selected\">\n</td>\n<ng-container *ngIf=\"!isTable\">\n <td #focus class=\"reference\" [ngClass]=\"color\" nofClick (leftClick)=\"doClick()\" (rightClick)=\"doClick(true)\"\n (keydown)=\"copy($event, item)\" (keypress)=\"copy($event, item)\" tabindex=\"0\">\n <label attr.for=\"{{id}}\">{{title}}</label>\n </td>\n</ng-container>\n<ng-container *ngIf=\"isTable\">\n <td #focus *ngIf=\"hasTableTitle()\" nofClick (leftClick)=\"doClick()\" (rightClick)=\"doClick(true)\" [ngClass]=\"color\" class=\"cell\" (keydown)=\"copy($event, item)\" (keypress)=\"copy($event, item)\" [tabindex]=\"tabIndexFirstColumn('title')\">\n {{tableTitle()}}\n </td>\n <td *ngIf=\"friendlyName\" class=\"cell\" [ngClass]=\"color\" nofClick (leftClick)=\"doClick()\" (rightClick)=\"doClick(true)\"\n (keydown)=\"copy($event, item)\" (keypress)=\"copy($event, item)\" [tabindex]=\"tabIndexFirstColumn('fname')\">\n {{friendlyName}}\n </td>\n <ng-container *ngIf=\"!friendlyName\">\n <td #focus *ngFor=\"let property of tableProperties(); let i = index\" nofClick (leftClick)=\"doClick()\" (rightClick)=\"doClick(true)\"\n [ngClass]=\"color\" class=\"cell\" (keydown)=\"copy($event, item)\" (keypress)=\"copy($event, item)\" [tabindex]=\"tabIndexFirstColumn(i)\">\n <ng-container [ngSwitch]=\"propertyType(property)\">\n <ng-container *ngSwitchCase=\"'ref'\">\n {{propertyFormattedValue(property)}}\n </ng-container>\n <ng-container *ngSwitchCase=\"'scalar'\" [ngSwitch]=\"propertyReturnType(property)\">\n <ng-container *ngSwitchCase=\"'boolean'\">\n <input type=\"checkbox\" [checked]=\"propertyValue(property)\" disabled=\"disabled\" />\n </ng-container>\n <ng-container *ngSwitchCase=\"'number'\">\n <div class=\"number\">{{propertyFormattedValue(property)}}</div>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <div>{{propertyFormattedValue(property)}}</div>\n </ng-container>\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n</ng-container>\n", styles: [":host{cursor:pointer}td{font-size:var(--font-size-2);font-weight:var(--font-weight-1);text-align:left;padding-left:var(--space-3);padding-right:var(--space-3);vertical-align:top}.number{text-align:right}.reference{cursor:pointer;font-size:var(--font-size-2);padding-left:var(--space-3);padding-right:var(--space-3);margin:var(--space-1);width:var(--table-width)}.reference:not(:last-child){margin-bottom:var(--space-3)}\n"] }] }], ctorParameters: () => [{ type: i1.DragAndDropService }], propDecorators: { item: [{ type: Input, args: [{ required: true }] }], row: [{ type: Input, args: [{ required: true }] }], withCheckbox: [{ type: Input, args: [{ required: true }] }], isTable: [{ type: Input, args: [{ required: true }] }], rowChildren: [{ type: ViewChildren, args: ['focus'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2dlbWluaS9zcmMvcm93L3Jvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL3Jvdy9yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxJQUFJLEVBQTBELG1CQUFtQixFQUEyQixNQUFNLDJCQUEyQixDQUFDO0FBQ3ZKLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7O0FBUTlDLE1BQU0sT0FBTyxZQUFZO0lBR0E7SUFEckIsWUFDcUIsV0FBK0I7UUFBL0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO0lBQ2hELENBQUM7SUFHTCxJQUFJLENBQWlCO0lBR3JCLEdBQUcsQ0FBVTtJQUdiLFlBQVksQ0FBVztJQUd2QixPQUFPLENBQVc7SUFHbEIsV0FBVyxDQUF5QjtJQUVwQyxJQUFJLEVBQUU7UUFDRixPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxZQUFZLG1CQUFtQixD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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvcHksIERyYWdBbmREcm9wU2VydmljZSwgSURyYWdnYWJsZVZpZXdNb2RlbCwgSXRlbVZpZXdNb2RlbCwgUmVjZW50SXRlbVZpZXdNb2RlbCwgVGFibGVSb3dDb2x1bW5WaWV3TW9kZWwgfSBmcm9tICdAbmFrZWRvYmplY3RzL3ZpZXctbW9kZWxzJztcbmltcG9ydCB7IGZvY3VzIH0gZnJvbSAnLi4vaGVscGVycy1jb21wb25lbnRzJztcblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tub2Ytcm93XScsXG4gICAgdGVtcGxhdGVVcmw6ICdyb3cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydyb3cuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJvd0NvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkcmFnQW5kRHJvcDogRHJhZ0FuZERyb3BTZXJ2aWNlLFxuICAgICkgeyB9XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgaXRlbSE6IEl0ZW1WaWV3TW9kZWw7XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgcm93ITogbnVtYmVyO1xuXG4gICAgQElucHV0KHtyZXF1aXJlZCA6IHRydWV9KVxuICAgIHdpdGhDaGVja2JveCE6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgaXNUYWJsZSE6IGJvb2xlYW47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdmb2N1cycpXG4gICAgcm93Q2hpbGRyZW4/OiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLml0ZW0uaWQgfHwgJ2l0ZW0nfSR7dGhpcy5pdGVtLnBhbmVJZH0tJHt0aGlzLnJvd31gO1xuICAgIH1cblxuICAgIGdldCBjb2xvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbS5jb2xvcjtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0uc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtLnRpdGxlO1xuICAgIH1cblxuICAgIGdldCBmcmllbmRseU5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0gaW5zdGFuY2VvZiBSZWNlbnRJdGVtVmlld01vZGVsID8gdGhpcy5pdGVtLmZyaWVuZGx5TmFtZSA6ICcnO1xuICAgIH1cblxuICAgIHRhYkluZGV4Rmlyc3RDb2x1bW4oaTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVGFibGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1RhYmxlVGl0bGUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpID09PSAndGl0bGUnID8gMCA6IC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZyaWVuZGx5TmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpID09PSAnZm5hbWUnID8gMCA6IC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHRhYmxlVGl0bGUgPSAoKSA9PiB0aGlzLml0ZW0udGFibGVSb3dWaWV3TW9kZWwgPyB0aGlzLml0ZW0udGFibGVSb3dWaWV3TW9kZWwudGl0bGUgOiB0aGlzLnRpdGxlO1xuICAgIGhhc1RhYmxlVGl0bGUgPSAoKSA9PiB0aGlzLml0ZW0udGFibGVSb3dWaWV3TW9kZWw/LnNob3dUaXRsZSB8fCAhISh0aGlzLml0ZW0gaW5zdGFuY2VvZiBSZWNlbnRJdGVtVmlld01vZGVsICYmIHRoaXMuaXRlbS50aXRsZSk7XG4gICAgdGFibGVQcm9wZXJ0aWVzID0gKCk6IFRhYmxlUm93Q29sdW1uVmlld01vZGVsW10gPT4gdGhpcy5pdGVtLnRhYmxlUm93Vmlld01vZGVsPy5wcm9wZXJ0aWVzID8/IFtdO1xuXG4gICAgcHJvcGVydHlUeXBlID0gKHByb3BlcnR5OiBUYWJsZVJvd0NvbHVtblZpZXdNb2RlbCkgPT4gcHJvcGVydHkudHlwZTtcbiAgICBwcm9wZXJ0eVZhbHVlID0gKHByb3BlcnR5OiBUYWJsZVJvd0NvbHVtblZpZXdNb2RlbCkgPT4gcHJvcGVydHkudmFsdWU7XG4gICAgcHJvcGVydHlGb3JtYXR0ZWRWYWx1ZSA9IChwcm9wZXJ0eTogVGFibGVSb3dDb2x1bW5WaWV3TW9kZWwpID0+IHByb3BlcnR5LmZvcm1hdHRlZFZhbHVlO1xuICAgIHByb3BlcnR5UmV0dXJuVHlwZSA9IChwcm9wZXJ0eTogVGFibGVSb3dDb2x1bW5WaWV3TW9kZWwpID0+IHByb3BlcnR5LnJldHVyblR5cGU7XG5cbiAgICBkb0NsaWNrID0gKHJpZ2h0PzogYm9vbGVhbikgPT4gdGhpcy5pdGVtLmRvQ2xpY2socmlnaHQpO1xuXG4gICAgY29weShldmVudDogS2V5Ym9hcmRFdmVudCwgaXRlbTogSURyYWdnYWJsZVZpZXdNb2RlbCkge1xuICAgICAgICBjb3B5KGV2ZW50LCBpdGVtLCB0aGlzLmRyYWdBbmREcm9wKTtcbiAgICB9XG5cbiAgICBmb2N1cygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5yb3dDaGlsZHJlbiAmJiB0aGlzLnJvd0NoaWxkcmVuLmxlbmd0aCA+IDAgJiYgZm9jdXModGhpcy5yb3dDaGlsZHJlbi5maXJzdCk7XG4gICAgfVxufVxuIiwiPHRkIGNsYXNzPVwiY2hlY2tib3hcIiAqbmdJZj1cIndpdGhDaGVja2JveFwiPlxuICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwiaWRcIiBbKG5nTW9kZWwpXT1cIml0ZW0uc2VsZWN0ZWRcIj5cbjwvdGQ+XG48bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGFibGVcIj5cbiAgICA8dGQgI2ZvY3VzIGNsYXNzPVwicmVmZXJlbmNlXCIgW25nQ2xhc3NdPVwiY29sb3JcIiBub2ZDbGljayAobGVmdENsaWNrKT1cImRvQ2xpY2soKVwiIChyaWdodENsaWNrKT1cImRvQ2xpY2sodHJ1ZSlcIlxuICAgICAgICAgKGtleWRvd24pPVwiY29weSgkZXZlbnQsIGl0ZW0pXCIgKGtleXByZXNzKT1cImNvcHkoJGV2ZW50LCBpdGVtKVwiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICA8bGFiZWwgYXR0ci5mb3I9XCJ7e2lkfX1cIj57e3RpdGxlfX08L2xhYmVsPlxuICAgIDwvdGQ+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc1RhYmxlXCI+XG4gICAgPHRkICNmb2N1cyAqbmdJZj1cImhhc1RhYmxlVGl0bGUoKVwiIG5vZkNsaWNrIChsZWZ0Q2xpY2spPVwiZG9DbGljaygpXCIgKHJpZ2h0Q2xpY2spPVwiZG9DbGljayh0cnVlKVwiIFtuZ0NsYXNzXT1cImNvbG9yXCIgY2xhc3M9XCJjZWxsXCIgKGtleWRvd24pPVwiY29weSgkZXZlbnQsIGl0ZW0pXCIgKGtleXByZXNzKT1cImNvcHkoJGV2ZW50LCBpdGVtKVwiIFt0YWJpbmRleF09XCJ0YWJJbmRleEZpcnN0Q29sdW1uKCd0aXRsZScpXCI+XG4gICAgICAgIHt7dGFibGVUaXRsZSgpfX1cbiAgICA8L3RkPlxuICAgIDx0ZCAqbmdJZj1cImZyaWVuZGx5TmFtZVwiIGNsYXNzPVwiY2VsbFwiIFtuZ0NsYXNzXT1cImNvbG9yXCIgbm9mQ2xpY2sgKGxlZnRDbGljayk9XCJkb0NsaWNrKClcIiAocmlnaHRDbGljayk9XCJkb0NsaWNrKHRydWUpXCJcbiAgICAgICAgIChrZXlkb3duKT1cImNvcHkoJGV2ZW50LCBpdGVtKVwiIChrZXlwcmVzcyk9XCJjb3B5KCRldmVudCwgaXRlbSlcIiBbdGFiaW5kZXhdPVwidGFiSW5kZXhGaXJzdENvbHVtbignZm5hbWUnKVwiPlxuICAgICAgICB7e2ZyaWVuZGx5TmFtZX19XG4gICAgPC90ZD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZyaWVuZGx5TmFtZVwiPlxuICAgICAgICA8dGQgI2ZvY3VzICpuZ0Zvcj1cImxldCBwcm9wZXJ0eSBvZiB0YWJsZVByb3BlcnRpZXMoKTsgbGV0IGkgPSBpbmRleFwiIG5vZkNsaWNrIChsZWZ0Q2xpY2spPVwiZG9DbGljaygpXCIgKHJpZ2h0Q2xpY2spPVwiZG9DbGljayh0cnVlKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb2xvclwiIGNsYXNzPVwiY2VsbFwiIChrZXlkb3duKT1cImNvcHkoJGV2ZW50LCBpdGVtKVwiIChrZXlwcmVzcyk9XCJjb3B5KCRldmVudCwgaXRlbSlcIiBbdGFiaW5kZXhdPVwidGFiSW5kZXhGaXJzdENvbHVtbihpKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicHJvcGVydHlUeXBlKHByb3BlcnR5KVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidyZWYnXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7cHJvcGVydHlGb3JtYXR0ZWRWYWx1ZShwcm9wZXJ0eSl9fVxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzY2FsYXInXCIgW25nU3dpdGNoXT1cInByb3BlcnR5UmV0dXJuVHlwZShwcm9wZXJ0eSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Jvb2xlYW4nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwicHJvcGVydHlWYWx1ZShwcm9wZXJ0eSlcIiBkaXNhYmxlZD1cImRpc2FibGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibnVtYmVyXCI+e3twcm9wZXJ0eUZvcm1hdHRlZFZhbHVlKHByb3BlcnR5KX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7cHJvcGVydHlGb3JtYXR0ZWRWYWx1ZShwcm9wZXJ0eSl9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG4iXX0=