mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
809 lines
12 KiB
809 lines
12 KiB
/*+
|
|
* file: d21x4fct.h
|
|
*
|
|
* Copyright (C) 1992-1995 by
|
|
* Digital Equipment Corporation, Maynard, Massachusetts.
|
|
* All rights reserved.
|
|
*
|
|
* This software is furnished under a license and may be used and copied
|
|
* only in accordance of the terms of such license and with the
|
|
* inclusion of the above copyright notice. This software or any other
|
|
* copies thereof may not be provided or otherwise made available to any
|
|
* other person. No title to and ownership of the software is hereby
|
|
* transferred.
|
|
*
|
|
* The information in this software is subject to change without notice
|
|
* and should not be construed as a commitment by digital equipment
|
|
* corporation.
|
|
*
|
|
* Digital assumes no responsibility for the use or reliability of its
|
|
* software on equipment which is not supplied by digital.
|
|
*
|
|
*
|
|
* Abstract: This file contains the functions prototyping for the
|
|
* NDIS 4.0 miniport driver for DEC's DC21X4 Ethernet controler
|
|
*
|
|
* Author: Philippe Klein
|
|
*
|
|
* Revision History:
|
|
*
|
|
* phk 28-Aug-1994 Initial entry
|
|
*
|
|
-*/
|
|
|
|
// DC21X4.C
|
|
|
|
NTSTATUS
|
|
DriverEntry(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PUNICODE_STRING RegistryPath
|
|
);
|
|
|
|
|
|
// ALLOC.C
|
|
|
|
extern
|
|
BOOLEAN
|
|
AllocateAdapterMemory(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
FreeAdapterMemory(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
VOID
|
|
AlignStructure (
|
|
IN PALLOCATION_MAP Map,
|
|
IN UINT Boundary
|
|
);
|
|
|
|
|
|
VOID
|
|
DC21X4AllocateComplete(
|
|
IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN PVOID VirtualAddress,
|
|
IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress,
|
|
IN ULONG Length,
|
|
IN PVOID Context
|
|
);
|
|
|
|
|
|
// COPY.C
|
|
|
|
extern
|
|
VOID
|
|
CopyFromPacketToBuffer (
|
|
IN PNDIS_PACKET Packet,
|
|
IN UINT Offset,
|
|
IN PCHAR Buffer,
|
|
IN UINT BytesToCopy,
|
|
OUT PUINT BytesCopied
|
|
);
|
|
|
|
|
|
// FILTER.C
|
|
|
|
extern
|
|
VOID
|
|
DC21X4InitializeCam (
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN PUSHORT Address
|
|
);
|
|
|
|
extern
|
|
BOOLEAN
|
|
DC21X4LoadCam (
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN BOOLEAN InterruptMode
|
|
);
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4ChangeFilter (
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN ULONG NewFilterClass
|
|
);
|
|
|
|
VOID
|
|
AddBroadcastToSetup (
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
VOID
|
|
RemoveBroadcastFromSetup (
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4ChangeMulticastAddresses(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN PVOID MulticastAddresses,
|
|
IN UINT AddressCount
|
|
);
|
|
|
|
// INIT.C
|
|
|
|
extern
|
|
VOID
|
|
DC21X4InitializeRegisters(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4StopAdapter(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4StartAdapter(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4WriteGepRegister(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN ULONG Data
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4InitializeGepRegisters(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN BOOLEAN Phy
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4InitializeMediaRegisters(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN BOOLEAN Phy
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC2104InitializeSiaRegisters(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4InitPciConfigurationRegisters(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
|
|
extern
|
|
VOID
|
|
DC21X4StopReceiverAndTransmitter(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
// INTERRUP.C;
|
|
|
|
extern
|
|
VOID
|
|
DC21X4Isr(
|
|
OUT PBOOLEAN InterruptRecognized,
|
|
OUT PBOOLEAN QueueMiniportHandleInterrupt,
|
|
IN NDIS_HANDLE MiniportAdapterContext
|
|
);
|
|
|
|
VOID
|
|
DC21X4SynchClearIsr(
|
|
IN PDC21X4_SYNCH_CONTEXT SyncContext
|
|
);
|
|
|
|
VOID
|
|
DC21X4HandleInterrupt(
|
|
IN NDIS_HANDLE MiniportAdapterContext
|
|
);
|
|
|
|
VOID
|
|
HandleGepInterrupt(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
VOID
|
|
HandleLinkPassInterrupt(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN OUT PULONG IsrStatus
|
|
);
|
|
|
|
VOID
|
|
HandleLinkFailInterrupt(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN OUT PULONG IsrStatus
|
|
);
|
|
|
|
|
|
VOID
|
|
SwitchMediumToTpNway(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
PDC21X4_RECEIVE_DESCRIPTOR
|
|
ProcessReceiveDescRing(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
PDC21X4_TRANSMIT_DESCRIPTOR
|
|
ProcessTransmitDescRing(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4EnableInterrupt(
|
|
IN NDIS_HANDLE MiniportAdapterContext
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4DisableInterrupt(
|
|
IN NDIS_HANDLE MiniportAdapterContext
|
|
);
|
|
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4ReturnPacket(
|
|
IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN PNDIS_PACKET Packet
|
|
);
|
|
|
|
|
|
// MEDIA.C
|
|
|
|
extern
|
|
BOOLEAN
|
|
DC21X4MediaDetect(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
BOOLEAN
|
|
DC2114Sense100BaseTxLink(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4DynamicAutoSense (
|
|
IN PVOID Systemspecific1,
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN PVOID Systemspecific2,
|
|
IN PVOID Systemspecific3
|
|
);
|
|
|
|
extern
|
|
BOOLEAN
|
|
DC21X4AutoSense (
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4SwitchMedia(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN LONG NextMedia
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4StartAutoSenseTimer(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN UINT Value
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4StopAutoSenseTimer(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4EnableNway(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4DisableNway(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
|
|
extern
|
|
VOID
|
|
DC21X4IndicateMediaStatus(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN UINT Status
|
|
);
|
|
|
|
|
|
// MACTOPHY.C
|
|
|
|
extern
|
|
BOOLEAN
|
|
DC21X4PhyInit(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
|
|
extern
|
|
BOOLEAN
|
|
DC21X4SetPhyConnection(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
|
|
void
|
|
SetMacConnection(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
|
|
extern
|
|
BOOLEAN
|
|
DC21X4MiiAutoDetect(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
|
|
extern
|
|
BOOLEAN
|
|
DC21X4MiiAutoSense(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
|
|
extern
|
|
VOID
|
|
SelectNonMiiPort(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4SetPhyControl(
|
|
PDC21X4_ADAPTER Adapter,
|
|
USHORT AdminControl
|
|
);
|
|
|
|
|
|
// MIIGEN.C
|
|
|
|
extern
|
|
BOOLEAN
|
|
MiiGenInit(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
BOOLEAN
|
|
FindAndInitMiiPhys(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
USHORT
|
|
MiiGenGetCapabilities(
|
|
PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
BOOLEAN
|
|
MiiGenCheckConnection(
|
|
PDC21X4_ADAPTER Adapter,
|
|
USHORT Connection
|
|
);
|
|
|
|
extern
|
|
BOOLEAN
|
|
MiiGenSetConnection(
|
|
PDC21X4_ADAPTER Adapter,
|
|
UINT Connection,
|
|
USHORT NwayAdvertisement
|
|
);
|
|
|
|
|
|
extern
|
|
BOOLEAN
|
|
MiiGenGetConnectionStatus (
|
|
PDC21X4_ADAPTER Adapter,
|
|
PUSHORT ConnectionStatus
|
|
);
|
|
|
|
|
|
extern
|
|
BOOLEAN
|
|
MiiGenGetConnection(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PUSHORT Connection
|
|
);
|
|
|
|
extern
|
|
void
|
|
MiiGenAdminStatus(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PUSHORT AdminStatus
|
|
);
|
|
|
|
|
|
extern
|
|
BOOLEAN
|
|
MiiGenAdminControl(
|
|
PDC21X4_ADAPTER Adapter,
|
|
USHORT AdminControl
|
|
);
|
|
|
|
|
|
void
|
|
MiiFreeResources(
|
|
PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
// MIIPHY.C
|
|
|
|
BOOLEAN
|
|
MiiPhyInit(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr
|
|
);
|
|
|
|
void
|
|
MiiPhyGetCapabilities(
|
|
PMII_PHY_INFO PhyInfoPTR,
|
|
PCAPABILITY Capabilities
|
|
);
|
|
|
|
BOOLEAN
|
|
MiiPhySetConnectionType(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
USHORT Connection,
|
|
USHORT Advertisement
|
|
);
|
|
|
|
BOOLEAN
|
|
MiiPhyGetConnectionType(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
PUSHORT ConnectionStatus
|
|
);
|
|
|
|
BOOLEAN
|
|
MiiPhyGetConnectionStatus(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
PUSHORT ConnectionStatus
|
|
);
|
|
|
|
void
|
|
MiiPhyAdminStatus(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
PMII_STATUS Status
|
|
);
|
|
|
|
void
|
|
MiiPhyAdminControl(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
MII_STATUS Control
|
|
);
|
|
|
|
BOOLEAN
|
|
MiiPhyReadRegister(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
USHORT RegNum,
|
|
PUSHORT Register
|
|
);
|
|
|
|
void
|
|
MiiPhyWriteRegister(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
USHORT RegNum,
|
|
USHORT Register
|
|
);
|
|
|
|
void
|
|
MiiPhyNwayGetLocalAbility(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
PCAPABILITY Ability
|
|
);
|
|
|
|
void
|
|
MiiPhyNwaySetLocalAbility(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
USHORT MediaBits
|
|
);
|
|
|
|
void
|
|
MiiPhyNwayGetPartnerAbility(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
PCAPABILITY Ability
|
|
);
|
|
|
|
|
|
BOOLEAN
|
|
FindMiiPhyDevice(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr
|
|
);
|
|
|
|
void
|
|
WriteMii(
|
|
PDC21X4_ADAPTER Adapter,
|
|
ULONG MiiData,
|
|
INT DataSize
|
|
);
|
|
|
|
void
|
|
MiiOutThreeState(
|
|
PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
void
|
|
InitPhyInfoEntries(
|
|
PMII_PHY_INFO PhyInfoPtr
|
|
);
|
|
|
|
void
|
|
ConvertConnectionToControl(
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
PUSHORT Connection
|
|
);
|
|
|
|
void
|
|
ConvertMediaTypeToNwayLocalAbility(
|
|
USHORT MediaType,
|
|
PCAPABILITY NwayLocalAbility
|
|
);
|
|
|
|
BOOLEAN
|
|
ConvertNwayToConnectionType(
|
|
CAPABILITY NwayReg,
|
|
PUSHORT Connection
|
|
);
|
|
|
|
BOOLEAN
|
|
CheckConnectionSupport(
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
USHORT ConCommand
|
|
);
|
|
|
|
|
|
extern
|
|
BOOLEAN
|
|
GetBroadcomPhyConnectionType(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr,
|
|
PUSHORT Connection
|
|
);
|
|
|
|
void
|
|
HandleBroadcomMediaChangeFrom10To100(
|
|
PDC21X4_ADAPTER Adapter,
|
|
PMII_PHY_INFO PhyInfoPtr
|
|
);
|
|
|
|
|
|
// MONITOR.C
|
|
|
|
extern
|
|
VOID
|
|
DC21X4ModerateInterrupt (
|
|
IN PVOID Systemspecific1,
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN PVOID Systemspecific2,
|
|
IN PVOID Systemspecific3
|
|
);
|
|
|
|
|
|
extern
|
|
BOOLEAN
|
|
DC21X4CheckforHang(
|
|
IN NDIS_HANDLE MiniportAdapterContext
|
|
);
|
|
|
|
|
|
// REGISTER.C
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4Initialize(
|
|
OUT PNDIS_STATUS OpenErrorStatus,
|
|
OUT PUINT SelectedMediumIndex,
|
|
IN PNDIS_MEDIUM MediumArray,
|
|
IN UINT MediumArraySize,
|
|
IN NDIS_HANDLE MiniportAdapterHandle,
|
|
IN NDIS_HANDLE ConfigurationHandle
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
FreeAdapterResources(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN INT Step
|
|
);
|
|
|
|
NDIS_STATUS
|
|
FindPciConfiguration(
|
|
IN NDIS_HANDLE MiniportAdapterHandle,
|
|
IN ULONG SlotNumber,
|
|
OUT PULONG PortStart,
|
|
OUT PULONG PortLength,
|
|
OUT PULONG InterruptLevel,
|
|
OUT PULONG InterruptVector
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4Halt(
|
|
IN NDIS_HANDLE MiniportAdapterContext
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4Shutdown(
|
|
IN PVOID ShutdownContext
|
|
);
|
|
|
|
#if _MIPS_
|
|
|
|
NTSTATUS
|
|
DC21X4HardwareSaveInformation(
|
|
IN PWSTR ValueName,
|
|
IN ULONG ValueType,
|
|
IN PVOID ValueData,
|
|
IN ULONG ValueLength,
|
|
IN PVOID Context,
|
|
IN PVOID EntryContext
|
|
);
|
|
|
|
BOOLEAN
|
|
DC21X4HardwareVerifyChecksum(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN PUCHAR EthernetAddress
|
|
);
|
|
|
|
NDIS_STATUS
|
|
DC21X4HardwareGetDetails(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN UINT Controller,
|
|
IN UINT MultifunctionAdapter
|
|
);
|
|
|
|
#endif
|
|
|
|
|
|
// REQUEST.C
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4QueryInformation(
|
|
IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG BytesWritten,
|
|
OUT PULONG BytesNeeded
|
|
);
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4SetInformation(
|
|
IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG BytesRead,
|
|
OUT PULONG BytesNeeded
|
|
);
|
|
|
|
// RESET.C
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4Reset(
|
|
OUT PBOOLEAN AddressingReset,
|
|
IN NDIS_HANDLE MiniportAdapterContext
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4DeferredReset(
|
|
IN PVOID Systemspecific1,
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN PVOID Systemspecific2,
|
|
IN PVOID Systemspecific3
|
|
);
|
|
|
|
// SEND.C
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4Send(
|
|
IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN PNDIS_PACKET Packet,
|
|
IN UINT Flags
|
|
);
|
|
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4SendPackets(
|
|
IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN PPNDIS_PACKET PacketArray,
|
|
IN UINT NumberOfPackets
|
|
);
|
|
|
|
|
|
extern
|
|
ULONG
|
|
CRC32 (
|
|
IN PUCHAR Data,
|
|
IN UINT Len
|
|
);
|
|
|
|
//SROM.C
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
DC21X4ReadSerialRom (
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
BOOLEAN
|
|
VerifyChecksum(
|
|
IN UNALIGNED UCHAR *EthAddress
|
|
);
|
|
|
|
NDIS_STATUS
|
|
DC21X4ParseSRom(
|
|
IN PDC21X4_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4ParseExtendedBlock(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN OUT UNALIGNED UCHAR **MediaBlock,
|
|
IN USHORT GeneralPurposeCtrl,
|
|
OUT PUCHAR PMediaCode
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
DC21X4ParseFixedBlock(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN OUT UNALIGNED UCHAR **MediaBlock,
|
|
IN USHORT GeneralPurposeCtrl,
|
|
OUT PUCHAR PMediaCode
|
|
);
|
|
|
|
BOOLEAN
|
|
DC21X4ReadSRom(
|
|
IN PDC21X4_ADAPTER Adapter,
|
|
IN OUT PULONG Offset,
|
|
IN USHORT Len,
|
|
OUT PUCHAR Buffer
|
|
);
|
|
|
|
|
|
|
|
|