# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/rfidregistry/v1/keyapis_rfidregistry_record_v1.proto, keyapis/rfidregistry/v1/keyapis_rfidregistry_system_v1.proto
# plugin: python-betterproto
from dataclasses import dataclass
from datetime import datetime
from typing import (
    TYPE_CHECKING,
    AsyncIterator,
    Dict,
    List,
    Optional,
)

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase

if TYPE_CHECKING:
    import grpclib.server
    from betterproto.grpc.grpclib_client import MetadataLike
    from grpclib.metadata import Deadline


class RecordRfidType(betterproto.Enum):
    """Справочник типов ключей. # Тип: byte"""

    RFID_TYPE_UNKNOWN = 0
    """Значение не указано"""

    FOB = 1
    """Брелок"""

    CARD = 2
    """Карта"""

    BAND = 3
    """Браслет"""

    STICKER = 4
    """Стикер"""

    ACTIVE_TAG = 5
    """Активная метка"""


class RecordEncryptionType(betterproto.Enum):
    """Справочник типов шифрования ключа. # Тип: byte"""

    ENCRYPTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    SL0 = 1
    """Без шифрования"""

    SL1 = 2
    """С шифрованием, копируемый"""

    SL3 = 3
    """С шифрованием, не копируемый"""


class RecordStatusType(betterproto.Enum):
    """Справочник типов статусов ключа. # Тип: byte"""

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    NEW = 1
    """Новый"""

    SHIPPED = 2
    """Отгружен"""

    DEFECT = 3
    """Брак"""

    IN_USE = 4
    """Использован"""


class RecordIdentificationMethodType(betterproto.Enum):
    """Справочник методов идентификации. # Тип: byte"""

    IDENTIFICATION_METHOD_TYPE_UNKNOWN = 0
    """Значение не указано"""

    MIFARE = 1
    """Значение Mifare"""

    BLE = 2
    """Значение Bluetooth low energy"""

    UHF = 3
    """Значение Ultra high frequency"""

    EM_MARINE = 4
    """Значение em-marine"""


class RecordPagingOrderByType(betterproto.Enum):
    """Справочник типов значений сортировки. # Тип: byte"""

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    NEW_AT = 1
    """По дате перевода в статус new (дате создания)"""

    CHANGED_AT = 2
    """По времени изменения"""

    ORDER_AT = 3
    """По времени заказа"""

    ORDER_NUMBER = 4
    """По номеру заказа"""

    RANK = 5
    """
    По рангу для поиска по тексту. Применяется когда передано поле для поиска
    по тексту. В случае если текстовое поле не передано, применяется значение
    по умолчанию
    """


class RecordPagingDirectionType(betterproto.Enum):
    """Справочник типов направлений сортировки. # Тип: byte"""

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""


@dataclass(eq=False, repr=False)
class Record(betterproto.Message):
    """Запись. # Описание модели"""

    id: str = betterproto.string_field(1)
    """Идентификатор. Если не передан создаётся сервером. # Тип: Guid"""

    rfid_type: "RecordRfidType" = betterproto.enum_field(2)
    """Тип ключа"""

    encryption_type: "RecordEncryptionType" = betterproto.enum_field(3)
    """
    Тип шифрования ключа. Максимально поддерживаемый ключом тип шифрования
    """

    uid: str = betterproto.string_field(4)
    """Номер ключа. Указывается при создании. # Диапазон: 1..14"""

    status_type: "RecordStatusType" = betterproto.enum_field(5)
    """Тип статуса ключа"""

    new_at: datetime = betterproto.message_field(6)
    """Дата перевода в статус "Новый". # Тип: DateTime"""

    shipped_at: datetime = betterproto.message_field(7)
    """Дата перевода в статус "Отгружен". # Тип: DateTime"""

    defect_at: datetime = betterproto.message_field(8)
    """Дата перевода в статус "Брак". # Тип: DateTime"""

    in_use_at: datetime = betterproto.message_field(9)
    """Дата перевода в статус "Использован". # Тип: DateTime"""

    in_use_rfid_id: Optional[str] = betterproto.message_field(
        10, wraps=betterproto.TYPE_STRING
    )
    """
    Идентификатор привязанного ключа. Заполняется при переводе в статус
    "Использован". # Диапазон: 0..16
    """

    data_cells: List["RecordDataCell"] = betterproto.message_field(11)
    """Содержимое ячеек ключа"""

    resource_owner_id: str = betterproto.string_field(12)
    """Идентификатор владельца. Заполняется сервером. # Диапазон: 0..255"""

    package_info_box: int = betterproto.int32_field(13)
    """Номер коробки. # Диапазон: 1..2147483647"""

    package_info_place: int = betterproto.int32_field(14)
    """Номер места в коробке. # Диапазон: 1..2147483647"""

    changed_at: datetime = betterproto.message_field(15)
    """
    Дата последнего изменения. Заполняется и обновляется сервером. Заполняется
    при создании и изменении. Является версией объекта. # Тип: DateTime
    """

    aes_key_configurations: List["RecordAesKeyConfiguration"] = (
        betterproto.message_field(16)
    )
    """Конфигурации шифрования ключа"""

    trailers: List["RecordTrailer"] = betterproto.message_field(17)
    """Контрольные суммы. Нужны для ключей SL1 и SL3"""

    order_number: str = betterproto.string_field(18)
    """Номер заказа. # Диапазон: 0..256"""

    order_at: datetime = betterproto.message_field(19)
    """Дата заказа. # Тип: DateTime"""

    in_use_resource_owner_id: Optional[str] = betterproto.message_field(
        20, wraps=betterproto.TYPE_STRING
    )
    """
    Владелец привязанного ключа. Заполняется сервером, значение берётся из
    токена при использовании ключа. # Диапазон: 0..255
    """

    is_deleted: bool = betterproto.bool_field(21)
    """Признак, удалена ли запись"""

    deleted_at: datetime = betterproto.message_field(22)
    """Дата удаления. # Тип: DateTime"""

    vendor_name: Optional[str] = betterproto.message_field(
        23, wraps=betterproto.TYPE_STRING
    )
    """Производитель. # Диапазон: 3..100"""

    identification_method_type: "RecordIdentificationMethodType" = (
        betterproto.enum_field(24)
    )
    """Метод идентификации"""


