UNPKG

sx-ng-aggrid

Version:
477 lines 75.1 kB
import * as tslib_1 from "tslib"; import { Component, ViewChild, Input } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Router, ActivatedRoute } from '@angular/router'; import { gridSequelizeFormatter } from './grid-sequelize'; import { GridValueFormatter as _GridValueFormatter } from './grid-value-formatter'; import { Papa } from 'ngx-papaparse'; export var GridFilterType; (function (GridFilterType) { GridFilterType["Text"] = "agTextColumnFilter"; GridFilterType["Date"] = "agDateColumnFilter"; GridFilterType["Number"] = "agNumberColumnFilter"; })(GridFilterType || (GridFilterType = {})); export const GridValueFormatter = _GridValueFormatter; let GridComponent = class GridComponent { constructor(http, route, router, papa) { this.http = http; this.route = route; this.router = router; this.papa = papa; this.gridSortModel = []; this.gridFilterModel = null; this.totalPageCount = 1; this.currentPageNumber = 1; this.pageRowCount = 100; this.totalRowCount = 0; this.isRowViewMode = false; this.rowViewDataId = null; this.rowViewData = []; this.gridOptions = { defaultColDef: { width: 120, filterParams: { caseSensitive: true, debounceMs: 1000, newRowsAction: 'keep' } }, enableServerSideFilter: true, enableServerSideSorting: true, enableFilter: true, enableSorting: true, enableColResize: true, rowSelection: 'single', onGridReady: () => { // If there is saved filter/sort // Then read & load to grid const savedFilterSort = this.loadLocalStorageData(); if (savedFilterSort && this.params.keepUserFilterSort) { this.gridFilterModel = savedFilterSort.gridFilterModel || undefined; this.gridSortModel = savedFilterSort.gridSortModel || []; this.currentPageNumber = savedFilterSort.currentPageNumber > 0 ? +savedFilterSort.currentPageNumber : 1; this.gridOptions.api.setSortModel(this.gridSortModel); this.gridOptions.api.setFilterModel(this.gridFilterModel); if (this.params.doNotUsePagination) this.refresh(); } else { this.refresh(); } }, onSortChanged: () => { this.gridSortModel = this.gridOptions.api.getSortModel(); if (!this.params.doNotUsePagination) this.refresh(); }, onFilterChanged: () => { this.gridFilterModel = this.gridOptions.api.getFilterModel(); if (!this.params.doNotUsePagination) { this.refresh(); } else { this.totalRowCount = this.gridOptions.api.getDisplayedRowCount(); } }, onRowDoubleClicked: (event) => { this.onButtonEdit(); } }; } ngOnInit() { if (this.params.doNotUsePagination) { this.pageRowCount = Number.MAX_SAFE_INTEGER; this.gridOptions.enableServerSideFilter = false; this.gridOptions.enableServerSideSorting = false; } } ngOnDestroy() { this.saveLocalStorageData(); } saveLocalStorageData() { if (!this.params.keepUserFilterSort) { return; } // On Destroy read & save filter/sort/currentPage info // We will load it when we are back localStorage.setItem(this.params.httpEndpoint, JSON.stringify({ gridFilterModel: this.gridFilterModel, gridSortModel: this.gridSortModel, currentPageNumber: this.currentPageNumber })); } loadLocalStorageData() { const str = localStorage.getItem(this.params.httpEndpoint); if (str) { return JSON.parse(str); } return null; } refresh(updateOnPosition) { if (!this.params.doNotUsePagination) { const params = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam, this.currentPageNumber, this.pageRowCount, this.gridSortModel, this.gridFilterModel); this.http .get(this.params.httpEndpoint + '/count', { params }) .subscribe((count) => { this.totalRowCount = count; this.totalPageCount = Math.ceil(this.totalRowCount / this.pageRowCount); // check currentPageNumber & offset if (this.currentPageNumber == 0 && this.totalPageCount > 0) { this.currentPageNumber = 1; } if (this.currentPageNumber > this.totalPageCount) { this.currentPageNumber = this.totalPageCount; params.offset = this.currentPageNumber > 0 ? (this.currentPageNumber - 1) * this.pageRowCount : 0; } this.http .get(this.params.httpEndpoint, { params }) .subscribe((rowData) => { if (updateOnPosition) { let displayedRowData = []; this.gridOptions.api.getModel().forEachNode((row) => { displayedRowData.push(row); }); if (rowData.length < displayedRowData.length) { for (let i = rowData.length; i < displayedRowData.length; i++) { this.gridOptions.api.updateRowData({ remove: [displayedRowData[i].data] }); } } else if (rowData.length > displayedRowData.length) { for (let i = displayedRowData.length; i < rowData.length; i++) { this.gridOptions.api.updateRowData({ add: [rowData[i]] }); } } rowData.map((data, index) => { let gridRow = this.gridOptions.api.getRowNode(index.toString()); if (gridRow) gridRow.setData(data); }); // setData filtreleme, sıralama gibi işlemlerdeki değişiklikleri yansıtacak şekilde güncellemiyor. // setData ile veri girişi yapıldıktan sonra tablodaki verilerin filtrelenmesini, sıralanmasını güncellemek için eklendi this.gridOptions.api.refreshClientSideRowModel('filter'); this.gridOptions.api.refreshClientSideRowModel('sort'); } else { this.gridOptions.api.setRowData(rowData); } this.gridOptions.api.sizeColumnsToFit(); }, (err) => { if (this.params.gridFunctions.logToConsole) { console.log(this.formatErrorMessage(err)); } else { alert(this.formatErrorMessage(err)); } }); }, (err) => { if (this.params.gridFunctions.logToConsole) { console.log(this.formatErrorMessage(err)); } else { alert(this.formatErrorMessage(err)); } }); } else { const params = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam); this.http .get(this.params.httpEndpoint, { params }) .subscribe((rowData) => { // Count this.totalPageCount = 1; this.currentPageNumber = 1; params.offset = 0; if (updateOnPosition) { let displayedRowData = []; this.gridOptions.api.getModel().forEachNode((row) => { displayedRowData.push(row); }); if (rowData.length < displayedRowData.length) { for (let i = rowData.length; i < displayedRowData.length; i++) { this.gridOptions.api.updateRowData({ remove: [displayedRowData[i].data] }); } } else if (rowData.length > displayedRowData.length) { for (let i = displayedRowData.length; i < rowData.length; i++) { this.gridOptions.api.updateRowData({ add: [rowData[i]] }); } } rowData.map((data, index) => { let gridRow = this.gridOptions.api.getRowNode(index.toString()); if (gridRow) gridRow.setData(data); }); // setData filtreleme, sıralama gibi işlemlerdeki değişiklikleri yansıtacak şekilde güncellemiyor. // setData ile veri girişi yapıldıktan sonra tablodaki verilerin filtrelenmesini, sıralanmasını güncellemek için eklendi this.gridOptions.api.refreshClientSideRowModel('filter'); this.gridOptions.api.refreshClientSideRowModel('sort'); } else { this.gridOptions.api.setRowData(rowData); } this.totalRowCount = this.gridOptions.api.getDisplayedRowCount(); this.gridOptions.api.sizeColumnsToFit(); }, (err) => { if (this.params.gridFunctions.logToConsole) { console.log(this.formatErrorMessage(err)); } else { alert(this.formatErrorMessage(err)); } }); } } onButtonAdd() { if (!this.params.gridFunctions.canAdd || !this.params.gridFunctions.addBaseUrl) { return; } this.saveLocalStorageData(); this.router.navigate([`${this.params.gridFunctions.addBaseUrl}/0`], { queryParams: { returnUrl: this.router.url } }); } onButtonEdit() { if (!this.params.gridFunctions.canEdit || !this.params.gridFunctions.editBaseUrl) { return this.onButtonView(); } const selRow = this.gridOptions.api.getSelectedRows()[0]; if (!selRow) { return; } this.saveLocalStorageData(); this.router.navigate([`${this.params.gridFunctions.editBaseUrl}/${selRow[this.params.idColName || 'id']}`], { queryParams: { returnUrl: this.router.url } }); } onButtonCopy() { if (!this.params.gridFunctions.canCopy || !this.params.gridFunctions.addBaseUrl) { return this.onButtonView(); } const selRow = this.gridOptions.api.getSelectedRows()[0]; if (!selRow) { return; } this.router.navigate([`${this.params.gridFunctions.addBaseUrl}/0`], { queryParams: selRow }); } onButtonDelete() { if (!this.params.gridFunctions.canDelete) { return; } const selRow = this.gridOptions.api.getSelectedRows()[0]; if (!selRow) { return; } if (confirm('Delete?')) { this.http .delete(this.params.httpEndpoint + '/' + selRow[this.params.idColName || 'id']) .subscribe((result) => { this.refresh(); }, (err) => { alert(this.formatErrorMessage(err)); }); } } onButtonBackward() { if (this.currentPageNumber <= 1) { return; } this.currentPageNumber = 1; this.refresh(); } onButtonForward() { if (this.currentPageNumber >= this.totalPageCount) { return; } this.currentPageNumber = this.totalPageCount; this.refresh(); } onButtonNext() { if (this.currentPageNumber >= this.totalPageCount) { return; } this.currentPageNumber = this.currentPageNumber + 1; this.refresh(); } onButtonPrevious() { if (this.currentPageNumber <= 1) { return; } this.currentPageNumber = this.currentPageNumber - 1; this.refresh(); } onButtonRefresh() { this.refresh(true); } formatErrorMessage(error) { console.error(error); let errMsg = 'Unknown Error'; if (error && error.error && error.error.error && error.error.error.message) { errMsg = error.error.error.message; } else { if (error && error.error && error.error.message) { errMsg = error.error.message; } else { if (error && error.message) { errMsg = error.message; } } } return errMsg; } onButtonView() { const selRow = this.gridOptions.api.getSelectedRows()[0]; if (!selRow) { return; } this.rowViewData = []; this.gridOptions.columnDefs.forEach((column) => { this.rowViewData.push({ headerName: column.headerName, value: column.valueFormatter ? column.valueFormatter({ value: getObjectValueWithDotNotation(selRow, column.field) }) : getObjectValueWithDotNotation(selRow, column.field) }); }); this.saveLocalStorageData(); this.rowViewDataId = selRow[this.params.idColName || 'id']; this.isRowViewMode = true; } onButtonViewCancel() { this.isRowViewMode = false; } onButtonViewEdit() { if (!this.params.gridFunctions.canEdit || !this.params.gridFunctions.editBaseUrl) { return; } this.saveLocalStorageData(); this.router.navigate([`${this.params.gridFunctions.editBaseUrl}/${this.rowViewDataId}`], { queryParams: { returnUrl: this.router.url } }); } onButtonImportCSV($event) { if (!this.params.gridFunctions.canImport) { return; } const files = $event.srcElement.files; const reader = new FileReader(); reader.onload = () => { this.csvData = reader.result; this.papa.parse(this.csvData, { header: true, delimiter: ';', skipEmptyLines: true, complete: (results) => { this.http .post(this.params.httpEndpoint + '/createBulk', results.data) .subscribe((result) => { this.fileImput.nativeElement.value = ''; this.refresh(); }, (err) => { this.fileImput.nativeElement.value = ''; alert(this.formatErrorMessage(err)); }); } }); }; reader.readAsText(files[0]); } onButtonExport() { if (this.params.gridFunctions.exportFromServerSide) { this.http .get(this.params.httpEndpoint + '/export', { observe: 'response', responseType: 'arraybuffer' }) .subscribe((data) => { const fileName = data.headers.get('Content-Filename'); downloadFile(data.body, fileName, 'application/gzip', '.zip'); }, (err) => { alert(this.formatErrorMessage(err)); }); } else { const params = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam, 0, 1000 * 1000 * 1000, // Allow max record this.gridSortModel, this.gridFilterModel); this.http .get(this.params.httpEndpoint, { params }) .subscribe((rowData) => { let csvData; this.gridOptions.columnDefs.forEach((column) => { if (this.params.exportFields && this.params.exportFields.indexOf(column.field) < 0) { return; } if (csvData) { csvData = `${csvData};"${column.field}"`; } else { csvData = `"${column.field}"`; } }); csvData += '\r\n'; // Add rows for (let i = 0; i < rowData.length; i++) { for (let j = 0; j < this.gridOptions.columnDefs.length; j++) { const column = this.gridOptions.columnDefs[j]; if (this.params.exportFields && this.params.exportFields.indexOf(column.field) < 0) { continue; } let value = column.valueFormatter ? column.valueFormatter({ value: getObjectValueWithDotNotation(rowData[i], column.field) }) : getObjectValueWithDotNotation(rowData[i], column.field); if (typeof value === 'string') { value = value.replace(/\/\r|\n/gi, ''); } if (j === 0) { csvData = `${csvData}"${value ? value : ''}"`; } else { csvData = `${csvData};"${value ? value : ''}"`; } } csvData += '\r\n'; } downloadFile(csvData, 'Export_Grid', 'text/csv', '.csv'); }, (err) => { alert(this.formatErrorMessage(err)); }); } } }; GridComponent.ctorParameters = () => [ { type: HttpClient }, { type: ActivatedRoute }, { type: Router }, { type: Papa } ]; tslib_1.__decorate([ Input() ], GridComponent.prototype, "params", void 0); tslib_1.__decorate([ ViewChild('agGrid', { static: false }) ], GridComponent.prototype, "agGrid", void 0); tslib_1.__decorate([ ViewChild('fileImput', { static: false }) ], GridComponent.prototype, "fileImput", void 0); GridComponent = tslib_1.__decorate([ Component({ // tslint:disable-next-line: component-selector selector: 'sx-ng-aggrid', template: "<!-- Grid View -->\n<div *ngIf=\"!isRowViewMode\" style=\"width: 100%; height: 100%;\" class=\"container-fluid sx-ng-aggrid-main\">\n <div style=\"width: 100%;min-height:42px\" class=\" sx-ng-aggrid-toolbar\" *ngIf=\"!params?.hideToolbar\">\n <div class=\"row\">\n <div class=\"col-md-5 mb-1\">\n <div class=\"btn-toolbar\" role=\"toolbar\">\n <div class=\"btn-group mr-2 me-2\" role=\"group\">\n <button *ngIf=\"!params?.gridFunctions?.hideView\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonView()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"View Record\">\n <i class=\"fa fa-search-plus\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canAdd\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonAdd()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Add...\">\n <i class=\"fa fa-plus\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canEdit\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonEdit()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Edit...\">\n <i class=\"fa fa-edit\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canCopy\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonCopy()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Copy...\">\n <i class=\"far fa-copy\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canDelete\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonDelete()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Delete...\">\n <i class=\"fa fa-times\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canImport\" type=\"button\" class=\"btn btn-secondary import\"\n data-toggle=\"tooltip\" data-placement=\"top\" title=\"Import\">\n <label for=\"customFile\" class=\"m-0\"><i class=\"fas fa-upload\"></i></label>\n <input #fileImput type=\"file\" class=\"custom-file-input d-none\" id=\"customFile\" accept=\".csv\"\n (change)=\"onButtonImportCSV($event)\">\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonExport()\" data-toggle=\"tooltip\"\n data-placement=\"top\" title=\"Export\">\n <i class=\"fa fa-download\">&nbsp;</i>\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonRefresh()\"\n data-toggle=\"tooltip\" data-placement=\"top\" title=\"Refresh\">\n <i class=\"fa fa-undo\">&nbsp;</i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-md-2 mb-1 text-center\">\n <button type=\"button\" class=\"btn btn-light count-btn\" disabled>\n <i class=\"fa fa-database\"></i>: {{totalRowCount}}\n </button>\n </div>\n <div class=\"mb-1\"\n [ngClass]=\"!params?.doNotUsePagination ? 'col-md-1' : 'col-md-5 ms-auto ml-auto text-right'\">\n <ng-content select=\"[extra-buttons]\"></ng-content>\n </div>\n <div class=\"col-md-4 mb-1 pagination\" *ngIf=\"!params?.doNotUsePagination\">\n <div class=\"btn-group ms-auto ml-auto\" role=\"group\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonBackward()\">\n <i class=\"fa fa-backward\"></i>&nbsp;\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonPrevious()\">\n <i class=\"fa fa-caret-left\"></i>&nbsp;&nbsp;&nbsp;&nbsp;\n </button>\n <button type=\"button\" class=\"btn btn-light\" disabled>{{' '+currentPageNumber+' / '+totalPageCount+'\n '}}</button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonNext()\">\n &nbsp;&nbsp;&nbsp;&nbsp;<i class=\"fa fa-caret-right\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonForward()\">\n &nbsp;<i class=\"fa fa-forward\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div style=\"width: 100%; height: 100%;\" class=\"sx-ng-aggrid-toolbar\">\n <ag-grid-angular #agGrid style=\"width: 100%; height: 100%;\" class=\"ag-theme-fresh\" [rowData]=\"rowData\"\n [columnDefs]=\"params?.columnDefs\" [gridOptions]=\"gridOptions\"></ag-grid-angular>\n </div>\n</div>\n\n<!-- Row View -->\n<div *ngIf=\"isRowViewMode\" class=\"container-fluid\">\n <div class=\"row\">\n <div class=\"col-md-8 mb-1\">\n <h3>Details\n <span class=\"float-right float-end\">\n <button *ngIf=\"params?.gridFunctions?.canEdit\" type=\"button\" class=\"btn btn-primary\"\n (click)=\"onButtonViewEdit()\">\n &nbsp;&nbsp;\n <i class=\"fa fa-edit\"></i>&nbsp;&nbsp;\n </button>&nbsp;\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonViewCancel()\">\n &nbsp;&nbsp;\n <i class=\"fa fa-arrow-circle-left\"></i>&nbsp;&nbsp;\n </button>\n </span>\n </h3>\n <hr style=\"border-top: 1px solid black;\" />\n\n <div class=\"form-group mb-3\" *ngFor=\"let field of rowViewData\">\n <label class=\"mb-2\">{{field.headerName}}</label>\n <input class=\"form-control\" [value]=\"field.value\" disabled>\n </div>\n </div>\n </div>\n</div>", styles: ["@media only screen and (max-width:767px){.btn-toolbar>.btn-group.mr-2{width:100%;margin-right:0!important}.count-btn{width:100%}.pagination{display:-ms-grid;display:grid;padding:0 15px}.pagination>.btn-group{margin:auto 0!important}}.import{min-width:42px;padding:0}.import>label{width:100%;height:100%;position:absolute;top:0;left:0;line-height:36px;cursor:pointer}.fa-file-archive::before{content:'\\f1c6'}"] }) ], GridComponent); export { GridComponent }; /** * Helper Functions */ function getObjectValueWithDotNotation(object, keys) { return keys.split('.').reduce(function (o, k) { return (o || {})[k]; }, object); } function downloadFile(data, filename, fileType, fileExtention) { const htmlElement = document.createElement('a'); htmlElement.setAttribute('style', 'display:none;'); document.body.appendChild(htmlElement); const blob = new Blob([data], { type: fileType }); const url = window.URL.createObjectURL(blob); htmlElement.href = url; const isIE = /*@cc_on!@*/ false || !!document.documentMode; if (isIE) { const retVal = navigator.msSaveBlob(blob, filename + fileExtention); } else { htmlElement.download = filename + fileExtention; } htmlElement.click(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zeC1uZy1hZ2dyaWQvIiwic291cmNlcyI6WyJzcmMvYXBwL21vZHVsZXMvZ3JpZC9ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsS0FBSyxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQUczRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLElBQUksbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE1BQU0sQ0FBTixJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIsNkNBQTJCLENBQUE7SUFDM0IsNkNBQTJCLENBQUE7SUFDM0IsaURBQStCLENBQUE7QUFDakMsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFpQ3RELElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFzQnhCLFlBQ1UsSUFBZ0IsRUFDaEIsS0FBcUIsRUFDckIsTUFBYyxFQUNkLElBQVU7UUFIVixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxTQUFJLEdBQUosSUFBSSxDQUFNO1FBcEJwQixrQkFBYSxHQUFpQixFQUFFLENBQUM7UUFDakMsb0JBQWUsR0FBaUIsSUFBSSxDQUFDO1FBQ3JDLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FB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LEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUEwQixFQUFFLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxhQUFxQjtJQUN6RyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ25ELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXZDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxXQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUV2QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUEsS0FBSyxJQUFJLENBQUMsQ0FBRSxRQUFnQixDQUFDLFlBQVksQ0FBQztJQUVuRSxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsR0FBRyxhQUFhLENBQUMsQ0FBQztLQUNyRTtTQUFNO1FBQ0wsV0FBVyxDQUFDLFFBQVEsR0FBRyxRQUFRLEdBQUcsYUFBYSxDQUFDO0tBQ2pEO0lBRUQsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBJbnB1dCwgT25EZXN0cm95LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHcmlkT3B0aW9ucyB9IGZyb20gJ2FnLWdyaWQnO1xuaW1wb3J0IHsgQWdHcmlkTmcyLCBBZ0dyaWRDb2x1bW4gfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5nd