import { type CellAddress, type CellRange, type TableEventHandlersEventArgumentMap, type TableEventHandlersReturnMap, type TableKeyboardOptions, type DropDownMenuHighlightInfo, type MenuListItem, type WidthModeDef, type ICustomRender, type ICellHeaderPaths, type HeaderData, type FullExtendStyle, type FieldDef, type ColumnTypeOption, type SortState, type IPagination, type ICustomLayout, type CellInfo, type CellStyle, type DropDownMenuOptions, type FieldData, type MaybePromiseOrUndefined, type MousePointerCellEvent, type DropDownMenuEventInfo, type HierarchyState, type FieldKeyDef, type CellLocation, type LayoutObjectId, type HeightModeDef, type ITableThemeDefine, type ScrollStyle } from '../ts-types';
import type { AnyFunction, CellAddressWithBound, ColumnIconOption, ColumnSeriesNumber, IRowSeriesNumber, ColumnStyleOption, TableEventOptions, WidthAdaptiveModeDef, HeightAdaptiveModeDef, ColumnInfo, RowInfo } from '../ts-types';
import { TABLE_EVENT_TYPE } from './TABLE_EVENT_TYPE';
import { EventTarget } from '../event/EventTarget';
import { NumberMap } from '../tools/NumberMap';
import { Rect } from '../tools/Rect';
import type { TableTheme } from '../themes/theme-define';
import { Scenegraph } from '../scenegraph/scenegraph';
import { StateManager } from '../state/state';
import { EventManager } from '../event/event';
import type { CachedDataSource, DataSource } from '../data';
import type { IBoundsLike } from '@visactor/vutils';
import { AABBBounds, type ITextSize } from '@visactor/vutils';
import type { ColumnData, ColumnDefine, ColumnsDefine, IndicatorData, SeriesNumberColumnData } from '../ts-types/list-table/layout-map/api';
import type { TooltipOptions } from '../ts-types/tooltip';
import type { BaseTableAPI, BaseTableConstructorOptions, IBaseTableProtected } from '../ts-types/base-table';
import type { DataSet } from '@visactor/vdataset';
import { NumberRangeMap } from '../layout/row-height-map';
import type { ITextGraphicAttribute } from './../vrender';
import { ReactCustomLayout } from '../components/react/react-custom-layout';
import type { ISortedMapItem } from '../data/DataSource';
import type { EditManager } from '../edit/edit-manager';
import { TableAnimationManager } from './animation';
import type { ITableAnimationOption } from '../ts-types/animation/appear';
import type { CustomCellStylePlugin } from '../plugins/custom-cell-style';
import { PluginManager } from '../plugins/plugin-manager';
export declare abstract class BaseTable extends EventTarget implements BaseTableAPI {
    internalProps: IBaseTableProtected;
    showFrozenIcon: boolean;
    padding: {
        top: number;
        left: number;
        right: number;
        bottom: number;
    };
    globalDropDownMenu?: MenuListItem[] | ((args: {
        row: number;
        col: number;
        table: BaseTableAPI;
    }) => MenuListItem[]);
    tableNoFrameWidth: number;
    tableNoFrameHeight: number;
    tableX: number;
    tableY: number;
    _widthMode: WidthModeDef;
    _heightMode: HeightModeDef;
    _autoFillWidth: boolean;
    _autoFillHeight: boolean;
    _containerFit: {
        width: boolean;
        height: boolean;
    };
    _widthAdaptiveMode: WidthAdaptiveModeDef;
    _heightAdaptiveMode: HeightAdaptiveModeDef;
    customRender?: ICustomRender;
    canvasWidth?: number;
    canvasHeight?: number;
    contentOffsetX?: number;
    contentOffsetY?: number;
    _vDataSet?: DataSet;
    scenegraph: Scenegraph;
    stateManager: StateManager;
    eventManager: EventManager;
    editorManager: EditManager;
    animationManager: TableAnimationManager;
    _pixelRatio: number;
    canvasSizeSeted?: boolean;
    static get EVENT_TYPE(): typeof TABLE_EVENT_TYPE;
    readonly options: BaseTableConstructorOptions;
    version: string;
    pagination?: IPagination | undefined;
    id: string;
    headerStyleCache: Map<string, any>;
    bodyStyleCache: Map<string, any>;
    bodyMergeTitleCache: Map<string, any>;
    bodyBottomStyleCache: Map<string, any>;
    container: HTMLElement;
    isReleased: boolean;
    _chartEventMap: Record<string, {
        query?: any;
        callback: AnyFunction;
    }[]>;
    customCellStylePlugin?: CustomCellStylePlugin;
    columnWidthComputeMode?: 'normal' | 'only-header' | 'only-body';
    reactCustomLayout?: ReactCustomLayout;
    _hasAutoImageColumn?: boolean;
    pluginManager: PluginManager;
    rotateDegree?: number;
    constructor(container: HTMLElement, options?: BaseTableConstructorOptions);
    _adjustCanvasSizeByOption(): void;
    throttleInvalidate: (this: any, ...args: any[]) => void;
    getContainer(): HTMLElement;
    getElement(): HTMLElement;
    get canvas(): HTMLCanvasElement;
    setCanvasSize(canvasWidth: number, canvasHeight: number): void;
    setContentInsetXY(contentOffsetX: number, contentOffsetY: number): void;
    resize(): void;
    get rowCount(): number;
    set rowCount(rowCount: number);
    get colCount(): number;
    set colCount(colCount: number);
    get frozenColCount(): number;
    set frozenColCount(frozenColCount: number);
    setFrozenColCount(frozenColCount: number): void;
    _setFrozenColCount(frozenColCount: number): void;
    _resetFrozenColCount(): void;
    get frozenRowCount(): number;
    set frozenRowCount(frozenRowCount: number);
    _setFrozenRowCount(frozenRowCount: number): void;
    get rightFrozenColCount(): number;
    set rightFrozenColCount(rightFrozenColCount: number);
    get bottomFrozenRowCount(): number;
    set bottomFrozenRowCount(bottomFrozenRowCount: number);
    get defaultRowHeight(): number;
    set defaultRowHeight(defaultRowHeight: number | 'auto');
    get defaultHeaderRowHeight(): (number | 'auto') | (number | 'auto')[];
    set defaultHeaderRowHeight(defaultHeaderRowHeight: (number | 'auto') | (number | 'auto')[]);
    get defaultColWidth(): number;
    set defaultColWidth(defaultColWidth: number);
    get defaultHeaderColWidth(): (number | 'auto') | (number | 'auto')[];
    set defaultHeaderColWidth(defaultHeaderColWidth: (number | 'auto') | (number | 'auto')[]);
    get colWidthsMap(): NumberMap<string | number>;
    set colWidthsMap(colWidthsMap: NumberMap<string | number>);
    get colContentWidthsMap(): NumberMap<string | number>;
    set colContentWidthsMap(colContentWidthsMap: NumberMap<string | number>);
    get _colRangeWidthsMap(): Map<string, number>;
    set _colRangeWidthsMap(_colRangeWidthsMap: Map<string, number>);
    get _rowRangeHeightsMap(): Map<string, number>;
    set _rowRangeHeightsMap(_rowRangeHeightsMap: Map<string, number>);
    get rowHeightsMap(): NumberRangeMap;
    set rowHeightsMap(rowHeightsMap: NumberRangeMap);
    get colWidthsLimit(): {
        [col: number]: {
            max?: string | number;
            min?: string | number;
        };
    };
    set colWidthsLimit(colWidthsLimit: {
        [col: number]: {
            max?: string | number;
            min?: string | number;
        };
    });
    get keyboardOptions(): TableKeyboardOptions | null;
    set keyboardOptions(keyboardOptions: TableKeyboardOptions | null);
    get eventOptions(): TableEventOptions | null;
    set eventOptions(eventOptions: TableEventOptions | null);
    get widthMode(): WidthModeDef;
    set widthMode(widthMode: WidthModeDef);
    get heightMode(): HeightModeDef;
    set heightMode(heightMode: HeightModeDef);
    get autoFillWidth(): boolean;
    set autoFillWidth(autoFillWidth: boolean);
    get autoFillHeight(): boolean;
    set autoFillHeight(autoFillHeight: boolean);
    get widthAdaptiveMode(): WidthAdaptiveModeDef;
    set widthAdaptiveMode(widthAdaptiveMode: WidthAdaptiveModeDef);
    get heightAdaptiveMode(): HeightAdaptiveModeDef;
    set heightAdaptiveMode(heightAdaptiveMode: HeightAdaptiveModeDef);
    _colWidthDefineToPxWidth(width: string | number): number;
    _getMaxFrozenWidth(): number;
    _getComputedFrozenColCount(frozenColCount: number): number;
    private _getColWidthLimits;
    _adjustColWidth(col: number, orgWidth: number): number;
    get pixelRatio(): number;
    setPixelRatio(pixelRatio: number): void;
    _updateSize(): void;
    shouldVScrollBarWidthShow(tableWidth: number, tableHeight: number, scrollStyle: ScrollStyle): boolean;
    shouldHScrollBarWidthShow(tableWidth: number, tableHeight: number, scrollStyle: ScrollStyle): boolean;
    updateViewBox(newViewBox: IBoundsLike): void;
    setViewBoxTransform(a: number, b: number, c: number, d: number, e: number, f: number): void;
    get rowHierarchyType(): 'grid' | 'tree' | 'grid-tree';
    getColsWidth(startCol: number, endCol: number): number;
    getRowHeight(row: number): number;
    getDefaultColumnWidth(col: number): number | "auto";
    getDefaultRowHeight(row: number): number | "auto";
    _setRowHeight(row: number, height: number, clearCache?: boolean): void;
    setRowHeight(row: number, height: number): void;
    getRowsHeight(startRow: number, endRow: number): number;
    _getRangeSizeForContainerFit(start: number, end: number, totalSize: number, type?: 'col' | 'row'): number;
    getColWidthDefined(col: number): string | number;
    getColWidthDefinedNumber(col: number): number;
    isAutoRowHeight(row?: number): boolean;
    getColWidth(col: number): number;
    _setColWidth(col: number, width: string | number, clearCache?: boolean, skipCheckFrozen?: boolean): void;
    setColWidth(col: number, width: number): void;
    _clearColRangeWidthsMap(col?: number): void;
    _clearRowRangeHeightsMap(row?: number): void;
    _getColContentWidth(col: number): number;
    _setColContentWidth(col: number, width: string | number): void;
    getAllRowsHeight(): number;
    getAllColsWidth(): number;
    getColsWidths(): number[];
    getMaxColWidth(col: number): number;
    setMaxColWidth(col: number, maxwidth: string | number): void;
    getMinColWidth(col: number): number;
    setMinColWidth(col: number, minwidth: string | number): void;
    getCellRect(col: number, row: number): Rect;
    getMergeCellRect(col: number, row: number): Rect;
    getCellRelativeRect(col: number, row: number): Rect;
    getCellRangeRelativeRect(range: CellRange | CellAddress): Rect;
    getVisibleCellRangeRelativeRect(range: CellRange | CellAddress): Rect;
    _getVisiableRect(relativeRectObj: Rect, cellRange: CellRange): Rect;
    getCellsRect(startCol: number, startRow: number, endCol: number, endRow: number): Rect;
    getCellsRectWidth(startCol: number, startRow: number, endCol: number, endRow: number): number;
    getCellRangeRect(range: CellRange | CellAddress): Rect;
    getCellRangeRectWidth(range: CellRange | CellAddress): number;
    isFrozenCell(col: number, row: number): {
        row: boolean;
        col: boolean;
    } | null;
    getRowAt(absoluteY: number): {
        top: number;
        row: number;
        bottom: number;
        height: number;
    };
    getColAt(absoluteX: number): {
        left: number;
        col: number;
        right: number;
        width: number;
    };
    getCellAt(absoluteX: number, absoluteY: number): CellAddressWithBound;
    getCellAtRelativePosition(relativeX: number, relativeY: number): CellAddressWithBound;
    getColAtRelativePosition(relativeX: number): number;
    getRowAtRelativePosition(relativeY: number): number;
    _checkRowCol(col: number, row: number): boolean;
    _makeVisibleCell(col: number, row: number): void;
    render(): void;
    renderAsync(): Promise<void>;
    _toRelativeRect(absoluteRect: Rect, relativeX?: boolean, relativeY?: boolean): Rect;
    getVisibleRect(): Rect;
    get visibleRowCount(): number;
    getBodyVisibleCellRange(): {
        rowStart: number;
        colStart: number;
        rowEnd: number;
        colEnd: number;
    };
    getBodyVisibleRowRange(deltaY?: number): {
        rowStart: number;
        rowEnd: number;
    };
    getBodyVisibleColRange(deltaX?: number): {
        colStart: number;
        colEnd: number;
    };
    get visibleColCount(): number;
    get scrollTop(): number;
    set scrollTop(scrollTop: number);
    get scrollLeft(): number;
    set scrollLeft(scrollLeft: number);
    getScrollLeft(): number;
    getScrollTop(): number;
    setScrollLeft(num: number): void;
    setScrollTop(num: number): void;
    getCellOverflowText(col: number, row: number): string | null;
    addReleaseObj(releaseObj: {
        release: () => void;
    }): void;
    private dispose;
    release(): void;
    fireListeners<TYPE extends keyof TableEventHandlersEventArgumentMap>(type: TYPE, event: TableEventHandlersEventArgumentMap[TYPE]): TableEventHandlersReturnMap[TYPE][];
    updateOption(options: BaseTableConstructorOptions, updateConfig?: {
        clearColWidthCache?: boolean;
        clearRowHeightCache?: boolean;
    }): void;
    renderWithRecreateCells(): void;
    getFrozenRowsHeight(): number;
    getFrozenColsWidth(): number;
    getBottomFrozenRowsHeight(): number;
    getRightFrozenColsWidth(): number;
    getDrawRange(): Rect;
    _getMouseAbstractPoint(evt: TouchEvent | MouseEvent | undefined): {
        x: number;
        y: number;
        inTable: boolean;
    };
    getTheme(): TableTheme;
    getTargetColAt(absoluteX: number): ColumnInfo | null;
    getTargetRowAt(absoluteY: number): RowInfo | null;
    getTargetColAtConsiderRightFrozen(absoluteX: number, isConsider: boolean): ColumnInfo | null;
    getTargetRowAtConsiderBottomFrozen(absoluteY: number, isConsider: boolean): RowInfo | null;
    clearSelected(): void;
    selectCell(col: number, row: number, enableShiftSelectMode?: boolean, enableCtrlSelectMode?: boolean, makeSelectCellVisible?: boolean, skipBodyMerge?: boolean): void;
    selectCells(cellRanges: CellRange[]): void;
    selectRow(rowIndex: number, isCtrl?: boolean, isShift?: boolean): void;
    selectCol(colIndex: number, isCtrl?: boolean, isShift?: boolean): void;
    startDragSelectCol(colIndex: number, enableCtrlSelectMode?: boolean, enableShiftSelectMode?: boolean): void;
    dragSelectCol(colIndex: number, enableCtrlSelectMode?: boolean): void;
    endDragSelect(): void;
    startDragSelectRow(rowIndex: number, enableCtrlSelectMode?: boolean, isShift?: boolean): void;
    dragSelectRow(rowIndex: number, isCtrl?: boolean): void;
    abstract isListTable(): boolean;
    abstract isPivotTable(): boolean;
    abstract isPivotChart(): boolean;
    protected abstract _getSortFuncFromHeaderOption(columns: ColumnsDefine | undefined, field: FieldDef, fieldKey?: FieldKeyDef): ((v1: any, v2: any, order: string) => 0 | 1 | -1) | undefined;
    abstract setRecords(records: Array<any>, option?: {
        sortState?: SortState | SortState[];
    }): void;
    abstract refreshHeader(): void;
    abstract refreshRowColCount(): void;
    abstract getHierarchyState(col: number, row: number): HierarchyState | null;
    abstract toggleHierarchyState(col: number, row: number, recalculateColWidths?: boolean): void;
    abstract getMenuInfo(col: number, row: number, type: string): DropDownMenuEventInfo;
    abstract _moveHeaderPosition(source: CellAddress, target: CellAddress): {
        sourceIndex: number;
        targetIndex: any;
        sourceSize: any;
        targetSize: any;
        moveType: 'column' | 'row';
    };
    abstract getRecordShowIndexByCell(col: number, row: number): number;
    abstract getCellOriginRecord(col: number, row: number): MaybePromiseOrUndefined;
    abstract getCellRawRecord(col: number, row: number): MaybePromiseOrUndefined;
    abstract getCellValue(col: number, row: number, skipCustomMerge?: boolean): FieldData;
    abstract getCellOriginValue(col: number, row: number): FieldData;
    abstract getCellRawValue(col: number, row: number): FieldData;
    abstract getTableIndexByRecordIndex(recordIndex: number): number;
    abstract getTableIndexByField(field: FieldDef): number;
    abstract getCellAddrByFieldRecord(field: FieldDef, recordIndex: number): CellAddress;
    abstract updatePagination(pagination: IPagination): void;
    abstract _hasCustomRenderOrLayout(): boolean;
    get recordsCount(): any;
    get allowFrozenColCount(): number;
    get rowHeaderLevelCount(): number;
    get columnHeaderLevelCount(): number;
    get records(): any;
    get dataSource(): CachedDataSource | DataSource;
    set dataSource(dataSource: CachedDataSource | DataSource);
    get autoWrapText(): boolean;
    set autoWrapText(autoWrapText: boolean);
    get enableLineBreak(): boolean;
    set enableLineBreak(enableLineBreak: boolean);
    updateAutoWrapText(autoWrapText: boolean): void;
    get theme(): TableTheme;
    set theme(theme: TableTheme);
    updateTheme(theme: ITableThemeDefine): void;
    getBodyField(col: number, row: number): FieldDef | undefined;
    getBodyColumnDefine(col: number, row: number): ColumnDefine | IRowSeriesNumber | ColumnSeriesNumber;
    getBodyColumnType(col: number, row: number): ColumnTypeOption;
    getCellType(col: number, row: number): ColumnTypeOption;
    getHeaderField(col: number, row: number): FieldDef;
    getHeaderDefine(col: number, row: number): ColumnDefine | IRowSeriesNumber | ColumnSeriesNumber;
    getCellLocation(col: number, row: number): CellLocation;
    getCellHeaderPaths(col: number, row: number): ICellHeaderPaths;
    getHeadersDefine(col: number, row: number): (ColumnDefine | IRowSeriesNumber | ColumnSeriesNumber)[];
    _getHeaderLayoutMap(col: number, row: number): HeaderData | SeriesNumberColumnData;
    _getBodyLayoutMap(col: number, row: number): ColumnData | IndicatorData | SeriesNumberColumnData;
    getContext(): CanvasRenderingContext2D;
    getRecordByCell(col: number, row: number): MaybePromiseOrUndefined;
    getRecordByRowCol(col: number, row: number): any;
    getRecordStartRowByRecordIndex(index: number): number;
    _getHeaderCellBySortState(sortState: SortState): CellAddress | undefined;
    getCellRange(col: number, row: number): CellRange;
    hasCustomMerge(): boolean;
    getCustomMerge(col: number, row: number): import("../ts-types").CustomMerge;
    isCellRangeEqual(col: number, row: number, targetCol: number, targetRow: number): boolean;
    _getLayoutCellId(col: number, row: number): LayoutObjectId;
    getHeaderDescription(col: number, row: number): string | undefined;
    setDropDownMenuHighlight(cells: DropDownMenuHighlightInfo[]): void;
    _dropDownMenuIsHighlight(colNow: number, rowNow: number, index: number): boolean;
    isSeriesNumberInBody(col: number, row: number): boolean;
    isSeriesNumberInHeader(col: number, row: number): boolean;
    isHeader(col: number, row: number): boolean;
    isColumnHeader(col: number, row: number): boolean;
    isRowHeader(col: number, row: number): boolean;
    isCornerHeader(col: number, row: number): boolean;
    isFrozenColumn(col: number, row?: number): boolean;
    isLeftFrozenColumn(col: number, row?: number): boolean;
    isRightFrozenColumn(col: number, row?: number): boolean;
    isFrozenRow(col: number, row?: number): boolean;
    isTopFrozenRow(col: number, row?: number): boolean;
    isBottomFrozenRow(col: number, row?: number): boolean;
    getCellInfo(col: number, row: number): Omit<MousePointerCellEvent, 'target'>;
    _hasField(field: FieldDef, col: number, row: number): boolean;
    _getCellStyle(col: number, row: number): FullExtendStyle;
    clearCellStyleCache(): void;
    clearRowHeightCache(): void;
    clearColWidthCache(): void;
    _canResizeColumn(col: number, row: number): boolean;
    _canResizeRow(col: number, row: number): boolean;
    _canDragHeaderPosition(col: number, row: number): boolean;
    getCellIcons(col: number, row: number): ColumnIconOption[];
    showDropDownMenu(col: number, row: number, dropDownMenuOptions?: DropDownMenuOptions): void;
    showTooltip(col: number, row: number, tooltipOptions?: TooltipOptions): void;
    getCellStyle(col: number, row: number): CellStyle;
    getAllBodyCells(colMaxCount?: number, rowMaxCount?: number): CellInfo[][];
    getAllCells(colMaxCount?: number, rowMaxCount?: number): CellInfo[][];
    getAllColumnHeaderCells(): CellInfo[][];
    getAllRowHeaderCells(): CellInfo[][];
    getCopyValue(getCellValueFunction?: (col: number, row: number) => string | number): string | null;
    getSelectedCellInfos(): CellInfo[][] | null;
    getSelectedCellRanges(): CellRange[];
    measureText(text: string, font: {
        fontSize: number;
        fontWeight: string | number;
        fontFamily: string;
    }): ITextSize;
    measureTextBounds(attribute: ITextGraphicAttribute): AABBBounds;
    getCustomRender(col: number, row: number): ICustomRender;
    getCustomLayout(col: number, row: number): ICustomLayout;
    hasAutoImageColumn(): boolean;
    _getActiveChartInstance(): any;
    cellIsInVisualView(col: number, row: number): boolean;
    getCustomMergeValue(col: number, row: number): string | undefined;
    exportImg(): string;
    exportCellImg(col: number, row: number, options?: {
        disableBackground?: boolean;
        disableBorder?: boolean;
    }): string;
    exportCellRangeImg(cellRange: CellRange): string;
    exportCanvas(): HTMLCanvasElement;
    getImageBuffer(type?: string): any;
    getBodyIndexByTableIndex(col: number, row: number): {
        col: number;
        row: number;
    };
    getTableIndexByBodyIndex(col: number, row: number): {
        col: number;
        row: number;
    };
    onVChartEvent(type: string, callback: AnyFunction): void;
    onVChartEvent(type: string, query: any, callback: AnyFunction): void;
    offVChartEvent(type: string, callback?: AnyFunction): void;
    _bindChartEvent(activeChartInstance: any): void;
    changeRecordOrder(source: number, target: number): void;
    hasCustomCellStyle(customStyleId: string): boolean;
    registerCustomCellStyle(customStyleId: string, customStyle: ColumnStyleOption | undefined | null): void;
    arrangeCustomCellStyle(cellPos: {
        col?: number;
        row?: number;
        range?: CellRange;
    }, customStyleId: string, forceFastUpdate?: boolean): void;
    isSeriesNumber(col: number, row: number): boolean;
    isHasSeriesNumber(): boolean;
    get leftRowSeriesNumberCount(): number;
    setMinMaxLimitWidth(setWidth?: boolean): void;
    setSortedIndexMap(field: FieldDef, filedMap: ISortedMapItem): void;
    checkReactCustomLayout(): void;
    get bodyDomContainer(): HTMLElement;
    get headerDomContainer(): HTMLElement;
    get frozenBodyDomContainer(): HTMLElement;
    get frozenHeaderDomContainer(): HTMLElement;
    get rightFrozenBodyDomContainer(): HTMLElement;
    get rightFrozenHeaderDomContainer(): HTMLElement;
    get frozenBottomDomContainer(): HTMLElement;
    get bottomDomContainer(): HTMLElement;
    get rightFrozenBottomDomContainer(): HTMLElement;
    showMoverLine(col: number, row: number): void;
    hideMoverLine(col: number, row: number): void;
    disableScroll(): void;
    enableScroll(): void;
    getGroupTitleLevel(col: number, row: number): number | undefined;
    scrollToRow(row: number, animationOption?: ITableAnimationOption | boolean): void;
    scrollToCol(col: number, animationOption?: ITableAnimationOption | boolean): void;
    scrollToCell(cellAddr: {
        col?: number;
        row?: number;
    }, animationOption?: ITableAnimationOption | boolean): void;
    checkHasColumnAutoWidth(): boolean;
    get containerFit(): {
        width: boolean;
        height: boolean;
    };
    set containerFit(containerFit: boolean | {
        width?: boolean;
        height?: boolean;
    });
    isColumnSelected(col: number): boolean;
    isRowSelected(row: number): boolean;
}