@dataclass(eq=False, repr=False)
class RecordDataCell(betterproto.Message):
    """Содержимое ячейки ключа"""

    section: int = betterproto.int32_field(1)
    """Сектор. # Диапазон: 0..127"""

    block: int = betterproto.int32_field(2)
    """Блок. # Диапазон: 0..127"""

    data: str = betterproto.string_field(3)
    """Данные. # Паттерн: /^[A-Za-z0-9=]+$/"""


@dataclass(eq=False, repr=False)
class RecordAesKeyConfiguration(betterproto.Message):
    """Конфигурация шифрования ключа"""

    address: str = betterproto.string_field(1)
    """Адрес. # Паттерн: /^[A-Za-z0-9=]+$/"""

    data: str = betterproto.string_field(2)
    """Данные. # Паттерн: /^[A-Za-z0-9=]+$/"""


@dataclass(eq=False, repr=False)
class RecordTrailer(betterproto.Message):
    """Контрольная сумма"""

    sector: int = betterproto.int32_field(1)
    """Сектор. # Диапазон: 0..15"""

    key_a: str = betterproto.string_field(2)
    """Ключ А. # Диапазон: 1..256"""

    key_b: str = betterproto.string_field(3)
    """Ключ Б. # Диапазон: 1..256"""

    access_mask: str = betterproto.string_field(4)
    """Маска доступа. # Диапазон: 1..512"""


@dataclass(eq=False, repr=False)
class RecordSavingError(betterproto.Message):
    """
    Ошибка сохранения записи. Эти проверки выполняются при работе с базой
    данных и сторонними сервисами
    """

    status_type_restricted: "RecordSavingErrorStatusTypeRestricted" = (
        betterproto.message_field(1, group="reason")
    )
    """Перевод статуса запрещён"""

    uid_exist: "RecordSavingErrorUidExist" = betterproto.message_field(
        2, group="reason"
    )
    """Запись уже существует"""

    owned_by_another_user: "RecordSavingErrorOwnedByAnotherUser" = (
        betterproto.message_field(3, group="reason")
    )
    """Вы не владелец"""

    already_linked: "RecordSavingErrorAlreadyLinked" = betterproto.message_field(
        4, group="reason"
    )
    """Ключ уже использован"""

    conflict: "RecordSavingErrorConflict" = betterproto.message_field(5, group="reason")
    """Конфликт версий"""


@dataclass(eq=False, repr=False)
class RecordSavingErrorStatusTypeRestricted(betterproto.Message):
    """
    Причины: - Недопустимый перевод статуса. - Не переданы обязательные поля
    https://openapi-key.deploy.rtkit.dev/keyapis_rfidregistry_v1/#таблица-
    обязательности-передачи-полей-в-request
    """

    pass


@dataclass(eq=False, repr=False)
class RecordSavingErrorUidExist(betterproto.Message):
    """Причины: - Ключ уже существует"""

    pass


@dataclass(eq=False, repr=False)
class RecordSavingErrorOwnedByAnotherUser(betterproto.Message):
    """Причины: - Запись принадлежит другому пользователю"""

    pass


@dataclass(eq=False, repr=False)
class RecordSavingErrorAlreadyLinked(betterproto.Message):
    """Причины: - Такой ключ уже привязан к другой записи"""

    pass


