#ifndef RQERRORS_H
#define RQERRORS_H

#include "RQEnums.h"
#include "RQConstants.h"

#ifdef __cplusplus
extern "C" {
#endif

// In the RQ_ReturnCode types we use the following convention:
// low 8 bits = specific error value from this function
// next 8 bits = function returning error
// next 8 bits = SDK number
// top 8 bits reserved, currently always zero
// SDK values are:
// 0 = RQ
// 1 = pulser/receiver
// 2 = HLSDK 
// 3 = RQT - threading dll
// 4 = RQ3D - three D dll

typedef enum
{
	RQ_OK											= 0x00000000,
	RQ_InvalidCardNumber							= 0x00000001,

	RQ_Initialise_AlreadyInitialised				= 0x00000100,
	RQ_Initialise_FindPCIDeviceFail					= 0x00000101,
	RQ_Initialise_PCIDeviceOpenFail					= 0x00000102,
	RQ_Initialise_PCIBarMapFail						= 0x00000103,
	RQ_Initialise_PCICommonBufferPropertiesFail		= 0x00000104,
	RQ_Initialise_PCICommonBufferMapFail			= 0x00000105,
	RQ_Initialise_SampleClockNotStabilised			= 0x00000106,
	RQ_Initialise_FirmwareVersionDoesNotMatchFileName = 0x00000107,
	RQ_Initialise_FirmwareVersionTooOld,


	RQ_Calibrate_OffsetComputationFail				= 0x00000200,
	RQ_Calibrate_GainComputationFail				= 0x00000201,
	RQ_Calibrate_OutOfMemory						= 0x00000202,

	RQ_Uninitialise_IsInitialisedFail				= 0x00000300,
	RQ_Uninitialise_IsPCIInitialisedFail			= 0x00000301,
	RQ_Uninitialise_PCIBarUnmapFail					= 0x00000302,
	RQ_Uninitialise_PCIDeviceCloseFail				= 0x00000303,
	
	RQ_OpenDMAChannel_IsPCIInitialisedFail			= 0x00000400,
	RQ_OpenDMAChannel_DMAChannelAlreadyOpen			= 0x00000401,
	RQ_OpenDMAChannel_PCIDmaBlockChannelOpenFail	= 0x00000402,
	
	RQ_CloseDMAChannel_IsPCIInitialisedFail			= 0x00000500,
	RQ_CloseDMAChannel_IsDMAChannelOpenFail			= 0x00000501,
	RQ_CloseDMAChannel_PCIDmaBlockChannelCloseFail	= 0x00000502,
	
	RQ_PerformDMATransfer_IsPCIInitialisedFail		= 0x00000600,
	RQ_PerformDMATransfer_IsDMAChannelOpenFail		= 0x00000601,
	RQ_PerformDMATransfer_PCIDmaBlockTransferFail	= 0x00000602,
	
	RQ_DumpBinFiles_SamplingFirmwareOpenFail		= 0x00000700,
	RQ_DumpBinFiles_PeripheralFirmwareOpenFail		= 0x00000701,
	RQ_DumpBinFiles_SamplingFirmwareReadFail		= 0x00000702,
	RQ_DumpBinFiles_SamplingFirmwareCloseFail		= 0x00000703,
	RQ_DumpBinFiles_PeripheralFirmwareReadFail		= 0x00000704,
	RQ_DumpBinFiles_PeripheralFirmwareCloseFail		= 0x00000705,

	RQ_SetSamplingFrequency_InvalidFrequency		= 0x00000800,

	RQ_GetSamples_PerformDMATransferFail			= 0x00000906,
	RQ_GetSamples_InvalidHeader						= 0x00000907,

	RQ_SetRegister_IsPCIInitialisedFail				= 0x00000a00,
	RQ_SetRegister_OffsetOutOfRange					= 0x00000a01,

	RQ_GetRegister_IsPCIInitialisedFail				= 0x00000b00,
	RQ_GetRegister_OffsetOutOfRange					= 0x00000b01,

	RQ_SetSystemRegister_OutOfRange					= 0x00000c00,

	RQ_GetSystemRegister_OutOfRange					= 0x00000d00,

	RQ_SetSamplingRegister_OutOfRange				= 0x00000e00,

	RQ_GetSamplingRegister_OutOfRange				= 0x00000f00,

	RQ_SetPeripheralRegister_OutOfRange				= 0x00001000,

	RQ_GetPeripheralRegister_OutOfRange				= 0x00001100,

	RQ_GetSRAMLong_OffsetOutOfRange					= 0x00001200,

	RQ_GetSamplingSystemIRQFlag_InvalidSamplingSystemIndex	= 0x00001300,

	RQ_SetCurvedGateData_InvalidFirmwareVersion		= 0x00001400,
	RQ_SetCurvedGateData_InvalidThresholdValue		= 0x00001401,
	RQ_SetCurvedGateData_OutOfMemory				= 0x00001402,

	RQ_GetNumberOfBScansInSRAM_NoDataAvailable		= 0x00001600,

	RQ_SetRectifierMode_InvalidMode					= 0x00001700,

	RQ_SetStartDelay_InvalidDelay					= 0x00001800,

	RQ_SetTriggerSelect_InvalidTrigger				= 0x00001900,

	RQ_SetNumberOfSamples_InvalidNumberOfSamples	= 0x00001a00,

	RQ_SetDropNumberOfSamples_InvalidNumberOfSamples= 0x00001b00,

	RQ_SetSampleStorageMode_InvalidStorageMode		= 0x00001c00,

	RQ_SetForceAScanTrigger_InvalidTriggerSource	= 0x00001d00,

	RQ_SetDDSRegister_InvalidRegisterValue			= 0x00001e00,
	RQ_SetDDSRegister_InvalidAddressBusValue		= 0x00001e01,

	RQ_SetTCGTriggerGate_InvalidGateIndex			= 0x00001f00,

	RQ_DDSWait_QueryTimerFail						= 0x00002000,
	RQ_DDSWait_TimeOut								= 0x00002001,

	RQ_SetTCGEnable_InvalidFlag						= 0x00002100,
	RQ_SetTCGEnable_NoTCGCurve						= 0x00002101,

	RQ_GetTCGTriggerGate_InvalidTriggerFlags		= 0x00002200,

	RQ_SetRequestEarlySampleData_DataFullError		= 0x00002400,
	RQ_SetRequestEarlySampleData_OneBankAlreadyFull,
	RQ_SetRequestEarlySampleData_NoEarlySampleData,	

	RQ_SetCScanBaseSRAMAddress_InvalidAddress		= 0x00002500,

	RQ_SetScanStorageOptions_InvalidStorageOptions	= 0x00002600,

	RQ_SetNumberOfBScansPerBankInternal_InvalidNumber = 0x00002700,
	RQ_SetNumberOfBScansPerBank_Automatic			= 0x00002701,

	RQ_SetNumberOfAScansPerBScan_InvalidNumber		= 0x00002800,

	RQ_SetTCGValues_InvalidNumberOfValues			= 0x00002900,
	RQ_SetTCGValues_InvalidValue					= 0x00002901,
	RQ_SetTCGValues_OutOfMemory						= 0x00002902,

	RQ_SetInputCoupling_InvalidCoupling				= 0x00002a00,

	RQ_SetInputImpedance_InvalidInputImpedance		= 0x00002b00,

	RQ_SetAnalogueInput_InvalidAnalogueInput		= 0x00002c00,

	RQ_GetAnalogueInput_InvalidInputFlags			= 0x00002d00,

	RQ_SetAnalogueInputRange_InvalidAnalogueGain	= 0x00002e00,
	RQ_SetAnalogueInputRange_InvalidGainFlags		= 0x00002e01,

	RQ_SetAToDOutputPortFormat_InvalidPortFormat	= 0x00002f00,
	RQ_SetAToDOutputDataFormat_InvalidDataFormat	= 0x00002f01,

	RQ_SetAToDInputVoltageRange_InvalidInputVoltageRange			= 0x00003000,

	RQ_SetAToDVrefInputCharacteristics_InvalidInputCharacteristics	= 0x00003100,

	RQ_SetDDSKEY_InvalidDDSKEY							= 0x00003200,
	RQ_SetDDSKEY_InvalidDDSFSK							= 0x00003201,

	RQ_SetCalibrationVoltage_InvalidCalibrationVoltage	= 0x00003300,

	RQ_SetAuxInput_InvalidAuxInput						= 0x00003400,

	RQ_SetDynamicImagingData_InvalidData				= 0x00003500,

	RQ_SetDynamicImagingDSELECT_InvalidDSELECT			= 0x00003600,

	RQ_SetDynamicImagingAPER_InvalidAPER				= 0x00003700,

	RQ_SetDynamicImagingDATACLK_InvalidDATACLK			= 0x00003800,

	RQ_SetTransducerPulseWidth_InvalidFirmwareVersion	= 0x00003900,
	RQ_SetTransducerPulseWidth_InvalidWidth				= 0x00003901,

	RQ_GetTransducerPulseWidth_InvalidFirmwareVersion	= 0x00003a00,

	RQ_SetCalibrationOffset_InvalidDToAWord				= 0x00003b00,
	RQ_SetCalibrationOffset_TimerFail					= 0x00003b01,
	RQ_SetCalibrationOffset_TimeOut						= 0x00003b02,

	RQ_SetCalibrationGain_InvalidDToAWord				= 0x00003c00,
	RQ_SetCalibrationGain_TimerFail						= 0x00003c01,
	RQ_SetCalibrationGain_TimeOut						= 0x00003c02,

	RQ_SetCalibrationDToADestination_InvalidDestination						= 0x00003d00,

	RQ_SetNumberOfPeriodsBetweenAScanTriggers_InvalidNumberOfPeriods		= 0x00003e00,

	RQ_SetNumberOfOversamples_InvalidnumberOfOversamples					= 0x00003f00,

	RQ_SetSensorArrayNumberOfElements_InvalidNumberOfElements				= 0x00004000,

	RQ_SetSensorArrayApertureSize_InvalidApertureSize						= 0x00004100,

	RQ_SetSensorArrayDIUnitEnableOutputs_InvalidFirmwareVersion				= 0x00004200,
	RQ_SetSensorArrayDIUnitEnableOutputs_InvalidEnableFlag					= 0x00004201,
	RQ_GetSensorArrayDIUnitEnableOutputs_InvalidFirmwareVersion				= 0x00004202,

	RQ_SetSensorArrayDisableAperturePositionWrites_InvalidFirmwareVersion	= 0x00004300,
	RQ_SetSensorArrayDisableAperturePositionWrites_InvalidEnableFlag		= 0x00004301,
	RQ_GetSensorArrayDisableAperturePositionWrites_InvalidFirmwareVersion	= 0x00004302,

	RQ_SetSensorArrayDisableApertureDelayWrites_InvalidFirmwareVersion		= 0x00004400,
	RQ_SetSensorArrayDisableApertureDelayWrites_InvalidEnableFlag			= 0x00004401,
	RQ_GetSensorArrayDisableApertureDelayWrites_InvalidFirmwareVersion		= 0x00004402,

	RQ_SetIsBScanModeEnabled_InvalidFirmwareVersion				= 0x00004500,

	RQ_SetIsBScanModeEnabled_InvalidFlag						= 0x00004600,

	RQ_SetPingPongSequenceElement_InvalidElementNumber			= 0x00004700,
	RQ_SetPingPongSequenceElement_InvalidSequencePosition		= 0x00004701,
	RQ_SetPingPongSequenceElement_OutOfMemory					= 0x00004702,

	RQ_SetNumberOfEncoderClicksPerBScan_InvalidNumberOfClicks	= 0x00004800,

	RQ_SetForceBScanTrigger_InvalidTriggerSource				= 0x00004900,
	RQ_SetForceBScanTrigger_QueryTimerFail						= 0x00004901,
	RQ_SetForceBScanTrigger_Timeout								= 0x00004902,

	RQ_SetEncoderSelect_InvalidEncoderIndex						= 0x00004a00,

	RQ_SetResetEncoderOutput_InvalidEncoderIndex				= 0x00004b00,

	RQ_GetEncoderOutput_InvalidEncoderIndex						= 0x00004c00,

	RQ_AddGate_InvalidStartCount			= 0x00004d00,
	RQ_AddGate_InvalidEndCount				= 0x00004d01,
	RQ_AddGate_InvalidThreshold				= 0x00004d02,
	RQ_AddGate_InvalidTriggerIndex			= 0x00004d03,
	RQ_AddGate_InvalidThresholdPolarity		= 0x00004d04,
	RQ_AddGate_InvalidTriggerMode			= 0x00004d05,
	RQ_AddGate_InvalidDistanceMetric		= 0x00004d06,
	RQ_AddGate_InvalidEnable				= 0x00004d07,
	RQ_AddGate_InvalidAmplitudePeakSelect	= 0x00004d08,
	RQ_AddGate_InvalidDistancePeakSelect	= 0x00004d09,
	RQ_AddGate_InvalidGateIndex				= 0x00004d0a,
	RQ_AddGate_QueryTimerFail				= 0x00004d0b,
	RQ_AddGate_SetupTimeOut					= 0x00004d0c,
	RQ_AddGate_InvalidStoreGateValue		= 0x00004d0d,
	RQ_AddGate_InvalidZeroCrossingTrigMode	= 0x00004d0e,
	RQ_AddGate_RQ_ZCTMEnabledOnlyValidForSequenceCompatibleFirmware = 0x00004d0f,
	RQ_AddGate_RQ_SGVAlwaysNeedsLargestPeakSelected = 0x00004d10,
	RQ_AddGate_RQ_ZCTMEnabledNotValidForRQ_GDMPeak	= 0x00004d11, 
	RQ_AddGate_InvalidSnapshotSelection		= 0x00004d12,

	RQ_RemoveGate_InvalidIndex				= 0x00004e00,
	RQ_RemoveGate_GateDoesNotExist			= 0x00004e01,

	RQ_GetGate_InvalidIndex					= 0x00004f00,

	RQ_GetGateOutput_InvalidBScanIndex		= 0x00005000,
	RQ_GetGateOutput_InvalidAScanIndex		= 0x00005001,
	RQ_GetGateOutput_GateIsNotPresent		= 0x00005002,
	RQ_GetGateOutput_GateIsNotEnabled		= 0x00005003,

	RQ_SetValue_InvalidPropertyName			= 0x00005100,

	RQ_LoadFPGAFromFile_ReadError							= 0x00005200,
	RQ_LoadFPGAFromFile_OversizedStringLength				= 0x00005201,

	RQ_LoadGatesFromFile_OversizedStringLength				= 0x00005300,
	RQ_LoadGatesFromFile_ReadError							= 0x00005301,

	RQ_LoadTCGCurveFromFile_OversizedStringLength			= 0x00005400,
	RQ_LoadTCGCurveFromFile_InvalidIndex					= 0x00005401,
	RQ_LoadTCGCurveFromFile_InvalidTCGValue					= 0x00005402,
	RQ_LoadTCGCurveFromFile_InvalidIndexPrefix				= 0x00005403,
	RQ_LoadTCGCurveFromFile_ReadError						= 0x00005404,

	RQ_LoadPingPongSequenceFromFile_OversizedStringLength	= 0x00005500,
	RQ_LoadPingPongSequenceFromFile_InvalidSequenceIndex	= 0x00005501,
	RQ_LoadPingPongSequenceFromFile_InvalidElementIndex		= 0x00005502,
	RQ_LoadPingPongSequenceFromFile_InvalidIndexPrefix		= 0x00005503,
	RQ_LoadPingPongSequenceFromFile_ReadError				= 0x00005504,

	RQ_LoadCurvedGateDataFromFile_OversizedStringLength		= 0x00005600,
	RQ_LoadCurvedGateDataFromFile_InvalidSequencePosition	= 0x00005601,
	RQ_LoadCurvedGateDataFromFile_ReadError					= 0x00005602,
	RQ_LoadCurvedGateDataFromFile_InvalidValue				= 0x00005603,
	RQ_LoadCurvedGateDataFromFile_InvalidIndexPrefix		= 0x00005604,

	RQ_LoadState_CannotOpenFile							= 0x00005700,
	RQ_LoadState_CannotReadFromFile						= 0x00005701,
	RQ_LoadState_OversizedSectionHeaderStringLength		= 0x00005702,
	RQ_LoadState_CannotCloseFile						= 0x00005703,
	RQ_LoadState_MissingSystemParameters				= 0x00005704,
	RQ_LoadState_MissingSamplingParameters				= 0x00005705,
	RQ_LoadState_MissingPeripheralParameters			= 0x00005706,
	RQ_LoadState_MissingGates							= 0x00005707,
	RQ_LoadState_MissingTCG								= 0x00005708,
	RQ_LoadState_MissingPingPong						= 0x00005709,
	RQ_LoadState_MissingCurvedGate						= 0x0000570a,
	RQ_SaveState_CannotCreateFile						= 0x0000570b,
	RQ_SaveState_CannotWriteToFile						= 0x0000570c,
	RQ_SaveState_CannotCloseFile						= 0x0000570d,
	RQ_SaveState_CannotDeleteInvalidFile				= 0x0000570e,
	RQ_SaveState_MissingTCG								= 0x0000570f,
	RQ_SaveState_MissingPingPong						= 0x00005710,
	RQ_SaveState_MissingCurvedGate						= 0x00005711,

	RQ_SetFocusingUnitControl_InvalidFirmwareVersion	= 0x00005800,
	RQ_SetFocusingUnitControl_InvalidControlBus			= 0x00005801,
	RQ_SetFocusingUnitControl_InvalidData				= 0x00005802,
	RQ_SetFocusingUnitControl_QueryTimerFail			= 0x00005803,
	RQ_SetFocusingUnitControl_TimeOut					= 0x00005804,

	RQ_HandleSRAM_InsufficientSRAM						= 0x00005900,

	RQ_CheckSRAM_InsufficientSRAM						= 0x00005a00,

    RQ_GetBScan_NoBScansStored							= 0x00005b00,
	RQ_GetBScan_InternalDataFormatError					= 0x00005b07,
	RQ_GetBScan_InvalidNumberOfBScansPerBank			= 0x00005b08,

	RQ_GetRawScan_MemoryAllocationFail					= 0x00005c06,
	RQ_GetRawScan_OutOfMemory							= 0x00005c07,
	RQ_GetRawScan_InternalDataFormatError				= 0x00005c08,
	RQ_GetRawScan_AScanDesynchronisation				= 0x00005c09,
	RQ_GetRawScan_CRCSubSystemInternalError				= 0x00005c0a,
	RQ_GetRawScan_InvalidNumberOfAScanSamples			= 0x00005c0b,
	RQ_GetRawScan_InvalidNumberOfBScansInBank			= 0x00005c0c,
	RQ_GetRawScan_InvalidNumberOfAScansPerBScan			= 0x00005c0d,
	RQ_GetRawScan_CScanDesynchronisation				= 0x00005c0e,
	RQ_GetRawScan_NotSupportedOnSequencedFPGA			= 0x00005c0f,
	RQ_GetRawScan_NotAllBlocksDMAOK						= 0x00005c10,
	RQ_GetRawScan_RawScanNotLargeEnoughForData			= 0x00005c11,
	
	RQ_FreeRawScanData_MissingRawScan					= 0x00005d00,
	RQ_FreeRawScanData_InvalidMode						= 0x00005d01,
	RQ_FreeRawScanData_MissingData						= 0x00005d02,

	RQ_SetAcquisitionMode_InvalidMode					= 0x00006000,

	RQ_StructuresInitialise_OutOfMemory					= 0x00006300,
	
	RQ_SetFlipArray_InvalidNumberOfElements				= 0x00006400,

	//RQ_PeripheralIOBank1_UnsupportedFirmwareVersion		= 0x00006500,  // SDK only works with FW new enough to have IO Bank 1

	RQ_SetScanningMode_InvalidMode						= 0x00006600,

	RQ_SetDigitalOutput_InvalidBit						= 0x00006700,

	RQ_SetSeqenceStep_NotSequenceCompatibleFirmware		= 0x00006800, 
	RQ_SetSeqenceStep_StepGreaterThanMax				= 0x00006801, 

	RQ_GetSeqenceStep_NotSequenceCompatibleFirmware		= 0x00006900, 

	RQ_SetStepsInSequence_NotSequenceCompatibleFirmware	= 0x00007000, 
	RQ_SetStepsInSequence_StepOutOfRange				= 0x00007001, 

	RQ_GetStepsInSequence_NotSequenceCompatibleFirmware	= 0x00007100, 

	RQ_StartSequence_NotSequenceCompatibleFirmware		= 0x00007200, 

	RQ_StopSequence_NotSequenceCompatibleFirmware		= 0x00007300, 

	RQ_SetTCGNormalisedStart_InvalidTCGModeMask			= 0x00007400, 
	RQ_SetTCGNormalisedStart_TCGPointRatio				= 0x00007401, 
	
	RQ_SetGateAttributesRegister_BadDistanceMetric      = 0x00007500, 

	RQ_FetchRawScanBytes_PCIDmaBlockTransferFail		= 0x00007602,

	RQ_WaitForBankSwap_QueryTimerFail					= 0x00007700,
	RQ_WaitForBankSwap_MissingTrigger,						
	RQ_WaitForBankSwap_DataFull,						
	RQ_WaitForBankSwap_TriggerOccurredBeforeProcessComplete,
	RQ_WaitForBankSwap_SampleIncomplete,
	RQ_WaitForBankSwap_TimeOut,					

	RQ_Alloc_OutOfMemory									= 0x00007800,

	RQ_ReturnBoardStatePointer_InvalidCardIndex				= 0x00007900,

	RQ_SetHook_NoHooksLeft									= 0x00008000,
	
	RQ_ReadRawScanBlocks_IsPCIInitialisedFail				= 0x00008100,
	RQ_ReadRawScanBlocks_IsDMAChannelOpenFail,
	RQ_ReadRawScanBlocks_BadBlockCRC,
	
	RQ_SetMaximumNumberOfBScansPerBank_NotAutomatic			= 0x00008200, 
	RQ_SetMaximumNumberOfBScansPerBank_NotEnoughRapiDAQMemory,

	RQ_SetSyncPuleMode_InvalidMode							= 0x00009000,

	RQ_SetFractionalNumberOfEncoderClicksPerBScan_InvalidNumerator
															= 0x00009100,

	// Was in offline enums ...

	//RQOffline_Extract_OK									= 0x00000000,
	RQOffline_ExtractAScan_InvalidBScanIndex				= 0x0000a000,
	RQOffline_ExtractAScan_InvalidAScanIndex				= 0x0000a001,
	RQOffline_ExtractAScan_InternalDataFormatError			= 0x0000a002,
	RQOffline_ExtractAScan_AScanDesynchronisation			= 0x0000a003,
	RQOffline_ExtractAScan_RawScanDoesNotContainAScanData	= 0x0000a007,

	RQOffline_ExtractBScan_InvalidBScanIndex				= 0x0000a104,
	RQOffline_ExtractBScan_InternalDataFormatError			= 0x0000a105,
	RQOffline_ExtractBScan_AScanDesynchronisation			= 0x0000a106,
	RQOffline_ExtractBScan_RawScanDoesNotContainBScanData	= 0x0000a108,

	RQOffline_ExtractCScan_InvalidBScanBounds				= 0x0000a200,
	RQOffline_ExtractCScan_MissingCScan						= 0x0000a201,
	RQOffline_ExtractCScan_InvalidGate						= 0x0000a202,
	RQOffline_ExtractCScan_InvalidRPNSequence				= 0x0000a203,
	RQOffline_ExtractCScan_OutOfMemory						= 0x0000a204,
	RQOffline_ExtractCScan_RawScanDoesNotContainGateData	= 0x0000a205,
	RQOffline_ExtractCScan_CScanDesynchronisation			= 0x0000a206,
	RQOffline_ExtractCScan_InternalDataFormatError			= 0x0000a207,
	RQOffline_ExtractCScan_NotCompatibleWithSequencedFPGA   = 0x0000a208,

	RQOffline_ExtractGateValues_InvalidBScanIndex			= 0x0000a300,
	RQOffline_ExtractGateValues_InvalidAScanIndex			=  0x0000a301,
	RQOffline_ExtractGateValues_RawScanDoesNotContainGateData  = 0x0000a302,

	RQOffline_ExtractEncoderValue_MissingEncoderValues		= 0x0000a400,
	RQOffline_ExtractEncoderValue_InvalidBScanIndex			= 0x0000a401,
	RQOffline_ExtractEncoderValue_InvalidEncoderIndex		= 0x0000a402,
	RQOffline_ExtractEncoderValue_RawScanDoesNotContainEncoderData = 0x0000a403,
	
	RQ_SetBScanRepetitionRate_RateTooHighForAScanRate		= 0x0000a500,
	RQ_SetIsDiagnosticMode_GeneralError						= 0x0000a600,

	RQ_LastError
} RQ_ReturnCode ;


RQ_API const char * CALL_CONV RQ_GetCodeString(int errorCode);

#ifdef __cplusplus
}
#endif

#endif
