ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
714 lines • 112 kB
JavaScript
import { DataSource } from '@angular/cdk/collections';
import { EventEmitter } from '@angular/core';
import { BehaviorSubject, merge, Subject, Subscription } from 'rxjs';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { ColumnValueFilterOperator } from '../../../types/table/o-column-value-filter.type';
import { Codes } from '../../../util/codes';
import { Util } from '../../../util/util';
import { OTableGroupedRow } from './row/o-table-row-group.class';
export class OnRangeChangeVirtualScroll {
constructor(data) {
this.range = data;
}
}
export class DefaultOTableDataSource extends DataSource {
get data() { return this.dataTotalsChange.value; }
get quickFilter() { return this._quickFilterChange.value || ''; }
set quickFilter(filter) {
this._quickFilterChange.next(filter);
}
constructor(table) {
super();
this.table = table;
this.dataTotalsChange = new BehaviorSubject([]);
this._virtualPageChange = new BehaviorSubject(new OnRangeChangeVirtualScroll({ start: 0, end: 0 }));
this._quickFilterChange = new BehaviorSubject('');
this._columnValueFilterChange = new BehaviorSubject(null);
this.groupByColumnChange = new Subject;
this.filteredData = [];
this.aggregateData = {};
this.onRenderedDataChange = new EventEmitter();
this._renderedData = [];
this.resultsLength = 0;
this.columnValueFilters = [];
this.groupedRowState = [];
this.activeAggregates = {};
this.groupedRowsSubscription = new Subscription();
this.levelsExpansionState = {};
this._database = table.daoTable;
if (this._database) {
this.resultsLength = this._database.data.length;
}
if (table.paginator) {
this._paginator = table.matpaginator;
}
if (this.table.virtualScrollViewport) {
this.table.virtualScrollViewport.renderedRangeStream
.pipe(distinctUntilChanged())
.subscribe((value) => {
this._virtualPageChange.next(new OnRangeChangeVirtualScroll(value));
});
}
this._tableOptions = table.oTableOptions;
this._sort = table.sort;
}
sortFunction(a, b) {
return this._sort.sortFunction(a, b);
}
get renderedData() {
return this._renderedData;
}
set renderedData(arg) {
this._renderedData = arg;
this.onRenderedDataChange.emit();
}
connect() {
const displayDataChanges = [
this._database.dataChange
];
if (!this.table.pageable) {
if (this._sort) {
displayDataChanges.push(this._sort.oSortChange);
}
if (this._tableOptions.filter) {
displayDataChanges.push(this._quickFilterChange);
}
if (this._paginator) {
displayDataChanges.push(this._paginator.page);
}
}
if (this.table.virtualScrollViewport) {
displayDataChanges.push(this._virtualPageChange);
}
displayDataChanges.push(this._columnValueFilterChange);
if (this.table.groupable) {
displayDataChanges.push(this.groupByColumnChange);
}
return merge(...displayDataChanges).pipe(map((x) => {
let data = Object.assign([], this._database.data);
if (x instanceof OnRangeChangeVirtualScroll) {
data = this.getVirtualScrollData(this.renderedData, x);
}
else {
if (Array.isArray(data) && data.length > 0) {
if (this.existsAnyCalculatedColumn()) {
data = this.getColumnCalculatedData(data);
}
if (!this.table.pageable) {
data = this.getColumnValueFilterData(data);
data = this.getQuickFilterData(data);
data = this.getSortedData(data);
}
}
this.filteredData = Object.assign([], data);
if (this.table.pageable) {
const totalRecordsNumber = this.table.getTotalRecordsNumber();
this.resultsLength = totalRecordsNumber !== undefined ? totalRecordsNumber : data.length;
}
else {
this.resultsLength = data.length;
data = this.getPaginationData(data);
}
if (this.table.groupable && !Util.isArrayEmpty(this.table.groupedColumnsArray) && data.length > 0) {
data = this.getGroupedData(data);
}
this.renderedData = data;
if (this.table.virtualScrollViewport && !this._paginator) {
data = this.getVirtualScrollData(data, new OnRangeChangeVirtualScroll({ start: 0, end: Codes.LIMIT_SCROLLVIRTUAL }));
}
this.aggregateData = this.getAggregatesData(this.renderedData);
}
return data;
}));
}
getGroupedData(data) {
data = this.getSubGroupsOfGroupedRow(data);
data = this.filterCollapsedRowGroup(data);
return data;
}
getSubGroupsOfGroupedRow(data) {
return data = this.getSublevel(data, 0);
}
getAggregatesData(data) {
const obj = {};
if (typeof this._tableOptions === 'undefined') {
return obj;
}
this._tableOptions.columns.forEach((column) => {
let totalValue = '';
if (column.aggregate && column.visible) {
totalValue = this.calculateAggregate(data, column.attr, column.aggregate.operator);
}
const key = column.attr;
obj[key] = totalValue;
});
return obj;
}
getColumnCalculatedData(data) {
const self = this;
const calculatedCols = this._tableOptions.columns.filter((oCol) => oCol.visible && oCol.calculate !== undefined);
return data.map((row) => {
calculatedCols.forEach((oColumn) => {
let value;
if (typeof oColumn.calculate === 'string') {
value = self.transformFormula(oColumn.calculate, row);
}
else if (typeof oColumn.calculate === 'function') {
value = oColumn.calculate(row);
}
row[oColumn.attr] = isNaN(value) ? 0 : value;
});
return row;
});
}
transformFormula(formulaArg, row) {
let formula = formulaArg;
const columnsAttr = this._tableOptions.columns.map((oCol) => oCol.attr);
columnsAttr.forEach((column) => {
formula = formula.replace(column, row[column]);
});
let resultFormula = '';
try {
resultFormula = (new Function('return ' + formula))();
}
catch (e) {
console.error('Operation defined in the calculated column is incorrect ');
}
return resultFormula;
}
getQuickFilterData(data) {
if (Util.isDefined(this.quickFilter) && this.quickFilter.length > 0) {
const filterData = !this._tableOptions.filterCaseSensitive ? this.quickFilter.toLowerCase() : this.quickFilter;
return data.filter((item) => {
const passCustomFilter = this.fulfillsCustomFilterFunctions(filterData, item);
const passSearchString = this.fulfillsQuickfilter(filterData, item);
return passCustomFilter || passSearchString;
});
}
else {
return data;
}
}
getPaginationData(data) {
if (!this._paginator || isNaN(this._paginator.pageSize)) {
return data;
}
let startIndex = isNaN(this._paginator.pageSize) ? 0 : this._paginator.pageIndex * this._paginator.pageSize;
if (data.length > 0 && data.length < startIndex) {
startIndex = 0;
this._paginator.pageIndex = 0;
}
return data.splice(startIndex, this._paginator.pageSize);
}
getVirtualScrollData(data, x) {
return data.slice(x.range.start, x.range.end);
}
disconnect() {
this.dataTotalsChange.complete();
this._quickFilterChange.complete();
this._columnValueFilterChange.complete();
this.groupByColumnChange.complete();
this._virtualPageChange.complete();
}
fulfillsCustomFilterFunctions(filter, item) {
const customFilterCols = this.table.oTableOptions.columns.filter(oCol => oCol.useCustomFilterFunction());
return customFilterCols.some(oCol => oCol.renderer.filterFunction(item[oCol.attr], item, filter));
}
fulfillsQuickfilter(filter, item) {
const columns = this._tableOptions.columns.filter((oCol) => oCol.useQuickfilterFunction());
let searchStr = columns.map((oCol) => oCol.getFilterValue(item[oCol.attr], item).join(' ')).join(' ');
if (!this._tableOptions.filterCaseSensitive) {
searchStr = searchStr.toLowerCase();
}
return searchStr.indexOf(filter) !== -1;
}
getSortedData(data) {
if (!this._sort)
return data;
const rendererData = this.getDataToSort(data);
const sortedData = this._sort.getSortedData(rendererData);
const tableKeys = this.table.getKeys();
const originalDataSorted = [];
sortedData.forEach(sortedElement => {
const keysValuesInSortData = tableKeys.map(element => sortedElement[element]);
let i = 0;
let found = false;
while (i < data.length && !found) {
const keysValuesInData = tableKeys.map(element => data[i][element]);
if (Util.isArrayEqual(keysValuesInSortData, keysValuesInData)) {
originalDataSorted.push(data[i]);
found = true;
}
i++;
}
});
this.table.updateSortingSubject(false);
return originalDataSorted;
}
getTableData() {
return this._database.data;
}
getCurrentData() {
return this.getData();
}
getCurrentAllData() {
return this.getAllData(false, false);
}
getCurrentRendererData() {
return this.getRenderedData(this.renderedData);
}
getAllRendererData() {
return this.getAllData(true, true);
}
get sqlTypes() {
return this._database.sqlTypes;
}
getData() {
return this.renderedData;
}
getRenderedData(data) {
const visibleColumns = this._tableOptions.columns.filter(oCol => oCol.visible);
return data.map((row) => {
const obj = {};
visibleColumns.forEach((oCol) => {
const useRenderer = oCol.renderer && oCol.renderer.getCellData;
obj[oCol.attr] = useRenderer ? oCol.renderer.getCellData(row[oCol.attr], row) : row[oCol.attr];
});
return obj;
});
}
getDataToSort(data) {
if (!this._sort)
return data;
const sortColumns = this._tableOptions.columns.filter(oCol => oCol.visible && this._sort.activeArray.map(x => x.id).indexOf(oCol.attr) > -1);
const existColumnToTrasformToSort = sortColumns.filter((oCol) => (oCol.type === 'translate' || oCol.type === 'service')).length > 0;
if (!existColumnToTrasformToSort) {
return data;
}
this.table.getKeys().forEach(key => {
sortColumns.push(this.table.getOColumn(key));
});
return data.map((row) => {
const obj = {};
sortColumns.forEach((oCol) => {
const useRenderer = oCol.renderer && (oCol.type === 'translate' || oCol.type === 'service') && oCol.renderer.getCellData;
obj[oCol.attr] = useRenderer ? oCol.renderer.getCellData(row[oCol.attr], row) : row[oCol.attr];
});
return obj;
});
}
getAllData(usingRendererers, onlyVisibleColumns) {
let tableColumns = this._tableOptions.columns;
if (onlyVisibleColumns) {
tableColumns = this._tableOptions.columns.filter(oCol => oCol.visible);
}
return this.filteredData.map((row) => {
const obj = {};
tableColumns.forEach((oCol) => {
const useRenderer = usingRendererers && oCol.renderer && oCol.renderer.getCellData;
obj[oCol.attr] = useRenderer ? oCol.renderer.getCellData(row[oCol.attr], row) : row[oCol.attr];
});
return obj;
});
}
getRenderersData(data, tableColumns) {
return data.map((row) => {
const obj = Object.assign({}, row);
tableColumns.forEach((oCol) => {
obj[oCol.attr] = oCol.renderer.getCellData(row[oCol.attr], row);
});
return obj;
});
}
getColumnData(ocolumn) {
return this.renderedData.map((row) => {
const obj = {};
if (ocolumn) {
obj[ocolumn] = row[ocolumn];
}
return obj;
});
}
initializeColumnsFilters(filters) {
this.columnValueFilters = [];
filters.forEach(filter => {
this.columnValueFilters.push(filter);
});
if (!this.table.pageable) {
this._columnValueFilterChange.next(null);
}
}
isColumnValueFilterActive() {
return this.columnValueFilters.length !== 0;
}
getColumnValueFilters() {
return this.columnValueFilters;
}
getColumnValueFilterByAttr(attr) {
return this.columnValueFilters.find(item => item.attr === attr);
}
clearColumnFilters(trigger = true, columnsAttr) {
if (Util.isDefined(columnsAttr)) {
this.columnValueFilters = this.columnValueFilters.filter(x => !columnsAttr.includes(x.attr));
}
else {
this.columnValueFilters = [];
}
if (trigger) {
this._columnValueFilterChange.next(null);
}
}
clearColumnFilter(attr, trigger = true) {
this.columnValueFilters = this.columnValueFilters.filter(x => x.attr !== attr);
if (trigger) {
this._columnValueFilterChange.next(null);
}
}
addColumnFilter(filter) {
const existingFilterIndex = this.columnValueFilters.findIndex(item => item.attr === filter.attr);
if (existingFilterIndex > -1) {
this.columnValueFilters.splice(existingFilterIndex, 1, filter);
}
else {
let validFilter = Util.isDefined(filter.values);
if (validFilter) {
switch (filter.operator) {
case ColumnValueFilterOperator.IN:
validFilter = filter.values.length > 0;
break;
case ColumnValueFilterOperator.BETWEEN:
validFilter = filter.values.length === 2;
break;
case ColumnValueFilterOperator.EQUAL:
case ColumnValueFilterOperator.LESS_EQUAL:
case ColumnValueFilterOperator.MORE_EQUAL:
validFilter = true;
break;
default:
validFilter = false;
}
if (validFilter) {
this.columnValueFilters.push(filter);
}
}
}
if (!this.table.pageable) {
this._columnValueFilterChange.next(null);
}
}
getColumnValueFilterData(data) {
this.columnValueFilters.forEach(filter => {
const filterColumn = this.table.oTableOptions.columns.find(col => col.attr === filter.attr);
if (filterColumn) {
switch (filter.operator) {
case ColumnValueFilterOperator.IN:
const filterValues = (filter.values || []).reduce((previous, current) => previous.concat(filterColumn.getFilterValue(current).map(f => Util.normalizeString(f))), []);
data = data.filter((item) => {
if (filterColumn.renderer && filterColumn.renderer.filterFunction) {
return filterColumn.renderer.filterFunction(item[filter.attr], item);
}
else {
const colValues = filterColumn.getFilterValue(item[filter.attr], item).map(f => Util.normalizeString(f));
return filterValues.some(value => colValues.indexOf(value) !== -1);
}
});
break;
case ColumnValueFilterOperator.EQUAL:
const normalizedValue = Util.normalizeString(filter.values);
data = data.filter(item => {
const colValues = filterColumn.getFilterValue(item[filter.attr], item).map(f => Util.normalizeString(f));
let regExp;
if (normalizedValue.includes('*')) {
regExp = new RegExp('^' + normalizedValue.split('*').join('.*') + '$');
}
return colValues.some(colValue => regExp ? regExp.test(colValue) : colValue.toString().includes(normalizedValue));
});
break;
case ColumnValueFilterOperator.BETWEEN:
data = data.filter(item => item[filter.attr] >= filter.values[0] && item[filter.attr] <= filter.values[1]);
break;
case ColumnValueFilterOperator.MORE_EQUAL:
data = data.filter(item => item[filter.attr] >= filter.values);
break;
case ColumnValueFilterOperator.LESS_EQUAL:
data = data.filter(item => item[filter.attr] <= filter.values);
break;
}
}
});
return data;
}
getAggregateData(column) {
const obj = {};
let totalValue = '';
if (typeof this._tableOptions === 'undefined') {
return new Array(obj);
}
totalValue = this.aggregateData[column.attr];
return totalValue;
}
calculateAggregate(data, columnAttr, operator) {
let resultAggregate;
if (typeof operator === 'string') {
switch (operator.toLowerCase()) {
case 'count':
resultAggregate = this.count(columnAttr, data);
break;
case 'min':
resultAggregate = this.min(columnAttr, data);
break;
case 'max':
resultAggregate = this.max(columnAttr, data);
break;
case 'avg':
resultAggregate = this.avg(columnAttr, data);
break;
default:
resultAggregate = this.sum(columnAttr, data);
break;
}
}
else {
const columnData = this.getColumnData(columnAttr);
if (typeof operator === 'function') {
resultAggregate = operator(columnData);
}
}
return resultAggregate;
}
sum(column, data) {
let value = 0;
if (data) {
if (data[0] instanceof OTableGroupedRow) {
this.getDataFromFirstLevelTableGroupRow(data).forEach(x => {
value = x.getColumnAggregateData(column).reduce((acumulator, currentValue) => {
return acumulator + (isNaN(currentValue[column]) ? 0 : currentValue[column]);
}, value);
});
}
else {
value = data.reduce((acumulator, currentValue) => {
return acumulator + (isNaN(currentValue[column]) ? 0 : currentValue[column]);
}, value);
}
}
return +(value).toFixed(2);
}
count(column, data) {
let value = 0;
if (data) {
if (data[0] instanceof OTableGroupedRow) {
this.getDataFromFirstLevelTableGroupRow(data).forEach(x => {
value = x.getColumnAggregateData(column).reduce((acumulator) => {
return acumulator + 1;
}, value);
});
}
else {
value = data.reduce((acumulator) => {
return acumulator + 1;
}, 0);
}
}
return value;
}
avg(column, data) {
const totalSum = this.sum(column, data);
const totalCount = this.count(column, data);
return +((totalSum === 0 || totalCount === 0) ? 0 : (totalSum / totalCount)).toFixed(2);
}
min(column, data) {
let tempMin = [];
if (data[0] instanceof OTableGroupedRow) {
tempMin = this.getDataFromFirstLevelTableGroupRow(data).map(x => {
return Math.min(...x.getColumnAggregateData(column).map(x => x[column]));
});
}
else {
tempMin = data.map(x => x[column]);
}
return tempMin.length > 0 ? Math.min(...tempMin) : 0;
}
max(column, data) {
let tempMax = [];
if (data[0] instanceof OTableGroupedRow) {
tempMax = this.getDataFromFirstLevelTableGroupRow(data).map(x => {
return Math.max(...x.getColumnAggregateData(column).map(x => x[column]));
});
}
else {
tempMax = data.map(x => x[column]);
}
return tempMax.length > 0 ? Math.max(...tempMax) : 0;
}
isFirstLevelTableGroupRow(tableRowGroupData) {
return tableRowGroupData instanceof OTableGroupedRow && tableRowGroupData.level === 1;
}
getDataFromFirstLevelTableGroupRow(data) {
return data.filter(x => this.isFirstLevelTableGroupRow(x));
}
existsAnyCalculatedColumn() {
return this._tableOptions.columns.find((oCol) => oCol.calculate !== undefined) !== undefined;
}
updateRenderedRowData(rowData) {
const tableKeys = this.table.getKeys();
const record = this.renderedData.find((data) => {
let found = true;
for (let i = 0, len = tableKeys.length; i < len; i++) {
const key = tableKeys[i];
if (data[key] !== rowData[key]) {
found = false;
break;
}
}
return found;
});
if (Util.isDefined(record)) {
Object.assign(record, rowData);
}
}
getDataInformationByGroup(data, level) {
const recordHash = {};
data.forEach((row, i) => {
const keys = {};
for (let i = 0; i <= level; i++) {
keys[this.table.groupedColumnsArray[i]] = this.table.getColumnDataByAttr(this.table.groupedColumnsArray[i], row);
}
const recordKey = JSON.stringify(keys);
if (recordHash.hasOwnProperty(recordKey)) {
recordHash[recordKey].push(i);
}
else {
recordHash[recordKey] = [i];
}
});
return recordHash;
}
recalculateColumnAggregate(columnAttr, row) {
const aggregateConf = row.getActiveColumnAggregateConfiguration(columnAttr);
const data = row.getColumnAggregateData(columnAttr);
const value = this.calculateAggregate(data, aggregateConf.attr, aggregateConf.aggregateFunction || aggregateConf.aggregate);
row.setColumnAggregateValue(columnAttr, value);
}
getSublevel(data, level, parent) {
if (level >= this.table.groupedColumnsArray.length) {
return data;
}
const recordHash = this.getDataInformationByGroup(data, level);
let result = [];
Object.keys(recordHash).forEach(recordKey => {
const row = new OTableGroupedRow({
column: this.table.groupedColumnsArray[level],
keysAsString: recordKey,
level: level + 1,
parent: parent
});
this.groupedRowsSubscription.add(row.aggregateFunctionChange.subscribe(arg => {
if (arg.changeAllGroupedRows) {
this.activeAggregates[arg.columnAttr] = arg.activeAggregate;
this.renderedData.filter(row => row instanceof OTableGroupedRow).forEach(row => {
row.setColumnActiveAggregateFunction(arg.columnAttr, arg.activeAggregate, false);
this.recalculateColumnAggregate(arg.columnAttr, row);
});
}
else {
this.recalculateColumnAggregate(arg.columnAttr, arg.row);
}
}));
const affectedIndexes = recordHash[row.keysAsString];
const groupData = data.filter((row, index) => affectedIndexes.includes(index));
this.table.visibleColArray.forEach((columnAttr, i) => {
if (i === 0) {
row.title = this.getTextGroupRow(row, affectedIndexes.length);
}
const useColumnAggregate = this.table.useColumnGroupingAggregate(columnAttr);
if (useColumnAggregate) {
row.initializeColumnAggregate(columnAttr, this.table.getColumnGroupingComponent(columnAttr));
if (Util.isDefined(this.activeAggregates[columnAttr])) {
row.setColumnActiveAggregateFunction(columnAttr, this.activeAggregates[columnAttr], false);
}
if (row.hasActiveAggregate(columnAttr)) {
const aggregateData = groupData.map(x => { const obj = {}; obj[columnAttr] = x[columnAttr]; return obj; });
row.setColumnAggregateData(columnAttr, aggregateData);
const aggregateConf = row.getActiveColumnAggregateConfiguration(columnAttr);
const value = this.calculateAggregate(aggregateData, aggregateConf.attr, aggregateConf.aggregateFunction || aggregateConf.aggregate);
row.setColumnAggregateValue(columnAttr, value);
}
}
});
row.expanded = this.getExpansionState(row);
const subGroup = this.getSublevel(groupData, level + 1, row);
subGroup.unshift(row);
result = result.concat(subGroup);
});
return result;
}
filterCollapsedRowGroup(data) {
return data.filter((row) => (row instanceof OTableGroupedRow) ? row.visible : this.belongsToExpandedGroupedRow(data, row));
}
belongsToExpandedGroupedRow(data, row) {
let parent;
let match = false;
for (let index = 0; index < data.length && !match; index++) {
if (data[index] instanceof OTableGroupedRow) {
parent = data[index];
}
else if (Util.isEquivalent(data[index], row)) {
match = true;
}
}
return Util.isDefined(parent) ? (parent.visible && parent.expanded) : true;
}
updateGroupedColumns() {
this.groupByColumnChange.next();
}
toggleGroupByColumn(rowGroup) {
if (rowGroup.expandSameLevel(this.table.expandGroupsSameLevel)) {
this.levelsExpansionState[rowGroup.level] = !rowGroup.expanded;
}
else {
this.updateStateRowGrouped(rowGroup);
}
this.groupByColumnChange.next();
}
setRowGroupLevelExpansion(rowGroup, value) {
this.levelsExpansionState[rowGroup.level] = value;
this.groupByColumnChange.next();
}
updateStateRowGrouped(rowGroup) {
const stateRowGrouped = this.groupedRowState.find(row => rowGroup.keysAsString === row.keysAsString && JSON.stringify(rowGroup.parent) === JSON.stringify(row.parent));
if (Util.isDefined(stateRowGrouped)) {
stateRowGrouped.expanded = !stateRowGrouped.expanded;
}
else {
rowGroup.expanded = !rowGroup.expanded;
this.groupedRowState.push(rowGroup);
}
}
getTextGroupRow(group, totalCounts) {
const field = this.table.groupedColumnsArray[group.level - 1];
let value = JSON.parse(group.keysAsString)[this.table.groupedColumnsArray[group.level - 1]];
const oCol = this.table.getOColumn(field);
if (!value && Util.isDefined(oCol.renderer) && this.table.isInstanceOfOTableCellRendererServiceComponent(oCol.renderer)) {
value = ' - ';
if (!this.table.onDataLoadedCellRendererSubscription) {
this.table.onDataLoadedCellRendererSubscription = oCol.renderer.onDataLoaded.subscribe(x => {
this.updateGroupedColumns();
});
}
}
return this.table.translateService.get(oCol.title) + ': ' + value + ' (' + totalCounts + ')';
}
getExpansionState(row) {
let expansionState = !parent || !this.table.collapseGroupedColumns;
if (row.expandSameLevel(this.table.expandGroupsSameLevel)) {
expansionState = this.levelsExpansionState.hasOwnProperty(row.level) ? this.levelsExpansionState[row.level] : expansionState;
}
else {
const rowGroup = this.groupedRowState.find(x => x.keysAsString === row.keysAsString && JSON.stringify(x.parent) === JSON.stringify(row.parent));
expansionState = rowGroup ? rowGroup.expanded : expansionState;
}
return expansionState;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1vLXRhYmxlLmRhdGFzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9leHRlbnNpb25zL2RlZmF1bHQtby10YWJsZS5kYXRhc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTNELE9BQU8sRUFBRSx5QkFBeUIsRUFBc0IsTUFBTSxpREFBaUQsQ0FBQztBQUNoSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2pFLE1BQU0sT0FBTywwQkFBMEI7SUFHckMsWUFBWSxJQUFlO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxVQUFlO0lBRzFELElBQUksSUFBSSxLQUFZLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFxQnpELElBQUksV0FBVyxLQUFhLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLElBQUksV0FBVyxDQUFDLE1BQWM7UUFD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