@dataclass(eq=False, repr=False)
class RecordSavingErrorConflict(betterproto.Message):
    """
    Причины: - В базе хранится более новая версия записи, значения changed_at
    отличаются
    """

    pass


@dataclass(eq=False, repr=False)
class RecordFilter(betterproto.Message):
    """Фильтр записей"""

    rfid_types: List["RecordRfidType"] = betterproto.enum_field(1)
    """По типам ключей"""

    encryption_types: List["RecordEncryptionType"] = betterproto.enum_field(2)
    """По типам шифрования"""

    uids: List[str] = betterproto.string_field(3)
    """По номерам ключей"""

    status_types: List["RecordStatusType"] = betterproto.enum_field(4)
    """По типам статуса"""

    in_use_rfid_ids: List[str] = betterproto.string_field(5)
    """По номерам привязанных ключей"""

    resource_owner_ids: List[str] = betterproto.string_field(6)
    """По владельцам"""

    order_numbers: List[str] = betterproto.string_field(7)
    """По номерам заказа"""

    in_use_resource_owner_ids: List[str] = betterproto.string_field(8)
    """По владельцам привязанных ключей"""

    is_deleted: Optional[bool] = betterproto.message_field(
        9, wraps=betterproto.TYPE_BOOL
    )
    """По удалённым записям. По умолчанию: false"""

    text: Optional[str] = betterproto.message_field(10, wraps=betterproto.TYPE_STRING)
    """
    По тексту. Если значение не передано то поиск по нему не производится. #
    Диапазон: 3..64. # Поиск производится по полям: # - Номер заказа; # -
    Производитель
    """

    start_shipped_at: datetime = betterproto.message_field(11)
    """Дата отгрузки от"""

    end_shipped_at: datetime = betterproto.message_field(12)
    """Дата отгрузки до"""

    package_info_boxes: List[int] = betterproto.int32_field(13)
    """По номеру коробки"""

    package_info_places: List[int] = betterproto.int32_field(14)
    """По номеру места в коробке"""

    identification_method_types: List["RecordIdentificationMethodType"] = (
        betterproto.enum_field(15)
    )
    """По методу идентификации"""


@dataclass(eq=False, repr=False)
class RecordPaging(betterproto.Message):
    """Пагинация записей"""

    order_by_type: "RecordPagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки. Если значение не передано, то будет взято значение
    по умолчанию. # По умолчанию: NEW_AT
    """

    direction_type: "RecordPagingDirectionType" = betterproto.enum_field(2)
    """Тип направления сортировки. # По умолчанию: DESC"""

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу. Если значение 0 (не передано), то будет
    взято значение по умолчанию. # Диапазон: 0..100. # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """Сдвиг. # Диапазон: 0..2147483647"""


@dataclass(eq=False, repr=False)
class PostRecordRequest(betterproto.Message):
    """Запрос сохранения записи"""

    data: "Record" = betterproto.message_field(1)
    """Запись"""


@dataclass(eq=False, repr=False)
class PostRecordResponse(betterproto.Message):
    """Ответ на запрос сохранения записи"""

    data: "Record" = betterproto.message_field(1, group="type")
    """Запись"""

    error: "PostRecordResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PostRecordResponseError(betterproto.Message):
    """Ошибка запроса сохранения записи"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""

    saving: "RecordSavingError" = betterproto.message_field(2, group="reason")
    """Ошибка сохранения записи"""


@dataclass(eq=False, repr=False)
class GetRecordRequest(betterproto.Message):
    """Запрос получения записи"""

    id: str = betterproto.string_field(1)
    """Идентификатор. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class GetRecordResponse(betterproto.Message):
    """Ответ на запрос получения записи"""

    data: "Record" = betterproto.message_field(1, group="type")
    """Запись"""


@dataclass(eq=False, repr=False)
class GetRecordCountRequest(betterproto.Message):
    """Запрос получения количества записей"""

    filter: "RecordFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False)
class GetRecordCountResponse(betterproto.Message):
    """Ответ на запрос получения количества записей"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего записей"""

    error: "GetRecordCountResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetRecordCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества записей"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка фильтрации записей"""


@dataclass(eq=False, repr=False)
class GetRecordListRequest(betterproto.Message):
    """Запрос получения списка"""

    filter: "RecordFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "RecordPaging" = betterproto.message_field(2, group="pagination")
    """Пагинация"""


@dataclass(eq=False, repr=False)
class GetRecordListResponse(betterproto.Message):
    """Ответ на запрос получения списка записей"""

    data: "Record" = betterproto.message_field(1, group="type")
    """Запись"""

    error: "GetRecordListResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetRecordListResponseError(betterproto.Message):
    """Ошибка запроса получения списка записей"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка фильтрации записей"""


