UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

162 lines 21.7 kB
import { Component, Input } from '@angular/core'; import { DataSource } from '@angular/cdk/table'; import { Observable, Subject, combineLatest } from 'rxjs'; import { debug } from '../../debug'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/material/table"; import * as i3 from "@angular/cdk/table"; export class MonitoringTableComponent { set columnsMap(mapping) { if (mapping) { if (!this.columns) { this.setupColumns(); } for (const key in mapping) { if (!this.columns?.find((info) => info.columnDef === key)) { debug('Column ', key, 'is not in columns', this.columns); this.addColumn(key, mapping[key]); } } // Removing old columns const toRemove = []; this.columns?.forEach((column, index) => { if (!(column.columnDef in mapping)) { debug('Deleting column: ', column); toRemove.push(index); } }); toRemove.reverse().forEach((index) => this.columns?.splice(index, 1)); // debug(`COLUMNS:`, this.columns) this.displayedColumns = this.columns?.map((x) => x.columnDef); // refresh data this.dataSource.refresh(); } } set variables(variables) { combineLatest(variables.map((variable) => variable.values)).subscribe((values) => { if (this.columns) { const item = {}; this.columns.forEach((column, index) => { if (column.columnDef === '__date') { item[column.columnDef] = new Date().toLocaleTimeString(); } else { item[column.columnDef] = values[index - (this.date ? 1 : 0)]; } }); this.dataSource.add(item); } }); } set data$(stream) { if (stream) { stream.subscribe((value) => { if (this.columns) { this.dataSource.add(value); } }); } } set data(data) { debug('Setting table data: ', data); this.dataSource.data = data; } constructor() { /** Table columns */ this.columns = undefined; this.dataSource = new MonitoringTableComponentDataSource(); /** Column definitions in order */ this.displayedColumns = []; this.date = true; } setupColumns() { debug('setupColumns'); if (this.columns) { this.columns.splice(0, this.columns.length); } else { this.columns = []; } if (this.date) { this.addColumn('__date', 'Date'); } } addColumn(id, header) { if (!this.columns) { this.columns = []; } const columnInfo = { header: header, columnDef: id, cell: (row) => `${row[id]}`, }; this.columns.push(columnInfo); } } /** @nocollapse */ MonitoringTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MonitoringTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ MonitoringTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: MonitoringTableComponent, selector: "tap-app-monitoring-table", inputs: { columns: "columns", dataSource: "dataSource", columnsMap: "columnsMap", displayedColumns: "displayedColumns", variables: "variables", data$: "data$", data: "data", date: "date" }, ngImport: i0, template: "<mat-table\n *ngIf=\"columns && columns.length > 0\"\n [dataSource]=\"dataSource\"\n #table\n>\n <ng-container\n *ngFor=\"let column of columns\"\n [cdkColumnDef]=\"column.columnDef\"\n >\n <mat-header-cell *cdkHeaderCellDef>{{ column.header }}</mat-header-cell>\n <mat-cell *cdkCellDef=\"let row\">{{ column.cell(row) }}</mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n</mat-table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i3.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i3.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i3.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["sticky", "cdkColumnDef", "stickyEnd"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MonitoringTableComponent, decorators: [{ type: Component, args: [{ selector: 'tap-app-monitoring-table', template: "<mat-table\n *ngIf=\"columns && columns.length > 0\"\n [dataSource]=\"dataSource\"\n #table\n>\n <ng-container\n *ngFor=\"let column of columns\"\n [cdkColumnDef]=\"column.columnDef\"\n >\n <mat-header-cell *cdkHeaderCellDef>{{ column.header }}</mat-header-cell>\n <mat-cell *cdkCellDef=\"let row\">{{ column.cell(row) }}</mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n</mat-table>\n" }] }], ctorParameters: function () { return []; }, propDecorators: { columns: [{ type: Input }], dataSource: [{ type: Input }], columnsMap: [{ type: Input }], displayedColumns: [{ type: Input }], variables: [{ type: Input }], data$: [{ type: Input }], data: [{ type: Input }], date: [{ type: Input }] } }); export class MonitoringTableComponentDataSource extends DataSource { constructor(options = { max: -1, newItemOnTop: true, }) { super(); this.options = options; this._data = []; this._subject = new Subject(); } add(item) { if (this.options.newItemOnTop) { this._data.unshift(item); if (this.options.max >= 0 && this._data.length > this.options.max) { this._data.pop(); } } else { this._data.push(item); if (this.options.max >= 0 && this._data.length > this.options.max) { this._data.shift(); } } this._subject.next(this._data); // debug(`Adding values: `, item) } set data(d) { this._data = d; this._subject.next(this._data); } connect() { return this._subject; } refresh() { this._data = [...this._data]; this._subject.next(this._data); } disconnect() { } clear() { this._data = []; this._subject.next(this._data); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvbW9uaXRvcmluZy10YWJsZS9tb25pdG9yaW5nLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy9tb25pdG9yaW5nLXRhYmxlL21vbml0b3JpbmctdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQWtCcEMsTUFBTSxPQUFPLHdCQUF3QjtJQU1uQyxJQUFhLFVBQVUsQ0FBQyxPQUFrQztRQUN4RCxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNqQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDckI7WUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRTtnQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUN6RCxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxJQUFJ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QyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsVUFBVSxLQUFJLENBQUM7SUFFZixLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQWJzdHJhY3RWYXJpYWJsZSB9IGZyb20gJ0Bpb3RpemUvdGFwL2RhdGEnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuLi8uLi9kZWJ1Zyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVEYXRhRW50cnkge1xuICBfX2RhdGU/OiBudW1iZXI7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbHVtblR5cGUge1xuICBoZWFkZXI6IHN0cmluZztcbiAgY29sdW1uRGVmOiBzdHJpbmc7XG4gIGNlbGw6IChyb3c6IGFueSkgPT4gc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXAtYXBwLW1vbml0b3JpbmctdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9uaXRvcmluZy10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21vbml0b3JpbmctdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTW9uaXRvcmluZ1RhYmxlQ29tcG9uZW50IHtcbiAgLyoqIFRhYmxlIGNvbHVtbnMgKi9cbiAgQElucHV0KCkgY29sdW1ucz86IFRhYmxlQ29sdW1uVHlwZVtdID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2UgPSBuZXcgTW9uaXRvcmluZ1RhYmxlQ29tcG9uZW50RGF0YVNvdXJjZSgpO1xuXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5zTWFwKG1hcHBpbmc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAobWFwcGluZykge1xuICAgICAgaWYgKCF0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbnM/LmZpbmQoKGluZm8pID0+IGluZm8uY29sdW1uRGVmID09PSBrZXkpKSB7XG4gICAgICAgICAgZGVidWcoJ0NvbHVtbiAnLCBrZXksICdpcyBub3QgaW4gY29sdW1ucycsIHRoaXMuY29sdW1ucyk7XG4gICAgICAgICAgdGhpcy5hZGRDb2x1bW4oa2V5LCBtYXBwaW5nW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmluZyBvbGQgY29sdW1uc1xuICAgICAgY29uc3QgdG9SZW1vdmU6IG51bWJlcltdID0gW107XG4gICAgICB0aGlzLmNvbHVtbnM/LmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKCEoY29sdW1uLmNvbHVtbkRlZiBpbiBtYXBwaW5nKSkge1xuICAgICAgICAgIGRlYnVnKCdEZWxldGluZyBjb2x1bW46ICcsIGNvbHVtbik7XG4gICAgICAgICAgdG9SZW1vdmUucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdG9SZW1vdmUucmV2ZXJzZSgpLmZvckVhY2goKGluZGV4KSA9PiB0aGlzLmNvbHVtbnM/LnNwbGljZShpbmRleCwgMSkpO1xuICAgICAgLy8gZGVidWcoYENPTFVNTlM6YCwgdGhpcy5jb2x1bW5zKVxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zPy5tYXAoKHgpID0+IHguY29sdW1uRGVmKTtcblxuICAgICAgLy8gcmVmcmVzaCBkYXRhXG4gICAgICB0aGlzLmRhdGFTb3VyY2UucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDb2x1bW4gZGVmaW5pdGlvbnMgaW4gb3JkZXIgKi9cbiAgQElucHV0KCkgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBbXTtcblxuICBASW5wdXQoKSBzZXQgdmFyaWFibGVzKHZhcmlhYmxlczogQWJzdHJhY3RWYXJpYWJsZTxhbnk+W10pIHtcbiAgICBjb21iaW5lTGF0ZXN0KHZhcmlhYmxlcy5tYXAoKHZhcmlhYmxlKSA9PiB2YXJpYWJsZS52YWx1ZXMpKS5zdWJzY3JpYmUoXG4gICAgICAodmFsdWVzKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCBpdGVtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5jb2x1bW5EZWYgPT09ICdfX2RhdGUnKSB7XG4gICAgICAgICAgICAgIGl0ZW1bY29sdW1uLmNvbHVtbkRlZl0gPSBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaXRlbVtjb2x1bW4uY29sdW1uRGVmXSA9IHZhbHVlc1tpbmRleCAtICh0aGlzLmRhdGUgPyAxIDogMCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5hZGQoaXRlbSBhcyBUYWJsZURhdGFFbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRhdGEkKHN0cmVhbTogT2JzZXJ2YWJsZTxhbnk+KSB7XG4gICAgaWYgKHN0cmVhbSkge1xuICAgICAgc3RyZWFtLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGF0YShkYXRhOiBUYWJsZURhdGFFbnRyeVtdKSB7XG4gICAgZGVidWcoJ1NldHRpbmcgdGFibGUgZGF0YTogJywgZGF0YSk7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgQElucHV0KCkgZGF0ZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHByaXZhdGUgc2V0dXBDb2x1bW5zKCkge1xuICAgIGRlYnVnKCdzZXR1cENvbHVtbnMnKTtcbiAgICBpZiAodGhpcy5jb2x1bW5zKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKDAsIHRoaXMuY29sdW1ucy5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0ZSkge1xuICAgICAgdGhpcy5hZGRDb2x1bW4oJ19fZGF0ZScsICdEYXRlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb2x1bW4oaWQ6IHN0cmluZywgaGVhZGVyOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghdGhpcy5jb2x1bW5zKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uSW5mbyA9IHtcbiAgICAgIGhlYWRlcjogaGVhZGVyLFxuICAgICAgY29sdW1uRGVmOiBpZCxcbiAgICAgIGNlbGw6IChyb3c6IGFueSkgPT4gYCR7cm93W2lkXX1gLFxuICAgIH07XG4gICAgdGhpcy5jb2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vbml0b3JpbmdUYWJsZUNvbXBvbmVudERhdGFTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlPFRhYmxlRGF0YUVudHJ5PiB7XG4gIF9kYXRhOiBUYWJsZURhdGFFbnRyeVtdID0gW107XG5cbiAgcHJpdmF0ZSBfc3ViamVjdCA9IG5ldyBTdWJqZWN0PFRhYmxlRGF0YUVudHJ5W10+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9wdGlvbnM6IHtcbiAgICAgIG1heDogbnVtYmVyO1xuICAgICAgbmV3SXRlbU9uVG9wOiBib29sZWFuO1xuICAgIH0gPSB7XG4gICAgICBtYXg6IC0xLFxuICAgICAgbmV3SXRlbU9uVG9wOiB0cnVlLFxuICAgIH1cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGFkZChpdGVtOiBUYWJsZURhdGFFbnRyeSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubmV3SXRlbU9uVG9wKSB7XG4gICAgICB0aGlzLl9kYXRhLnVuc2hpZnQoaXRlbSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1heCA+PSAwICYmIHRoaXMuX2RhdGEubGVuZ3RoID4gdGhpcy5vcHRpb25zLm1heCkge1xuICAgICAgICB0aGlzLl9kYXRhLnBvcCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhLnB1c2goaXRlbSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1heCA+PSAwICYmIHRoaXMuX2RhdGEubGVuZ3RoID4gdGhpcy5vcHRpb25zLm1heCkge1xuICAgICAgICB0aGlzLl9kYXRhLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3N1YmplY3QubmV4dCh0aGlzLl9kYXRhKTtcbiAgICAvLyBkZWJ1ZyhgQWRkaW5nIHZhbHVlczogYCwgaXRlbSlcbiAgfVxuXG4gIHNldCBkYXRhKGQ6IFRhYmxlRGF0YUVudHJ5W10pIHtcbiAgICB0aGlzLl9kYXRhID0gZDtcbiAgICB0aGlzLl9zdWJqZWN0Lm5leHQodGhpcy5fZGF0YSk7XG4gIH1cblxuICBjb25uZWN0KCk6IE9ic2VydmFibGU8VGFibGVEYXRhRW50cnlbXT4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJqZWN0O1xuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLl9kYXRhID0gWy4uLnRoaXMuX2RhdGFdO1xuICAgIHRoaXMuX3N1YmplY3QubmV4dCh0aGlzLl9kYXRhKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKSB7fVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuX2RhdGEgPSBbXTtcbiAgICB0aGlzLl9zdWJqZWN0Lm5leHQodGhpcy5fZGF0YSk7XG4gIH1cbn1cbiIsIjxtYXQtdGFibGVcbiAgKm5nSWY9XCJjb2x1bW5zICYmIGNvbHVtbnMubGVuZ3RoID4gMFwiXG4gIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAjdGFibGVcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiXG4gICAgW2Nka0NvbHVtbkRlZl09XCJjb2x1bW4uY29sdW1uRGVmXCJcbiAgPlxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKmNka0hlYWRlckNlbGxEZWY+e3sgY29sdW1uLmhlYWRlciB9fTwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDxtYXQtY2VsbCAqY2RrQ2VsbERlZj1cImxldCByb3dcIj57eyBjb2x1bW4uY2VsbChyb3cpIH19PC9tYXQtY2VsbD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC9tYXQtaGVhZGVyLXJvdz5cbiAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L21hdC1yb3c+XG48L21hdC10YWJsZT5cbiJdfQ==