@dataclass(eq=False, repr=False)
class DeleteRecordRequest(betterproto.Message):
    """Запрос удаления записи из реестра. Можно удалить только свои записи"""

    id: str = betterproto.string_field(1)
    """Идентификатор записи. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class DeleteRecordResponse(betterproto.Message):
    """Ответ на запрос удаления записи из реестра"""

    error: "DeleteRecordResponseError" = betterproto.message_field(1, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class DeleteRecordResponseError(betterproto.Message):
    """Ошибка удаления записи"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class ValidationError(betterproto.Message):
    """
    Ошибки валидации. Эти проверки выполняются до обращения в базу данных
    """

    path: str = betterproto.string_field(1)
    """Путь к полю в формате наименования прото"""

    message: str = betterproto.string_field(2)
    """Валидационное сообщение"""


@dataclass(eq=False, repr=False)
class GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False)
class GetSystemStatusResponse(betterproto.Message):
    """Ответ на запрос проверки доступности сервиса"""

    pass


class RecordServiceStub(betterproto.ServiceStub):
    async def post_record(
        self,
        post_record_request: "PostRecordRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostRecordResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.RecordService/PostRecord",
            post_record_request,
            PostRecordResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_record(
        self,
        get_record_request: "GetRecordRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetRecordResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.RecordService/GetRecord",
            get_record_request,
            GetRecordResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_record_list(
        self,
        get_record_list_request: "GetRecordListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetRecordListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.rfidregistry.v1.RecordService/GetRecordList",
            get_record_list_request,
            GetRecordListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_record_count(
        self,
        get_record_count_request: "GetRecordCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetRecordCountResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.RecordService/GetRecordCount",
            get_record_count_request,
            GetRecordCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_record(
        self,
        delete_record_request: "DeleteRecordRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteRecordResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.RecordService/DeleteRecord",
            delete_record_request,
            DeleteRecordResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class SystemServiceStub(betterproto.ServiceStub):
    async def get_system_status(
        self,
        get_system_status_request: "GetSystemStatusRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetSystemStatusResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class RecordServiceBase(ServiceBase):

    async def post_record(
        self, post_record_request: "PostRecordRequest"
    ) -> "PostRecordResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_record(
        self, get_record_request: "GetRecordRequest"
    ) -> "GetRecordResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_record_list(
        self, get_record_list_request: "GetRecordListRequest"
    ) -> AsyncIterator["GetRecordListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_record_count(
        self, get_record_count_request: "GetRecordCountRequest"
    ) -> "GetRecordCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_record(
        self, delete_record_request: "DeleteRecordRequest"
    ) -> "DeleteRecordResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_record(
        self, stream: "grpclib.server.Stream[PostRecordRequest, PostRecordResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_record(request)
        await stream.send_message(response)

    async def __rpc_get_record(
        self, stream: "grpclib.server.Stream[GetRecordRequest, GetRecordResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_record(request)
        await stream.send_message(response)

    async def __rpc_get_record_list(
        self,
        stream: "grpclib.server.Stream[GetRecordListRequest, GetRecordListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_record_list,
            stream,
            request,
        )

    async def __rpc_get_record_count(
        self,
        stream: "grpclib.server.Stream[GetRecordCountRequest, GetRecordCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_record_count(request)
        await stream.send_message(response)

    async def __rpc_delete_record(
        self, stream: "grpclib.server.Stream[DeleteRecordRequest, DeleteRecordResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_record(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.rfidregistry.v1.RecordService/PostRecord": grpclib.const.Handler(
                self.__rpc_post_record,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostRecordRequest,
                PostRecordResponse,
            ),
            "/keyapis.rfidregistry.v1.RecordService/GetRecord": grpclib.const.Handler(
                self.__rpc_get_record,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRecordRequest,
                GetRecordResponse,
            ),
            "/keyapis.rfidregistry.v1.RecordService/GetRecordList": grpclib.const.Handler(
                self.__rpc_get_record_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetRecordListRequest,
                GetRecordListResponse,
            ),
            "/keyapis.rfidregistry.v1.RecordService/GetRecordCount": grpclib.const.Handler(
                self.__rpc_get_record_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRecordCountRequest,
                GetRecordCountResponse,
            ),
            "/keyapis.rfidregistry.v1.RecordService/DeleteRecord": grpclib.const.Handler(
                self.__rpc_delete_record,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteRecordRequest,
                DeleteRecordResponse,
            ),
        }


class SystemServiceBase(ServiceBase):

    async def get_system_status(
        self, get_system_status_request: "GetSystemStatusRequest"
    ) -> "GetSystemStatusResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_system_status(
        self,
        stream: "grpclib.server.Stream[GetSystemStatusRequest, GetSystemStatusResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_system_status(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.rfidregistry.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }
